9

フレームのデコードが完了した後に 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 を使用できません。

4

2 に答える 2

0

から受け取っている を からCVImageBufferRef取得している場合、その変換を行う必要はなく、 から imageData を直接取得できます。コードは次のとおりです。CMSampleBufferRefcaptureOutput:didOutputSampleBuffer:fromConnection:CMSampleBufferRef

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

jpegAPI の説明では、32BGRA がサポートされているかどうかについての情報は提供されず、圧縮が適用されていない形式でメタデータとともに imageData が生成されます。画像を画面に表示したり、 で使用したりすることが目的の場合はUIImageView、これが手っ取り早い方法です。

于 2015-10-02T20:10:25.280 に答える