我想在多个视图上同时渲染多个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个视频。第五个从未出现过。首先我想到了内存问题,但我在以下设备上进行了测试:
我在每台设备上都有相同的行为:4个视频以流畅的循环播放,没有差异。
如果这是一个内存问题,我预计至少iPad 2会显示5或6个视频(由于它的硬件更好)或3GS只能显示1或某个地方发生崩溃。
模拟器显示所有视频。
在设备上进行调试显示,
BOOL status = [mReader startReading];
对于视频5,6,7和8,返回false。
那么,是否有某种硬件设置(或限制)不允许超过4个同时AVAssetReaders?因为,我无法真正解释这种行为。我不认为所有设备都具有完全相同的视频内存量。
答案 0 :(得分:2)
是的,iOS对可以一次解码的视频数量有一个上限。虽然你的方法很好,但我不知道有什么方法可以解决这个上限,只要有多个h.264解码器同时处于活动状态。如果您有兴趣,请查看我对此问题的解决方案,这是一个名为Fireworks的xcode项目。基本上,这个演示显示将一堆alpha通道视频解码到磁盘,然后通过将一部分视频文件映射到内存来播放每个视频。这种方法可以同时解码4部以上的电影,而不会耗尽所有的系统内存,也不会遇到h.264解码器对象数量的硬限制。
答案 1 :(得分:0)
您是否尝试为每个AVPlayerLayer创建基于相同AVAsset的单独AVPlayerItem?
答案 2 :(得分:0)
这是我最新一次完美平滑滚动的集合视图,带有实时视频预览(一次最多16个):
它甚至使用封面流自定义布局和“反射”视图,完美地反映了视频预览。源代码在这里:
http://www.mediafire.com/download/ivecygnlhqxwynr/VideoWallCollectionView.zip