2016-07-14 67 views
1

下面的設置一直工作在最近所有的iOS版本,直到iOS10:AVSampleBufferDisplayLayer不渲染幀再在iOS10

我使用AVSampleBufferDisplayLayer呈現從自定義源的原始幀。

我有一個使用CVPixelBufferPoolCreate設置的像素緩衝池,並且按照Apple的指示將kCVPixelBufferIOSurfacePropertiesKey設置爲@{}

我使用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。

的問題是,我的框架不顯示在屏幕上。我還在顯示層上設置了背景顏色,以確保圖層正確合成(它是)。

東西必須iOS10已經改變了與問候到AVSampleBufferDisplayLayer,但我無法弄清楚它是什麼。

+0

我們在我們的應用程序中也看到了這一點,所以我向蘋果公司提交了一個錯誤報告並將信息複製到OpenRadar:https://openradar.appspot.com/radar?id=5001147395866624 –

回答

1

事實證明,與iOS10,爲CMSampleTimingInfo值顯然解析更加嚴格。

上述代碼改爲以下,使渲染工作正確的一次:

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

請注意kCMTimeZeropresentationTimeStamp領域。

@Sterling弓箭手:你可能想試試這個,看它是否解決你的問題也是如此。

+0

事實上,這確實解決了我們的問題以及。我們不一定有一個固定的幀速率,所以我們的'CMSampleTimingInfo'結構''持續時間'成員有'kCMTimeIndefinite'。感謝您的跟蹤! –

+0

這似乎是在iOS 10 Beta 4 [14A5322e]中解決的。就我所知,''kCMTimeInvalid'作爲'presentationTimeStamp'不再會'kCMSampleAttachmentKey_DisplayImmediately'突破渲染。 –