我想制作一个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)以尽可能少的延迟进行编码和流式传输?
答案 0 :(得分:4)
在x264设置上:许多都是冗余的,即已经包含在“zerolatency”中。但是,尽管我可以告诉你,你的编码延迟仍然是零帧,即你放入一帧然后立即(你的CPU完成编码后,无论如何)得到一帧。它永远不会等待更新的帧来提供编码的旧帧(例如,它与前瞻的方式)。
为什么vlc暂停,除非你给它一个大的网络延迟:问题是你在编码时你的速率控制和vbv设置的组合并不理想。您想要为低延迟编码做的是使用CBR,并将VBV缓冲区精确地设置为一帧的大小。如果查看x264源代码,则可以进行特殊的VBV计算。
您也可以尝试不设置任何与时间相关的任何时间(无fps,无vbv),并使用具有zerolatency的CRF。结果将取决于视频打包的容器用于流式传输。
阅读本文以获取更多信息:http://x264dev.multimedia.cx/archives/249
答案 1 :(得分:1)
如果您希望获得最快的编码,请在
之后删除所有内容x264_param_default_preset( &m_Params, "veryfast", "zerolatency" );
并将非常快速更改为超快。其余的是因为网络延迟+解码。