【发布时间】:2011-08-05 21:01:33
【问题描述】:
我在 QTKit 中打开了 QTMovie。
我需要以 YV12 格式 (kYUV420PixelFormat) 实时获取此视频的每一帧(即,我将其传递给仅接受 YV12 并需要播放视频的外国代码实时)。
似乎应该做的方式是调用 [movie frameImageAtTime: [movie currentTime] withAttributes: error: ] 为当前帧,然后 [电影 stepForward] 进入下一帧,依此类推,直到我得到所有帧。然而,就我的研究而言,我找不到让 QTKit 以 YV12 格式或任何其他 YUV 格式为我提供数据的方法。 frameImageAtTime: 调用可以将其转换为:
- NSImage(但 NSImage 不能存储平面 YUV),
- CGImage(同样的东西),
- CIImage(同样的东西),
- CVPixelBuffer(这个可以存储YUV,但是好像没办法配置调用从中获取YUV,默认返回ARGB32数据)
- OpenGL 纹理(这可能也可以配置,但我在 OpenGL 中不需要这些数据,我需要在内存中)
因此,使用这种据称是新的和优化的 QTKit 技术的唯一方法似乎是从中获取 ARGB 数据,使用自定义代码将每一帧转换为 YV12,并希望它仍然足够快以用于实时。还是我错过了什么?
在旧的 QuickTime 中,使用 kYUV420PixelFormat 设置 GWorld 相对容易,并对其进行电影渲染,并且 可以正常工作。但是旧的 QuickTime 调用是遗留的、已弃用的调用,不再使用......
我应该怎么做才能在没有不必要的转换的情况下获得 YUV420 平面框架?
【问题讨论】:
-
最后,我采用了“不再使用的旧的、已弃用的方式”,通过使用 GWorldPtrs 可以轻松获得 30 fps。向后兼容性或 Apple 技术 - 选择一个。
标签: macos quicktime qtkit core-video