Установите скорость, с которой AVSampleBufferDisplayLayer рендерит буферы сэмплов

Я использую AVSampleBufferDisplayLayer для отображения CMSampleBuffers, которые приходят по сетевому соединению в формате h.264. Воспроизведение видео плавное и работает правильно, однако я не могу контролировать частоту кадров. В частности, если я ставлю 60 кадров в секунду в AVSampleBufferDisplayLayer, он отображает эти 60 кадров, даже если видео записывается со скоростью 30 кадров в секунду.

При создании выборочных буферов можно установить метку времени представления, передав массив информации о синхронизации в CMSampleBufferCreate (информация о времени отсутствует в потоке h.264, но может быть рассчитана или передана в формате контейнера). Установленные мной метки времени представления находятся на расстоянии около 0,033 секунды, а длительность равна 0,033, но слой отображения по-прежнему отображает столько кадров в секунду, сколько может.

Есть два способа поставить в буфер буферы в AVSampleBufferDisplayLayer: «с ограничением» путем вызова - [AVSampleBufferDisplayLayer enqueueSampleBuffer:] всякий раз, когда буфер готов, или «без ограничений» с помощью вызова - [AVSampleBufferDisplayLayer requestMediaDataQuquingUqueryUuqueryRequire: Буфер: Я пробовал оба, но даже второй метод отображает буферы настолько быстро, насколько это возможно - например, если у меня есть 300 кадров, поставленных в очередь на принимающей стороне, то в первый раз, когда блок в приведенном выше методе выполняется, readyForMoreMediaData остается верным независимо от того, сколько буферы ставятся в очередь, и все они отображаются в очень короткое время.

Это поведение похоже на то, что можно ожидать, если в CMSampleBuffer было установлено вложение kCMSampleAttachmentKey_DisplayImmediately, однако в настоящее время оно НЕ установлено (и по умолчанию установлено значение false).

Я попытался установить слои controlTimeBase, но, похоже, это не имело никакого эффекта. Я в растерянности, чтобы попробовать и не мог найти примеры в Интернете. Кто-нибудь знает, как можно контролировать частоту кадров, при которой AVSampleBufferDisplayLayer отображает кадры?

Ответы на вопрос(2)

Ваш ответ на вопрос