2013-11-18 3 views
1

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

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

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) следует использовать для того, чтобы кодировать и поток с минимальными задержками, как это возможно?

enter image description here

ответ

4

В настройках x264: многие из них избыточными т.е. уже содержится в "zerolatency". Однако, насколько я могу судить, ваша латентность кодирования, тем не менее, имеет нулевые кадры, т. Е. Вы вставляете один кадр, и вы сразу же (как только ваш процессор закончил кодировать его, в любом случае) получают один фрейм. Он никогда не ждет нового кадра, чтобы получить кодированный старый фрейм (например, он будет выглядеть с видом).

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

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

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

1

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

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

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

Смежные вопросы