2016-07-14 34 views
1

に以下の設定がiOS10まで、すべての最近のiOSバージョンに取り組んできました。私は、カスタムのソースからの生フレームをレンダリングするAVSampleBufferDisplayLayerを使用していますAVSampleBufferDisplayLayerレンダリングないフレームはもうiOS10

ピクセルバッファプールをCVPixelBufferPoolCreateで設定し、kCVPixelBufferIOSurfacePropertiesKeyをAppleの指示に従って@{}に設定しました。

私はCVPixelBufferPoolCreatePixelBufferを使用してプールからピクセルバッファを取得し、CVPixelBufferLockBaseAddressCVPixelBufferUnlockBaseAddressを使用してデータをバッファにコピーします。

私の生フレームはNV12フォーマットkCVPixelFormatType_420YpCbCr8BiPlanarVideoRangeを使用します。ここ

私はCMSampleBufferRefにピクセルバッファを変換して表示層にそれをエンキューする方法を示すコード・スニペットである:

CMSampleTimingInfo sampleTimeinfo{ 
     CMTimeMake(duration.count(), kOneSecond.count()), 
     kCMTimeInvalid, 
     kCMTimeInvalid}; 

    CMFormatDescriptionRef formatDescription = nullptr; 
    CMVideoFormatDescriptionCreateForImageBuffer(nullptr, pixelBuffer, &formatDescription); 

    CMSampleBufferRef sampleBuffer = nullptr; 
    CMSampleBufferCreateForImageBuffer(
      nullptr, pixelBuffer, true, nullptr, nullptr, formatDescription, &sampleTimeinfo, &sampleBuffer)); 


    CFArrayRef attachmentsArray = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, YES); 
    const CFIndex numElementsInArray = CFArrayGetCount(attachmentsArray); 

    for (CFIndex i = 0; i < numElementsInArray; ++i) { 
    CFMutableDictionaryRef attachments = (CFMutableDictionaryRef)CFArrayGetValueAtIndex(attachmentsArray, i); 
    CFDictionarySetValue(attachments, kCMSampleAttachmentKey_DisplayImmediately, kCFBooleanTrue); 
    } 

    if ([avfDisplayLayer_ isReadyForMoreMediaData]) { 
    [avfDisplayLayer_ enqueueSampleBuffer:sampleBuffer]; 
    } 

    CFRelease(sampleBuffer); 
    CFRelease(formatDescription); 

pixelBufferCVPixelBufferRefであり、そしてavfDisplayLayer_AVSampleBufferDisplayLayer

この次のスニペットは、私が表示層を構築する方法を示しています。私は、任意の警告またはエラーメッセージを取得していない午前

avfDisplayLayer_ = [[AVSampleBufferDisplayLayer alloc] init]; 
    avfDisplayLayer_.videoGravity = AVLayerVideoGravityResizeAspectFill; 

、表示層の状態は、失敗を示すものではありませんし、isReadyForMoreMediaDataがtrueを返しています。

問題は、フレームが画面に表示されないことです。また、レイヤーが正しく合成されていることを確認するために、表示レイヤーに背景色を設定しました。

AVSampleBufferDisplayLayerに関してiOS10では何かが変更されているに違いありませんが、それが何であるか把握することができません。

+0

私たちもこのアプリケーションを見ています。そのため、Appleにバグレポートを提出し、OpenRadarに情報をコピーしました:https://openradar.appspot.com/radar?id=5001147395866624 –

答えて

1

iOS10では、CMSampleTimingInfoの値がより厳密に解析されているようです。

上記のコードは正常にもう一度仕事をレンダリングするために、以下に変更されました:

CMSampleTimingInfo sampleTimeinfo{ 
     CMTimeMake(duration.count(), kOneSecond.count()), 
     kCMTimeZero, 
     kCMTimeInvalid}; 

presentationTimeStampフィールドのkCMTimeZeroに注意してください。

@スターリングアーチャー:あなたの問題にも対処するかどうかを試してみてください。

+0

実際にこれが問題を解決しました同じように。必ずしもフレームレートが一定であるとは限らないので、 'CMSampleTimingInfo'構造体には' duration'メンバの 'kCMTimeIndefinite'があります。フォローアップありがとう! –

+0

これは、iOS 10 Beta 4 [14A5322e]で解決されたようです。 'kCMTimeInvalid'を' presentationTimeStamp'として呼び出すと、もはや私が知る限り、 'kCMSampleAttachmentKey_DisplayImmediately'でレンダリングが中断されることはありません。 –

関連する問題