我在QTKit中打开了QTMovie。
我需要以YV12格式( kYUV420PixelFormat )实时获取此视频的每一帧(即我将其传递给只接受YV12且需要播放视频的外国代码实时)。
似乎应该完成的方式是为当前帧调用 [movie frameImageAtTime:[movie currentTime] withAttributes:error:] ,然后 [movie stepForward] 到达下一帧,依此类推,直到我得到所有帧。然而,就我所研究的那样,我找不到让QTKit给我YV12格式或任何其他YUV格式数据的方法。 frameImageAtTime:调用可将其转换为:
因此,似乎使用这种新的和优化的QTKit技术的唯一方法是从中获取ARGB数据,使用自定义代码将每个帧转换为YV12,并希望它仍然足够快速实时。或者我错过了什么?
在旧版QuickTime中,使用 kYUV420PixelFormat 设置GWorld相对容易,有电影呈现给它,而只是工作。但旧的QuickTime调用是遗留的,已弃用的调用,不再使用了......
如果没有不必要的转换,我该怎么做才能获得YUV420平面帧?
答案 0 :(得分:0)
基于旧苹果邮件列表中的这个帖子,我会说这至少是不可能的。我现在正在尝试找出是否可以使用较低级别的API。
http://lists.apple.com/archives/quicktime-api/2008/Nov/msg00049.html
2008年11月5日下午12:08,Neil Clayton写道:
我想从电影中获取一个YUV帧(电影编码为 YUV,帧最初是k2vuyPixelFormat和编码器 格式将与之兼容 - 例如:H264或AIC等)。
当我这样做时:
NSError *error = nil;
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
QTMovieFrameImageTypeCVPixelBufferRef, QTMovieFrameImageType,
[NSNumber numberWithBool:YES], QTMovieFrameImageHighQuality,
nil];
CVPixelBufferRef buffer = [qtMovie frameImageAtTime:QTMakeTime(lastFrame, movie.timeScale)
withAttributes:dict error:&error];
框架显示有效。它有正确的宽度和高度。但它 我做的时候似乎是k32ARGBPixelFormat类型:
OSType type = CVPixelBufferGetPixelFormatType(buffer);
假设我这样做的方式不对 - 什么是正确的方法 从电影中获取k2vuyPixelFormat类型的帧? 或者,如果这是不可能的,那么执行RGB的最简单方法是什么? YUV转换为k2vuyPixelFormat类型的CVPixelBuffer?一世 这里不需要速度(这是一次性,一次帧操作)。
2000年11月7日,QuickTime Engineering的Tim Monroe回应:
目前没有办法通过frameImageAtTime做你想做的事。我建议提交增强请求。