【发布时间】: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 解码芯片的限制而不是显存。
-
你解决了这个问题吗?我正在经历同样的行为
标签: iphone objective-c ios ipad video