我尝试在视频捕获管道中将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。它看起来像一个腐败的图像。
我认为可能是因为颜色格式是NV12 yuv像素格式 谢谢你的帮助答案 0 :(得分:1)
如果你的图像数据是yuv,那么你可以处理多个平面数据(例如多个rowbytes
,多个baseAddrs
和多个width
,height
和多个庄稼)在这种情况下你必须使用
CVPixelBufferCreateWithPlanarBytes()
那么CVPixelBufferGetPixelFormatType(imageBuffer)
会返回什么?