我正在iOS应用中录制实时视频.在另一个StackOverflow页面(
Link)上,我发现你可以使用vImage_Buffer来处理我的帧.
问题是我不知道如何从输出的vImage_buffer返回CVPixelBufferRef.
NSInteger cropX0 = 100,cropY0 = 100,cropHeight = 100,cropWidth = 100,outWidth = 480,outHeight = 480; CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); CVPixelBufferLockBaseAddress(imageBuffer,0); void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); vImage_Buffer inBuff; inBuff.height = cropHeight; inBuff.width = cropWidth; inBuff.rowBytes = bytesPerRow; int startpos = cropY0*bytesPerRow+4*cropX0; inBuff.data = baseAddress+startpos; unsigned char *outImg= (unsigned char*)malloc(4*outWidth*outHeight); vImage_Buffer outBuff = {outImg,outHeight,outWidth,4*outWidth}; vImage_Error err = vImageScale_ARGB8888(&inBuff,&outBuff,NULL,0); if (err != kvImageNoError) NSLog(@" error %ld",err);
现在我需要将outBuff转换为CVPixelBufferRef.
我假设我需要使用vImageBuffer_CopyToCVPixelBuffer,但我不确定如何.
我的第一次尝试失败了EXC_BAD_ACCESS:
CVPixelBufferUnlockBaseAddress(ImageBuffer的,0);
CVPixelBufferRef pixelBuffer; CVPixelBufferCreate(kcfAllocatorSystemDefault,480,kCVPixelFormatType_32BGRA,&pixelBuffer); CVPixelBufferLockBaseAddress( pixelBuffer,0 ); vImage_CGImageFormat format = { .bitsPerComponent = 8,.bitsPerPixel = 32,.bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst,//BGRX8888 .colorSpace = NULL,//sRGB }; vImageBuffer_CopyToCVPixelBuffer(&outBuff,&format,pixelBuffer,kvImageNoFlags); // Here is the crash! CVPixelBufferUnlockBaseAddress( pixelBuffer,0 );
任何的想法?
解决方法
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool : YES],kCVPixelBufferCGImageCompatibilityKey,[NSNumber numberWithBool : YES],kCVPixelBufferCGBitmapContextCompatibilityKey,[NSNumber numberWithInt : 480],kCVPixelBufferWidthKey,kCVPixelBufferHeightKey,nil]; status = CVPixelBufferCreateWithBytes(kcfAllocatorDefault,outImg,bytesPerRow,(__bridge CFDictionaryRef)options,&pixbuffer);
你应该生成一个像上面这样的新pixelBuffer.