从QuickTime电影中以YV12(YUV420)格式提取所有视频帧的实时方法?

时间:2011-04-14 20:36:30

标签: macos quicktime qtkit core-video

我在QTKit中打开了QTMovie。

我需要以YV12格式( kYUV420PixelFormat )实时获取此视频的每一帧(即我将其传递给只接受YV12且需要播放视频的外国代码实时)。

似乎应该完成的方式是为当前帧调用 [movie frameImageAtTime:[movie currentTime] withAttributes:error:] ,然后 [movie stepForward] 到达下一帧,依此类推,直到我得到所有帧。然而,就我所研究的那样,我找不到让QTKit给我YV12格式或任何其他YUV格式数据的方法。 frameImageAtTime:调用可将其转换为:

  • NSImage(但NSImage无法存储平面YUV),
  • CGImage(同样的事),
  • CIImage(同样的事),
  • CVPixelBuffer(这个可以存储YUV,但似乎无法配置调用从中获取YUV。默认情况下它会返回ARGB32数据)
  • OpenGL纹理(这可能也可以配置,但我在OpenGL中不需要这些数据,我需要它在内存中)

因此,似乎使用这种新的和优化的QTKit技术的唯一方法是从中获取ARGB数据,使用自定义代码将每个帧转换为YV12,并希望它仍然足够快速实时。或者我错过了什么?

在旧版QuickTime中,使用 kYUV420PixelFormat 设置GWorld相对容易,有电影呈现给它,而只是工作。但旧的QuickTime调用是遗留的,已弃用的调用,不再使用了......

如果没有不必要的转换,我该怎么做才能获得YUV420平面帧?

1 个答案:

答案 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做你想做的事。我建议提交增强请求。