我正在使用 QTPixelBufferContextCreate 和当前电影的本机大小创建一个像素缓冲区。然后在上下文中打开电影并提示所需的帧,使用 QTVisualContextIsNewImageAvailable 进行检查。然后调用 QTVisualContextCopyImageForTime 回读帧以进一步基于 cpu 的图像处理。
对于使用 k32ARGBPixelFormat 或 k422YpCbCr8CodecType 作为 kCVPixelBufferPixelFormatTypeKey 的所有电影分辨率,这一切都运行良好。
现在我将 kCVPixelBufferPixelFormatTypeKey 切换到 k422YpCbCr10CodecType 或 k64ARGBPixelFormat 并且 QTVisualContextCopyImageForTime 对于某些较大的电影分辨率失败。QTPixelBufferContextCreate 有效并且 QTVisualContextIsNewImageAvailable 说有一个可用的框架。
解码宽度小于 1280 的电影都可以(720、960、1216 等)。
解码更宽的电影时,如 1280 或 1920 QTVisualContextCopyImageForTime 返回 -6683 或 kCVReturnPixelBufferNotOpenGLCompatible 头文件显示“由于不支持的缓冲区大小、像素格式或属性,像素缓冲区与 OpenGL 不兼容”我使用的是 Core Image Pixel Buffers 而不是OpenGL 纹理,因此不应涉及 OpenGL。
恢复为 k32ARGBPixelFormat 并再次正常工作。调用 QTPixelBufferContextCreate 时,我可以包含或排除 kCVPixelBufferWidthKey 和 kCVPixelBufferHeightKey ,这没有区别。我希望返回原始未缩放大小,并且源电影是 10 位未压缩或 ProRes,这不会改变结果。
所以它似乎是更广泛的电影和更深的像素格式的组合导致了失败。
任何想法都将不胜感激,因为所有这些都适用于标清电影,只是在测试高清电影时我才发现了问题。
谢谢,
亚当