【发布时间】:2015-03-04 15:46:52
【问题描述】:
我正在我的 iOS 应用中录制实时视频。在另一个 Stack Overflow page 上,我发现你可以使用 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, 480, kCVPixelFormatType_32BGRA, NULL, &pixelBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
vImage_CGImageFormat format = {
.bitsPerComponent = 8,
.bitsPerPixel = 32,
.bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst, //BGRX8888
.colorSpace = NULL, //sRGB
};
vImageBuffer_CopyToCVPixelBuffer(&outBuff,
&format,
pixelBuffer,
NULL,
NULL,
kvImageNoFlags); // Here is the crash!
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
有什么想法吗?
【问题讨论】:
-
EXC_BAD_ACCESS 对应于哪个字节块? vImage_Buffer.data 还是 CVPixelBufferRef 基地址?
-
嗨,伊恩,我怎么才能找到呢?
-
在调试器中运行您的代码。当您崩溃时,您应该会看到类似“EXC_BAD_ACCESS (Code=X, address=ADDR)”的内容。此时,使用调试器查看 pixelBuffer 和 outBuff.data 的值。其中之一应与 ADDR 相同或接近。
-
(这是假设您实际上是在 CopyToCVPixelBuffer 中崩溃,而不是更早;您在什么函数中崩溃?)
-
好吧,调试器保存在 vImageBuffer_CopyToCVPixelBuffer 但 addr 实际上是 0x0,但所有输入参数 outBuff、format 和 pixelBuffer 都与 0x0 不同。代码是 1