2015-03-04 6 views
7

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?

+0

Zu welchem ​​Bytebereich stimmt die EXC_BAD_ACCESS überein? Die vImage_Buffer.data oder die CVPixelBufferRef-Basisadresse? –

+0

HI Ian, wie genau kann ich das herausfinden? –

+0

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. –

Antwort

0
 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool : YES],   kCVPixelBufferCGImageCompatibilityKey, 
          [NSNumber numberWithBool : YES],   kCVPixelBufferCGBitmapContextCompatibilityKey, 
          [NSNumber numberWithInt : 480], kCVPixelBufferWidthKey, 
          [NSNumber numberWithInt : 480], kCVPixelBufferHeightKey, 
          nil]; 

      status = CVPixelBufferCreateWithBytes(kCFAllocatorDefault, 480, 480, kCVPixelFormatType_32BGRA, outImg, bytesPerRow, NULL, NULL, (__bridge CFDictionaryRef)options, &pixbuffer); 

Sie sollten einen neuen pixelBuffer wie oben erzeugen.

Verwandte Themen