iOSvideo:可以同时使用4个以上的AVAssetReader?

我想同时在多个视图上呈现多个H264 mp4video。 目标是读取约8个短video,每个video大小为100×100像素,并让他们同时在屏幕上的多个位置显示其内容。

想象一下屏幕上的24个方块,每个显示8个video池中的一个video。

MoviePlayer不起作用,因为它只显示一个全屏video。 具有多个AVPlayerLayers的AVPlayer是有限的,因为只有最近创build的图层才能在屏幕上显示它的内容 (根据文档和我的testing)。

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

- (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个video。 第五个从来没有出现。 首先我想到了内存问题,但我在以下设备上进行了testing:

  • iPhone 3GS
  • iPhone 4
  • iPad的
  • iPad 2

我在每个设备上都有相同的行为:4个video以平滑的循环播放,没有差异。

如果这是一个内存问题,我会期望至lessiPad 2显示5或6个video(由于它是更好的硬件),或3GS只显示1或崩溃的地方。

虽然模拟器显示所有video。

在设备上进行debugging显示

 BOOL status = [mReader startReading]; 

video5,6,7和8返回false。

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

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

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

这是我最新的一个非常stream畅的滚动collections视图迭代实时video预览(一次最多16个):

https://youtu.be/7QlaO7WxjGg

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

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