iOS视频:可以同时使用4个以上的AVAssetReader吗?

时间:2011-05-19 14:51:58

标签: iphone objective-c ios ipad video

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

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

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

所以,我写了一个简短的视频类,并为我的包中的每个.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个同时AVAssetReaders?因为,我无法真正解释这种行为。我不认为所有设备都具有完全相同的视频内存量。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

https://youtu.be/7QlaO7WxjGg

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

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