[英]How to reduce latency when streaming 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" );
使用这些设置,我遇到以下问题:
问题:我应该使用哪些设置(x264lib和VLC)以尽可能少的延迟进行编码和流传输?
在您的x264设置上:许多是多余的,即已经包含在“ zerolatency”中。 但是,据我所知,您的编码延迟仍然是零帧,也就是说,您放入一帧,然后立即(无论如何,一旦CPU完成编码)就得到一帧。 它从不等待新的帧来提供编码的旧帧(例如,采用超前的方式)。
关于为什么vlc会暂停,除非您给它带来较大的网络延迟:问题是编码时速率控制和vbv设置的组合不理想。 对于低延迟编码,您要做的是使用CBR,并将VBV缓冲区的大小精确设置为一帧。 如果您查看x264源代码,这将启用特殊的VBV计算。
您也可以尝试不设置任何与计时相关的东西(无fps,无vbv),并使用零延迟的CRF。 结果将取决于视频打包在哪个容器中以进行流传输。
请阅读以获取更多信息: http : //x264dev.multimedia.cx/archives/249
如果您想获得最快的编码,请在之后删除所有内容
x264_param_default_preset( &m_Params, "veryfast", "zerolatency" );
并迅速变为超快。 其余的是由于网络延迟+解码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.