如何在流式传输x264时减少延迟

时间:2013-11-18 15:42:37

标签: c++ video vlc x264 libx264

我想制作一个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”)。我不确定这是不是一个问题。
  • 如果我为VLC中的网络流延迟设置了一个<200ms的值,则VLC会渲染几帧而不是停止解码/渲染帧。
  • 如果我为VLC中的网络流延迟设置了一个&gt; = 200ms的值,那么到目前为止一切看起来都不错,但延迟显然是200ms,这太高了。

问题: 应该使用哪些设置(x264lib和VLC)以尽可能少的延迟进行编码和流式传输?

enter image description here

2 个答案:

答案 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" );

并将非常快速更改为超快。其余的是因为网络延迟+解码。

相关问题