ios – 如何从vImage_Buffer转到CVPixelBufferRef

前端之家收集整理的这篇文章主要介绍了ios – 如何从vImage_Buffer转到CVPixelBufferRef前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在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.

猜你在找的iOS相关文章