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

标签 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;

最佳答案

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

关于c++ - 使用 ffmpeg 解码 h264 流会引入延迟,如何避免?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16265013/

相关文章:

python - 如何将实时视频分割成图像?

flutter - flutter 中的ffmpeg音频转换

ffmpeg - 在 FFmpeg/LibAV 中设置 RTSP/UDP 缓冲区大小

C++ - 在模板中定义复制构造函数

c++ - 预编译头 .pch 文件对机器敏感吗?

c++ - 返回值是类名后跟一对空括号是什么意思?

ffmpeg - 如何使用 FFmpeg 将字幕添加到 HLS 播放列表?

C++ STL 映射无法识别 key

bash - ffmpeg 似乎限制了我的输出

html - 视频标签的功能是否需要 html5 文档类型?