Как уменьшить задержку при потоковой передаче x264

Я хотел бы произвести zerolatency живое видео и воспроизводить его в проигрывателе VLC с минимальной задержкой.

Это настройки, которые я сейчас использую:

x264_param_default_preset( &m_Params, "veryfast", "zerolatency" );

m_Params.i_threads              =   2;
m_Params.b_sliced_threads       =   true;
m_Params.i_width                =   m_SourceWidth;
m_Params.i_height               =   m_SourceHeight;

m_Params.b_intra_refresh        =   1;

m_Params.b_vfr_input            =   true;
m_Params.i_timebase_num         =   1;
m_Params.i_timebase_den         =   1000;

m_Params.i_fps_num              =   1;
m_Params.i_fps_den              =   60;

m_Params.rc.i_vbv_max_bitrate   =   512;
m_Params.rc.i_vbv_buffer_size   =   256;
m_Params.rc.f_vbv_buffer_init   =   1.1f;

m_Params.rc.i_rc_method         =   X264_RC_CRF;
m_Params.rc.f_rf_constant       =   24;
m_Params.rc.f_rf_constant_max   =   35;

m_Params.b_annexb               =   0;
m_Params.b_repeat_headers       =   0;
m_Params.b_aud                  =   0;

x264_param_apply_profile( &m_Params, "high" );

При использовании этих настроек у меня возникают следующие проблемы:

  • VLC показывает много пропущенных кадров (см. Скриншот, «verloren»). Я не уверен, если это проблема.
  • Если я установлю значение <200 мс для задержки сетевого потока в VLC, VLC рендерит несколько кадров и затем останавливает декодирование / рендеринг кадров.
  • Если я установлю значение> = 200 мс для задержки сетевого потока в VLC, пока все выглядит хорошо, но задержка, очевидно, составляет 200 мс, что слишком велико.

Вопрос:
Какие настройки (x264lib и VLC) я должен использовать для кодирования и потоковой передачи с минимальной задержкой?

введите описание изображения здесь

1

Решение

На ваших настройках x264: многие из них являются избыточными, т.е. уже содержатся в «zerolatency». Тем не менее, насколько я могу судить, ваша задержка кодирования, тем не менее, равна нулю, то есть вы вставляете один кадр, и вы сразу же (как только ваш ЦП закончил кодировать его, в любом случае) выводите один кадр. Он никогда не ждет более нового кадра для того, чтобы выдать закодированный более старый кадр (например, как это было бы с предвидением).

Почему vlc делает паузу, если вы не даете ей большую задержку в сети: Проблема в том, что ваша комбинация контроля скорости и настроек vbv при кодировании не идеальна. Что вы хотите сделать для кодирования с низкой задержкой, это использовать CBR и точно установить размер буфера VBV в размере одного кадра. Это позволяет выполнить специальный расчет VBV, если вы посмотрите на источник x264.

Вы также можете попытаться не устанавливать какие-либо временные параметры (без fps, vbv) и использовать CRF с нулевой задержкой. Результаты будут зависеть от того, в какой контейнер упаковано видео для потоковой передачи.

Прочитайте это для получения дополнительной информации: http://x264dev.multimedia.cx/archives/249

4

Другие решения

Если вы хотите иметь максимально быструю кодировку, удалите все после

x264_param_default_preset( &m_Params, "veryfast", "zerolatency" );

и изменить очень быстро на сверхбыстрый. Остальное из-за задержки в сети + декодирование.

1

По вопросам рекламы [email protected]