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?的主要内容,如果未能解决你的问题,请参考以下文章