gpt4 book ai didi

ios - 设置 AVSampleBufferDisplayLayer 渲染样本缓冲区的速率

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:48 38 4
gpt4 key购买 nike

我正在使用 AVSampleBufferDisplayLayer 来显示通过网络连接以 h.264 格式传输的 CMSampleBuffer。视频播放流畅且工作正常,但我似乎无法控制帧速率。具体来说,如果我在 AVSampleBufferDisplayLayer 中每秒排队 60 帧,它会显示这 60 帧,即使视频是以 30 FPS 录制的。

创建样本缓冲区时,可以通过将计时信息数组传递给 CMSampleBufferCreate 来设置呈现时间戳(计时信息不存在于 h.264 流中,但可以计算或以容器格式传递)。我设置的呈现时间戳相隔约 0.033 秒,持续时间为 0.033,但显示层仍会显示尽可能多的每秒帧数。

有两种方法可以在 AVSampleBufferDisplayLayer 上对缓冲区进行排队:通过在缓冲区准备就绪时调用 -[AVSampleBufferDisplayLayer enqueueSampleBuffer:] 进行“约束”,或者通过调用 -[AVSampleBufferDisplayLayer requestMediaDataWhenReadyOnQueue:usingBlock:] 并将缓冲区进行排队“不受约束”堵塞。我已经尝试过这两种方法,但即使是第二种方法也会尽可能快地显示缓冲区 - 例如,如果我在接收端排队等待 300 帧,那么在第一次执行上述方法中的 block 时,无论有多少,readyForMoreMediaData 都保持为真缓冲区入队,并在很短的时间内全部显示出来。

如果在 CMSampleBuffer 上设置了 kCMSampleAttachmentKey_DisplayImmediately 附件,则此行为类似于预期的行为,但是当前未设置(默认为 false)。

我尝试设置图层controlTimeBase,但似乎没有任何效果。我无法尝试其他事情,也无法在网上找到示例。有谁知道如何控制 AVSampleBufferDisplayLayer 显示帧的帧速率?

最佳答案

Timebase 需要设置为您要解码的第一帧的呈现时间戳 (pts)。我通过从所有后续点中减去初始点并将时基设置为 0,将第一帧的点索引为 0。无论出于何种原因,这都不起作用。

你想要这样的东西(在解码调用之前调用):

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);

为 CMSampleBuffer 设置 PTS...

CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, presentationTimeStamp);

也许确保没有设置立即显示....

CFDictionarySetValue(dict, kCMSampleAttachmentKey_DisplayImmediately, kCFBooleanFalse);

这在 WWDC 2014 session 513 中有非常简短的介绍。

关于ios - 设置 AVSampleBufferDisplayLayer 渲染样本缓冲区的速率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32554947/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com