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



我在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它是相对容易设置GWorld与kYUV420PixelFormat,有电影渲染到它,它只是工作。但是旧的QuickTime调用是遗留的,弃用的调用,不再使用…

我该怎么做才能得到YUV420平面帧而不进行不必要的转换?

根据一个老苹果邮件列表上的这个帖子,我想说这至少在过去是不可能的。我现在正试图找出是否可以用较低级别的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 ?我这里不需要速度(这是一次性的,一帧操作)。

2008年11月7日,QuickTime Engineering的Tim Monroe回应:

目前没有办法做你想通过frameImageAtTime。我建议提交一个增强请求。

相关内容

  • 没有找到相关文章

最新更新