2017-03-26 4 views
1

ビデオキャプチャパイプラインで4:3フレームから16:9フレームに変換しようとしています。変換されたフレームは、さらに処理が必要です。したがって、私は覆われたフレームをCVImageBufferRefとしておく必要があります。 私は、このスタックオーバーフローのスレッドを見て、ここから iOS - Scale and crop CMSampleBufferRef/CVImageBufferRefCVPixelBufferRefサンプルを4:3から16:9に変換する

をいくつかのアイデアを借りて、私がやったことです:

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

のように見える私はそれが理由カラーフォーマットであることができると思い、あなたの画像データがある場合は、あなたの助け

答えて

1

ため おかげNV12のYUVピクセル形式ですyuvの場合、複数の平面データ(例えば、複数のrowbytes、複数のbaseAddrs、複数のwidthheight、複数の作物)その場合はあなたが使用する必要があります

CVPixelBufferCreateWithPlanarBytes() 

CVPixelBufferGetPixelFormatType(imageBuffer)は何を返しますか?

+0

の形式は、kCVPixelFormatType_420YpCbCr8BiPlanarVideoRangeです。私は別にUVを渡す必要があると思う。 – user454083

+0

はい、それは作物に2つのビットマップがあることを意味する –

関連する問題