我有一个YCbCr格式的双平面原始视频缓冲数据,我用它作为源码在iPhone和iPad上压缩H.264格式的一个新的mp4 / mov视频。因此,我使用CVPixelBufferRef
创建一个新的像素缓冲区,然后使用AVAssetWriterInputPixelBufferAdaptor
附加到视频编写器。
但是,当我使用其中包含YCbCr数据的新像素缓冲区调用appendPixelBuffer
时,appendPixelBuffer
仅为附加的第一帧返回YES
。作者拒绝所有其他帧(通过返回NO
)。问题是,如果我使用BGRA32格式的原始视频数据,它工作得很好,所以我想知道我是否有一个错误创建的YCbCr格式的像素缓冲区。
我有两种创建像素缓冲区的方法:
1)使用CVPixelBufferCreateWithBytes
:
cvErr = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
videoWidth_,
videoHeight_,
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
[videoFrame getBaseAddressOfPlane:0],
[videoFrame getBytesPerRowOfPlane:0],
NULL,
NULL,
NULL,
&pixelBuffer);
2)使用CVPixelBufferCreateWithPlanarBytes
:
cvErr = CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault,
videoWidth_,
videoHeight_,
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
NULL,
0,
videoFrame.planeCount,
planeBaseAddress,
planeWidth,
planeHeight,
planeStride,
NULL,
NULL,
NULL,
&pixelBuffer);
planeBaseAddress
,planeWidth
,planeHeight
,planeStride
是包含Y平面和CbCr平面的基地址,宽度,高度和步幅的2D数组。
那么你能告诉我我在哪里做错了,或者我是否可以参考一些示例代码,或者这是否是iPhone SDK的问题?