使用ffmpeg解码h264流引入延迟,如何避免?

时间:2013-04-28 16:28:20

标签: c++ video ffmpeg h.264 x264

我正在研究一些编码视频源的代码,通过UDP将其发送到客户端然后对流进行解码。它使用x264编码器工作正常,我唯一的问题是当我在接收帧上调用avcodec_decode_video2时,解码器会引入一个延迟,好像它有一个内部缓冲区。我怎么能避免这个?控制这种行为的是什么?它是应该更改的编码器,还是缺少解码器上下文中的设置?目前我只使用默认值avcodec_get_context_defaults3创建解码器上下文。

编码器具有以下参数:

x264_param_t param;
x264_param_default_preset(&param, preset.c_str(), "zerolatency");
param.i_frame_reference = 1;

param.i_threads = 1;
param.b_sliced_threads = 5;
param.i_slice_max_size = 8192;
param.i_width = width;
param.i_height = height;
param.i_fps_num = 30;
param.i_fps_den = 1;
param.i_sync_lookahead = 0;

param.i_bframe = 0;
// Intra refres:
param.i_keyint_max = 30;
param.b_intra_refresh = 1;
//Rate control:
param.rc.i_rc_method = X264_RC_CRF;
param.rc.i_lookahead = 0;
param.rc.i_bitrate = bitrate;
param.rc.i_vbv_max_bitrate = bitrate;
param.rc.i_vbv_buffer_size = bitrate/30;

//For streaming:
param.b_repeat_headers = 1;
param.b_annexb = 1;

1 个答案:

答案 0 :(得分:0)

您可能在解码过程中使用帧线程并导致帧缓冲。我知道的唯一其他原因是使用B帧,但您在编码期间禁用了它。顺便说一下“param.b_sliced_threads = 5;”知道b_sliced_threads是布尔值,看起来很奇怪。