下面的設置一直工作在最近所有的iOS版本,直到iOS10:AVSampleBufferDisplayLayer不渲染幀再在iOS10
我使用AVSampleBufferDisplayLayer
呈現從自定義源的原始幀。
我有一個使用CVPixelBufferPoolCreate
設置的像素緩衝池,並且按照Apple的指示將kCVPixelBufferIOSurfacePropertiesKey
設置爲@{}
。
我使用CVPixelBufferPoolCreatePixelBuffer
從池中獲取像素緩衝區,然後通過使用CVPixelBufferLockBaseAddress
和CVPixelBufferUnlockBaseAddress
將我的數據複製到緩衝區。
我的原始幀使用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);
pixelBuffer
是CVPixelBufferRef
類型,並且avfDisplayLayer_
AVSampleBufferDisplayLayer
。
接下來的這個片段展示了我是如何構造的顯示層:
avfDisplayLayer_ = [[AVSampleBufferDisplayLayer alloc] init];
avfDisplayLayer_.videoGravity = AVLayerVideoGravityResizeAspectFill;
我沒有得到任何警告或錯誤信息,顯示層狀態不指示失敗,並isReadyForMoreMediaData
被返回true。
的問題是,我的框架不顯示在屏幕上。我還在顯示層上設置了背景顏色,以確保圖層正確合成(它是)。
東西必須iOS10已經改變了與問候到AVSampleBufferDisplayLayer,但我無法弄清楚它是什麼。
我們在我們的應用程序中也看到了這一點,所以我向蘋果公司提交了一個錯誤報告並將信息複製到OpenRadar:https://openradar.appspot.com/radar?id=5001147395866624 –