Задать вопрос
StrangeAttractor
@StrangeAttractor

Как понизить латентность h.264 видео в FFMPEG не прибегая к zerolatency?

В wiki ffmpeg сказано:

You may be able to decrease initial "startup" latency by specifing that I-frames come "more frequently" (or basically always, in the case of x264's zerolatency setting), though this can increase frame size and decrease quality, see ​here for some more background. Basically for typical x264 streams, it inserts an I-frame every 250 frames. This means that new clients that connect to the stream may have to wait up to 250 frames before they can start receiving the stream (or start with old data). So increasing I-frame frequency (makes the stream larger, but might decrease latency).


Как включить нулевую латентность вполне понятно - "-tune zerolatency", но я так и не понял как указать более высокую (но всё же не максимальную) частоту I-фрэймов, что советует этот параграф ("by specifing that I-frames come more frequently"). К чему относится описание "Basically for typical x264 streams, it inserts an I-frame every 250 frames" (что подразумевается в данном предложении "it")?
  • Вопрос задан
  • 6506 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
XaLBa
@XaLBa
Вообще, под задержкой в zerolatency подразумевается разница между тем, когда кадр пришёл на вход энкодеру, и когда он его отдал. Задержка может быть вызвана, что декодер буферизует некоторое количество кадров. Насколько я помню, по умолчанию 40.

Без буферизации не получится кодировать B-кадры. Также, анализируя кадры из будущего, энкодер более точно распределяет битрейт между кадрами. Количество буферизуемых кадров контролируется параметром rc_lookahead.

Количество используемых по умолчанию B-кадров — 3, поэтому уменьшать их число или отключать стоит при необходимости в совсем малой задержке.

Также советую более подробно посмотреть на другие параметры, которые задаются через --tune zerolatency:
- zerolatency:
    --bframes 0 --force-cfr --no-mbtree
    --sync-lookahead 0 --sliced-threads
    --rc-lookahead 0


Если же вам нужно уменьшить интервал между I-кадрами, насколько я понял, в ffmpeg это делается опцией -g. Но на задержке это не сказывается. Возможно, даже слегка её увеличивает, поскольку I-кадры сжимаются хуже.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы