2015-09-29 13 views
6

ho CMSampleBufferRef (s) che ho decodificare usando VTDecompressionSessionDecodeFrame che si traduce in CVImageBufferRef dopo la decodifica di un telaio ha completato, così le mie domande è ..Qual è il modo più efficiente per visualizzare CVImageBufferRef su iOS

Quale sarebbe il modo più efficiente per visualizzare questi CVImageBufferRefs in UIView?

sono riuscito a convertire CVImageBufferRef per CGImageRef e la visualizzazione di quelle di impostazioni CGImageRef come contenuto di CALayer ma poi DecompressionSession è stato configurato con @ {(id) kCVPixelBufferPixelFormatTypeKey: [NSNumber numberWithInt: kCVPixelFormatType_32BGRA]};

Ecco esempio/code come ho convertito CVImageBufferRef a CGImageRef (nota: i dati cvpixelbuffer deve essere in formato 32BGRA per questo lavoro)

CVPixelBufferLockBaseAddress(cvImageBuffer,0); 
    // get image properties 
    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(cvImageBuffer); 
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(cvImageBuffer); 
    size_t width   = CVPixelBufferGetWidth(cvImageBuffer); 
    size_t height  = CVPixelBufferGetHeight(cvImageBuffer); 

    /*Create a CGImageRef from the CVImageBufferRef*/ 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef cgContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
    CGImageRef cgImage = CGBitmapContextCreateImage(cgContext); 

    // release context and colorspace 
    CGContextRelease(cgContext); 
    CGColorSpaceRelease(colorSpace); 

    // now CGImageRef can be displayed either by setting CALayer content 
    // or by creating a [UIImage withCGImage:geImage] that can be displayed on 
    // UIImageView ... 

La sessione # WWDC14 513 (https://developer.apple.com/videos/wwdc/2014/#513) suggerisce che YUV -> La conversione dello spazio di colori RGB (usando la CPU?) Può essere evitata e se viene utilizzata la magia GLES con capacità YUV - chiedo che cosa potrebbe essere e come questo potrebbe essere realizzato?

IOS SampleCode GLCameraRipple Apple mostra un esempio di visualizzazione YUV CVPixelBufferRef catturato dalla fotocamera utilizzando 2 OpenGLES con texture separate per Y e componenti UV e un programma di frammentazione shader fa il YUV a RGB calcoli di conversione spazio colore usando GPU - è tutto ciò che realmente richiesto, o c'è un modo più semplice in cui ciò può essere fatto?

NOTA: Nel mio caso di utilizzo non riesco a utilizzare AVSampleBufferDisplayLayer, a causa di come diventa disponibile l'input per la decompressione.

risposta

0

Se stai ricevendo il vostro CVImageBufferRef da CMSampleBufferRef, che si sta ricevendo da captureOutput:didOutputSampleBuffer:fromConnection:, non c'è bisogno di fare che la conversione e può direttamente ottenere l'imageData di CMSampleBufferRef. Ecco il codice:

NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:sampleBuffer]; 
UIImage *frameImage = [UIImage imageWithData:imageData]; 

descrizione API non fornisce alcuna informazione sulla sua wether 32BGRA supportate o meno, e produce imageData, insieme a qualsiasi meta-dati, in formato jpeg senza alcuna compressione applicata. Se il tuo obiettivo è quello di visualizzare l'immagine sullo schermo o utilizzare con UIImageView, questo è il modo rapido.

+2

Grazie, ma i frame vengono catturati altrove e le NALU H.264 codificate vengono trasmesse sulla rete, tra gli altri dati dell'applicazione. Pertanto, l'applicazione che riceve questi frame codificati sulle reti deve prima decodificare quei CMSampleBuffer contenenti H.264 all'interno dei suoi CMBlockBuffer per ottenere l'accesso ai frame decodificati e ai dati dei pixel, dopodiché è necessario visualizzare quei frame video decodificati. Ora sto cercando il modo più efficiente per farlo (meno memoria copia tra CPU e memoria GPU, migliore batteria e efficienza di calcolo complessiva ..) – user2690268

Problemi correlati