2016-07-14 5 views
1

에 다음과 같은 설정이 iOS10 때까지 모든 최근 아이폰 OS 버전에서 일하고있다 : 나는 정의 소스에서 원시 프레임을 렌더링하는 데 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); 

pixelBuffer

유형 CVPixelBufferRef이다 및 avfDisplayLayer_ AVSampleBufferDisplayLayer.

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

내가 경고 또는 오류 메시지를 받고 있지 않다, 디스플레이 층 상태가 실패를 표시하지 않고 isReadyForMoreMediaData 사실 반환 :

이 다음 조각

내가 디스플레이 층을 구성하는 방법을 보여줍니다.

내 프레임이 화면에 나타나지 않는 것이 문제입니다. 또한 레이어가 올바르게 합성되었는지 확인하기 위해 표시 레이어에 배경색을 설정했습니다.

뭔가가 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을 유의하시기 바랍니다.

@Sterling 아처 : 당신은 그것뿐만 아니라 문제를 해결할 수 있는지를보기 위해 시도를 제공 할 수 있습니다.

+0

실제로이 문제가 해결되었습니다. 게다가. 우리는 항상 프레임 속도가 일정하지 않기 때문에'CMSampleTimingInfo' 구조체는'duration' 멤버에 대해'kCMTimeIndefinite'를 갖습니다. 따라와 주셔서 감사합니다. –

+0

이것은 iOS 10 Beta 4 [14A5322e]에서 해결 된 것으로 보입니다. 'kCMTimeInvalid'를'presentationTimeStamp'로 설정하면 더 이상 'kCMSampleAttachmentKey_DisplayImmediately'로 렌더링을 중단하지 않습니다. –

관련 문제