Hatred's Log Place

DON'T PANIC!

Sep 24, 2014 - 2 minute read -

x264 low latency

Очень хорошая статья на тему: http://x264dev.multimedia.cx/archives/249

UPD, ссылка недоступна, через веб-архив: http://web.archive.org/web/20150421033553/http://x264dev.multimedia.cx/archives/249

Цитата оттуда:

The total latency of x264, including encoder/decoder-side buffering, is:

B-frame latency (in frames) + Threading latency (in frames) + RC-lookahead (in frames) + Sync-lookahead (in frames) + VBV buffer size (in seconds) + Time to encode one frame (in milliseconds)

Собственно отсюда видно какие ручки крутить у того же FFmpeg что бы сделать задержку на стриминг как можно меньше:

-rc-lookahead #
-bf #
-threads #
-refs #
-x264-params sync-lookahead=#

и всякие буффера.

Эти же опции применительно к AVCodecContext:

AVCodecContext *ctx = ...;
...
av_opt_set(ctx, "rc-lookahead", "#", AV_OPT_SEARCH_CHILDREN);
av_opt_set(ctx, "threads",      "#", AV_OPT_SEARCH_CHILDREN);
av_opt_set(ctx, "bf",           "#", AV_OPT_SEARCH_CHILDREN);
av_opt_set(ctx, "refs",         "#", AV_OPT_SEARCH_CHILDREN);

GOP size (-g/“g”) будет влиять на объём траффика и как быстро картинка сможет восстановиться, если ключевой кадр был потерян.

Ну из опций видно, что загоняя эти параметры в минимальные значения, получим максимальную скорость. Уменьшать количество потоков (threads) имеет смысл когда у вас несколько подобных процессингов.

Есть ещё опция -tune (“tune”) со значением “zerolatency” - вундервафля, которая почти сгоняет задержку в ноль, но и качество картинки примерно туда же. Про то, что включает в себя различные опции тюнинга можно посмотреть в выводе:

x264 --fullhelp

Дополнительные материалы:

UPD: что-то странно, что все ссылки стали недоступны. Особенно рекомендации Ясона.