Set rate at which AVSampleBufferDisplayLayer renders sample buffers

前端 未结 3 1009
天涯浪人
天涯浪人 2021-01-06 20:58

I am using an AVSampleBufferDisplayLayer to display CMSampleBuffers which are coming over a network connection in the h.264 format. Video playback is smooth and working corr

3条回答
  •  傲寒
    傲寒 (楼主)
    2021-01-06 21:39

    The Timebase needs to be set to the presentation time stamp (pts) of the first frame you intend to decode. I was indexing the pts of the first frame to 0 by subtracting the initial pts from all subsequent pts and setting the Timebase to 0. For whatever reason, that didn't work.

    You want something like this (called before a call to decode):

    CMTimebaseRef controlTimebase;
    CMTimebaseCreateWithMasterClock( CFAllocatorGetDefault(), CMClockGetHostTimeClock(), &controlTimebase );
    
    displayLayer.controlTimebase = controlTimebase;
    
    // Set the timebase to the initial pts here
    CMTimebaseSetTime(displayLayer.controlTimebase, CMTimeMake(ptsInitial, 1));
    CMTimebaseSetRate(displayLayer.controlTimebase, 1.0);
    

    Set the PTS for the CMSampleBuffer...

    CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, presentationTimeStamp);
    

    And maybe make sure display immediately isn't set....

    CFDictionarySetValue(dict, kCMSampleAttachmentKey_DisplayImmediately, kCFBooleanFalse);
    

    This is covered very briefly in WWDC 2014 Session 513.

提交回复
热议问题