iOS 视频:可能有超过 4 个同时的 AVAssetReader?

Posted

技术标签:

【中文标题】iOS 视频:可能有超过 4 个同时的 AVAssetReader?【英文标题】:iOS Video: More than 4 simultaneous AVAssetReaders possible? 【发布时间】:2011-05-19 14:51:58 【问题描述】:

我想同时在多个视图上渲染多个 H264 mp4 视频。目标是阅读大约 8 个短视频,每个短视频的大小为 100x100 像素,并让它们同时在屏幕上的多个位置显示其内容。

想象屏幕上有 24 个方块,每个方块显示 8 个视频中的一个。

MoviePlayer 不起作用,因为它只显示一个全屏视频。具有多个 AVPlayerLayers 的 AVPlayer 是有限的,因为只有 最近创建的图层会在屏幕上显示其内容(根据文档和我的测试)。

所以,我编写了一个简短的视频类,并为我的包中的每个 .mp4 文件创建了一个实例,使用 AVAssetReader 来读取它的内容。更新时,每个视频帧都会根据视频的帧速率被转换为 UIImage 并显示。此外,这些图像被缓存以便在循环时快速访问。

- (id) initWithAsset:(AVURLAsset*)asset withTrack:(AVAssetTrack*)track

    self = [super init];
    if (self)
    
        NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], (NSString*)kCVPixelBufferPixelFormatTypeKey, nil];

        mOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:track outputSettings:settings];
        mReader = [[AVAssetReader alloc] initWithAsset:asset error:nil];

        [mReader addOutput:mOutput];

        BOOL status = [mReader startReading];
    

    return self;



- (void) update:(double)elapsed

  CMSampleBufferRef buffer = [mOutput copyNextSampleBuffer];

  if (buffer) 
  
    UIImage* image = [self imageFromSampleBuffer:sampleBuffer];
  

  [...]

实际上这很有效,但仅适用于 4 个视频。第五个从来没有出现过。首先我想到了内存问题,但我在以下设备上进行了测试:

iPhone 3GS iPhone 4 iPad iPad 2

我在每台设备上都有相同的行为:4 个视频以流畅的循环播放,没有差异。

如果这是内存问题,我希望 iPad 2 至少显示 5 或 6 个视频(由于它的硬件更好)或 3GS 仅显示 1 个或某处崩溃。

不过,模拟器会显示所有视频。

在设备上调试显示,

BOOL status = [mReader startReading]; 

为视频 5、6、7 和 8 返回 false。

那么,是否有某种硬件设置(或限制)不允许同时超过 4 个 AVAssetReader?因为,我无法真正解释这种行为。我认为并非所有设备都具有完全相同数量的视频内存。

【问题讨论】:

这更可能是 H.264 解码芯片的限制而不是显存。 你解决了这个问题吗?我正在经历同样的行为 【参考方案1】:

是的,ios 对一次可解码的视频数量有上限。虽然您的方法很好,但我不知道有什么方法可以解决这个上限,只要同时激活那么多 h.264 解码器。如果您有兴趣,请看一下我对这个问题的解决方案,这是一个名为Fireworks 的xcode 项目。基本上,这个演示展示了将一堆 alpha 通道视频解码到磁盘,然后通过将一部分视频文件映射到内存来播放每个视频。这种方法可以同时解码超过 4 部电影,而不会耗尽所有系统内存,也不会遇到 h.264 解码器对象数量的硬限制。

【讨论】:

【参考方案2】:

您是否尝试过基于相同的 AVAsset 为每个 AVPlayerLayer 创建单独的 AVPlayerItem?

【讨论】:

【参考方案3】:

这是我最新的完美平滑滚动集合视图,带有实时视频预览(一次最多 16 个):

https://youtu.be/7QlaO7WxjGg

它甚至使用封面流自定义布局和完美反映视频预览的“反射”视图。源代码在这里:

http://www.mediafire.com/download/ivecygnlhqxwynr/VideoWallCollectionView.zip

【讨论】:

以上是关于iOS 视频:可能有超过 4 个同时的 AVAssetReader?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 多个播放器同时播放,双击全屏,单击退出全屏

如何在 iOS 中下载多个背景视频?

如何用ffmpeg制作马赛克,而不会同时播放每个视频?

在一个 tcp 连接中,一个服务器怎么可能同时处理超过 65535 个客户端呢?

IOS多线程之NSOperation

是否可以在同一视图中同时播放 2 个视频文件?