2016-12-18 7 views
0

に構造を追加私はこのコードを使用して薄い空気のうちCMVideoFormatDescriptionRefを作成しています:NSDictionaryの

CMVideoDimensions dimensions = { 
    .width = width, 
    .height = height 
    }; 

    CMVideoFormatDescriptionRef videoInfo = NULL; 

    NSDictionary *options2 = [NSDictionary dictionaryWithObjectsAndKeys: 
          @(YES), kCVPixelBufferCGImageCompatibilityKey, 
          @(YES), kCVPixelBufferCGBitmapContextCompatibilityKey, 
          dimensions, kCVImageBufferDisplayDimensionsKey, 
          nil]; 
    CFDictionaryRef dictOptionsRef = (__bridge CFDictionaryRef)options2; 

    CMFormatDescriptionCreate(kCFAllocatorDefault, kCMMediaType_Video, 'brga', dictOptionsRef, &videoInfo); 

IはCMFormatDescriptionCreateにその辞書を渡す必要があります。

問題は、これは、その辞書にdimensionsを追加するための正しい方法ではありません

dimensions, kCVImageBufferDisplayDimensionsKey, 

最後の行です。それはアプリをクラッシュさせます。

私はこれを使用してNSValueに全体をラップしようとしている:それは理論、ノークラッシュで動作しますが、videoInfoが正しく作成されていない

NSValue *miValue = [NSValue value: &dimensions 
        withObjCType:@encode(CMVideoDimensions)]; 

(OSStatus -12731)を。この最後の行を辞書から削除すると、videoInfoが作成されますが、0x0ピクセルまたはcodecTypeと想定される次元の定義はありません。下記参照:

<CMVideoFormatDescription 0x17044c270 [0x1b0330bb8]> { 
    mediaType:'vide' 
    mediaSubType:'brga' 
    mediaSpecific: { 
     codecType: 0  dimensions: 0 x 0 <--HERE!!! 
    } 
    extensions: {<CFBasicHash 0x17086dcc0 [0x1b0330bb8]>{type = immutable dict, count = 4, 
entries => 
    0 : <CFString 0x1aa9427c8 [0x1b0330bb8]>{contents = "CVImageBufferYCbCrMatrix"} = <CFString 0x1aa942808 [0x1b0330bb8]>{contents = "ITU_R_601_4"} 
    3 : <CFString 0x1aa942c68 [0x1b0330bb8]>{contents = "CGImageCompatibility"} = <CFBoolean 0x1b0331110 [0x1b0330bb8]>{value = true} 
    5 : <CFString 0x1aa9428a8 [0x1b0330bb8]>{contents = "CVImageBufferColorPrimaries"} = <CFString 0x1aa9427e8 [0x1b0330bb8]>{contents = "ITU_R_709_2"} 
    6 : <CFString 0x1aa942c48 [0x1b0330bb8]>{contents = "CGBitmapContextCompatibility"} = <CFBoolean 0x1b0331110 [0x1b0330bb8]>{value = true} 
} 
} 
} 
CMVideoFormatDescriptionRef

正規CMSampleBufferRef示すcodecTypeBGRAとして、フレームの定期的な大きさから、1920×1080、例えば。

どうすればよいですか?

答えて

0

kCVImageBufferDisplayDimensionsKeyヘッダファイルは、キーの値がCFNumberのですどちらも、次の二つの鍵

kCVImageBufferDisplayWidthKeykCVImageBufferDisplayHeightKey、とCFDictionary

//であると言います。

代わりCMVideoDimensionsを渡すので、あなたが正しい

NSDictionary *dimensions = [NSDictionary dictionaryWithObjectsAndKeys:@(width), kCVImageBufferDisplayWidthKey, @(height), kCVImageBufferDisplayHeightKey]; 
+0

にそれを変更しています!ありがとう! – SpaceDog