我正在使用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,它没有任何区别。 我希望返回原始的非缩放大小,源电影是10bit未压缩或ProRes,这也不会改变结果。
所以它似乎是更广泛的电影和更深的Pixel格式的组合导致失败。
任何想法都会受到赞赏,因为所有人都在使用SD电影,只是在测试高清电影时才发现问题。
谢谢,
亚当