菜鸟教程小白 发表于 2022-12-12 16:16:33

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


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

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

<p>有两种方法可以在 AVSampleBufferDisplayLayer 上将缓冲区排入队列:当缓冲区准备好时通过调用 - 来“约束”,或者通过调用 - 并将缓冲区排入队列来“不受约束”堵塞。我已经尝试了这两种方法,但即使是第二种方法也尽可能快地显示缓冲区 - 例如,如果我在接收端排队了 300 帧,那么第一次执行上述方法中的 block 时,无论有多少,readyForMoreMediaData 都保持为真缓冲区被排入队列,并且它们都在很短的时间内显示出来。 </p>

<p>如果在 CMSampleBuffer 上设置了 kCMSampleAttachmentKey_DisplayImmediately 附件,则此行为类似于人们所期望的,但是当前未设置(默认值为 false)。 </p>

<p>我尝试设置图层 controlTimeBase,但似乎没有任何效果。我不知道要尝试的其他事情,也无法在网上找到示例。有谁知道如何控制 AVSampleBufferDisplayLayer 显示帧的帧速率?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>时基需要设置为您要解码的第一帧的演示时间戳 (pts)。我通过从所有后续 pts 中减去初始 pts 并将 Timebase 设置为 0 将第一帧的 pts 索引为 0。无论出于何种原因,这不起作用。</p>

<p>你想要这样的东西(在调用解码之前调用<em></em>):</p>

<pre><code>CMTimebaseRef controlTimebase;
CMTimebaseCreateWithMasterClock( CFAllocatorGetDefault(), CMClockGetHostTimeClock(), &amp;controlTimebase );

displayLayer.controlTimebase = controlTimebase;

// Set the timebase to the initial pts here
CMTimebaseSetTime(displayLayer.controlTimebase, CMTimeMake(ptsInitial, 1));
CMTimebaseSetRate(displayLayer.controlTimebase, 1.0);
</code></pre>

<p>为 CMSampleBuffer 设置 PTS...</p>

<pre><code>CMSampleBufferSetOutputPresentationTimeStamp(sampleBuffer, presentationTimeStamp);
</code></pre>

<p>也许确保没有设置立即显示....</p>

<pre><code>CFDictionarySetValue(dict, kCMSampleAttachmentKey_DisplayImmediately, kCFBooleanFalse);
</code></pre>

<p>这在 WWDC 2014 Session 513 中有非常简短的介绍。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 设置 AVSampleBufferDisplayLayer 渲染样本缓冲区的速率,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/32554947/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/32554947/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 设置 AVSampleBufferDisplayLayer 渲染样本缓冲区的速率