Ich nehme Live-Video in meiner iOS App auf. Auf einer anderen StackOverflow-Seite (Link) habe ich festgestellt, dass Sie vImage_Buffer verwenden können, um an meinen Frames zu arbeiten.So gehen Sie von vImage_Buffer zu CVPixelBufferRef
Das Problem ist, dass ich keine Ahnung habe, wie man aus dem ausgegebenen vImage_buffer zu einem CVPixelBufferRef zurückkommt.
Hier ist der Code, der in dem anderen Artikel gegeben:
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);
Und jetzt brauche ich outBuff
zu einem CVPixelBufferRef zu konvertieren.
Ich nehme an, ich muss vImageBuffer_CopyToCVPixelBuffer
verwenden, aber ich bin mir nicht sicher, wie.
Meine ersten Versuche scheiterten mit einem 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);
Irgendeine Idee?
Zu welchem Bytebereich stimmt die EXC_BAD_ACCESS überein? Die vImage_Buffer.data oder die CVPixelBufferRef-Basisadresse? –
HI Ian, wie genau kann ich das herausfinden? –
Führen Sie Ihren Code im Debugger aus. Wenn Sie abstürzen, sollten Sie etwas wie "EXC_BAD_ACCESS (Code = X, Adresse = ADDR)" sehen. An diesem Punkt verwenden Sie den Debugger, um die Werte von pixelBuffer und outBuff.data zu betrachten. Einer von ihnen sollte gleich oder nahe bei ADDR sein. –