フレームのデコードが完了した後に CVImageBufferRef になる VTDecompressionSessionDecodeFrame を使用してデコードする CMSampleBufferRef(s) があるので、私の質問は..
これらの CVImageBufferRefs を UIView に表示する最も効率的な方法は何でしょうか?
CVImageBufferRef を CGImageRef に変換し、CGImageRef を CALayer のコンテンツとして設定して表示することに成功しましたが、DecompressionSession は @{ (id)kCVPixelBufferPixelFormatTypeKey: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] }; で構成されています。
CVImageBufferRef を CGImageRef に変換した例/コードを次に示します (注: これを機能させるには、cvpixelbuffer データを 32BGRA 形式にする必要があります)。
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 セッション 513 ( https://developer.apple.com/videos/wwdc/2014/#513 ) は、YUV -> RGB 色空間変換 (CPU を使用?) を回避できることを示唆しており、YUV 対応の GLES マジックが使用されている場合 -それが何であり、どのようにこれを達成できるのだろうか?
Apple の iOS SampleCode GLCameraRipple は、Y コンポーネントと UV コンポーネントに個別のテクスチャを持つ 2 つの OpenGLES と、GPU を使用して YUV から RGB 色空間への変換計算を行うフラグメント シェーダー プログラムを使用して、カメラからキャプチャされた YUV CVPixelBufferRef を表示する例を示しています。これを行うためのより簡単な方法はありますか?
注: 私の使用例では、解凍への入力がどのように利用可能になるかという事実のために、AVSampleBufferDisplayLayer を使用できません。