将CVPixelBufferRef样本从4:3转换为16:9

时间:2017-03-26 14:23:36

标签: image avfoundation crop cmsamplebuffer

我尝试在视频捕获管道中将4:3帧转换为16:9帧。转换后的帧需要进一步处理。因此,我需要将覆盖的框架保持为CVImageBufferRef。 我查看了这个堆栈溢出线程,并从中借鉴了一些想法 iOS - Scale and crop CMSampleBufferRef/CVImageBufferRef

这就是我所做的:

int cropX0 = 0, cropY0 = 60, cropHeight = 360, cropWidth = 640, outWidth = 640, outHeight = 360;
//get CVPixel buffer from CMSampleBuffer
CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(cmSampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);

size_t startpos = cropY0 * bytesPerRow;
void* cropStartAddr = ((char*)baseAddress) + startpos;

CVPixelBufferRef cropPixelBuffer = NULL;
int status = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
                                          outWidth,
                                          outHeight,
                                          CVPixelBufferGetPixelFormatType(imageBuffer),
                                          cropStartAddr,
                                          bytesPerRow,
                                          NULL, 
                                          0,
                                          NULL, 
                                          &cropPixelBuffer);
if(status == 0){
    OSStatus result = 0;
}

但是经过这种方法。如果我们从Xcode检查cropPixelBuffer。它看起来像一个腐败的图像。

enter image description here 原始图片看起来像这样

enter image description here

我认为可能是因为颜色格式是NV12 yuv像素格式 谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

如果你的图像数据是yuv,那么你可以处理多个平面数据(例如多个rowbytes,多个baseAddrs和多个widthheight和多个庄稼)在这种情况下你必须使用

CVPixelBufferCreateWithPlanarBytes()

那么CVPixelBufferGetPixelFormatType(imageBuffer)会返回什么?