Я хотел бы произвести 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" );
При использовании этих настроек у меня возникают следующие проблемы:
Вопрос:
Какие настройки (x264lib и VLC) я должен использовать для кодирования и потоковой передачи с минимальной задержкой?
На ваших настройках x264: многие из них являются избыточными, т.е. уже содержатся в «zerolatency». Тем не менее, насколько я могу судить, ваша задержка кодирования, тем не менее, равна нулю, то есть вы вставляете один кадр, и вы сразу же (как только ваш ЦП закончил кодировать его, в любом случае) выводите один кадр. Он никогда не ждет более нового кадра для того, чтобы выдать закодированный более старый кадр (например, как это было бы с предвидением).
Почему vlc делает паузу, если вы не даете ей большую задержку в сети: Проблема в том, что ваша комбинация контроля скорости и настроек vbv при кодировании не идеальна. Что вы хотите сделать для кодирования с низкой задержкой, это использовать CBR и точно установить размер буфера VBV в размере одного кадра. Это позволяет выполнить специальный расчет VBV, если вы посмотрите на источник x264.
Вы также можете попытаться не устанавливать какие-либо временные параметры (без fps, vbv) и использовать CRF с нулевой задержкой. Результаты будут зависеть от того, в какой контейнер упаковано видео для потоковой передачи.
Прочитайте это для получения дополнительной информации: http://x264dev.multimedia.cx/archives/249
Если вы хотите иметь максимально быструю кодировку, удалите все после
x264_param_default_preset( &m_Params, "veryfast", "zerolatency" );
и изменить очень быстро на сверхбыстрый. Остальное из-за задержки в сети + декодирование.