2015-09-29 9 views
6

tarihinde CVImageBufferRef görüntülemek için en etkili yolu nedir Bu CVImageBufferRefs UIView içinde görüntülemek için en etkili yolu?Ben CMSampleBufferRef (lar) ı olan sorularıma böylece tamamlamış bir çerçevenin kod çözme sonrasında CVImageBufferRef sonuçlanır VTDecompressionSessionDecodeFrame, .. kullanan şifresini çözen hangi</p> <p>ne olurdu sahip iOS

I CGImageRef için CVImageBufferRef dönüştürme ve CALayer içeriği gibi ayarlar CGImageRef göre bu görüntüleme başarılı ancak daha sonra DecompressionSession @ {(id) kCVPixelBufferPixelFormatTypeKey: [NSNumber numberWithInt: kCVPixelFormatType_32BGRA]} ile konfigüre edilmiştir; İşte

Ben CGImageRef için CVImageBufferRef çevirdik nasıl örnek/kod şudur:

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

# WWDC14 oturumu 513 (https://developer.apple.com/videos/wwdc/2014/#513) ima (not cvpixelbuffer verileri bu çalışması için 32BGRA formatında olmak zorundadır) YUV -> RGB renk aralığı dönüştürme (CPU'yu Kullanarak?) Önlenebilir ve YUV yeteneğine sahip GLES büyüsü kullanılıyorsa, bunun ne olabileceğini ve bunun nasıl başarılabileceğini merak edebilirsiniz.

Apple'ın iOS ÖrnekKodu GLCameraRipple, Y ve UV bileşenleri için ayrı dokular içeren 2 OpenGLES ve GPU kullanarak YUV - RGB renk aralığı dönüştürme hesaplamaları yapan bir parça gölgelendirici programını kullanarak kameradan çekilen YUV CVPixelBufferRef'in bir örneğini gösterir. Gerekli mi yoksa bunun nasıl yapılabileceği konusunda daha basit bir yol var mı?

NOT: Kullanım durumunda, dekompresyon girişinin nasıl kullanılabileceğinden dolayı AVSampleBufferDisplayLayer'ı kullanamıyorum.

cevap

0

Eğer alıyorsanız sizin CVImageBufferRef Eğer captureOutput:didOutputSampleBuffer:fromConnection: dan aldığınız CMSampleBufferRef gelen, bu dönüşüm yapmak gerekmez ve doğrudan CMSampleBufferRef üzerinden imageData alabilirsiniz. İşte kod:

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

API açıklaması onun 32BGRA uygulanan herhangi bir sıkıştırma olmadan jpeg formatında herhangi bir meta-verilerle birlikte, imageData desteklenen ya da değil, ve üretir Hava hakkında herhangi bir bilgi sağlamaz. Amacınız görüntüyü ekranda görüntülemek veya UIImageView ile kullanmaksa, bu hızlı yoldur.

+2

Teşekkürler, ancak Çerçeveler başka bir yerde yakalanır ve H.264 NALU şifrelenir, diğer uygulama verileri arasında ağ üzerinden iletilir. Dolayısıyla, bu kodlanmış çerçeveleri ağlar üzerinden alan uygulama, ilk olarak, çözülmüş çerçevelere ve piksel verilerine erişim sağlamak için H.264'ü içeren HMS64'leri içeren CMSampleBuffer'larının kodunu çözme ihtiyacı duyar ve bundan sonra, bu kodu çözülmüş video karelerini görüntülemek gerekir. Bunu yapmanın en verimli yolu (CPU ve GPU belleği arasında daha az bellek kopyalama, en iyi pil ve genel hesaplama verimliliği ..) – user2690268

İlgili konular