我在 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 平面框架?