c++ - 视频流 - 控制帧率 x264

标签 c++ video x264 libx264

我是视频编码新手,我发现了这个 https://github.com/RafaelPalomar/H264LiveStreamer应用程序代码对我的项目非常有用。我想通过 RTP 直播网络摄像头。但是,我在选择每秒帧数 (FPS) 时遇到问题。下面是控制编码参数的函数。

void x264Encoder::initilize()
{
  x264_param_default_preset(&parameters, "veryfast", "zerolatency");
  parameters.i_log_level =  X264_LOG_DEBUG;
  parameters.i_threads = 1;
  parameters.i_width = 640;
  parameters.i_height = 480;
  parameters.i_fps_num = 25;
  parameters.i_fps_den = 1;
  parameters.i_keyint_max = 25;
  parameters.b_intra_refresh = 1;
  parameters.rc.i_rc_method = X264_RC_CRF;
  parameters.rc.i_vbv_buffer_size = 1000000;
  parameters.rc.i_vbv_max_bitrate = 90000;
  parameters.rc.f_rf_constant = 25;
  parameters.rc.f_rf_constant_max = 35;
  parameters.i_sps_id = 7;
  // the following two value you should keep 1
  parameters.b_repeat_headers = 1;    // to get header before every I-Frame
  parameters.b_annexb = 1; // put start code in front of nal. we will remove start code later
  x264_param_apply_profile(&parameters, "baseline");

  encoder = x264_encoder_open(&parameters);
  x264_picture_alloc(&picture_in, X264_CSP_I420, parameters.i_width, parameters.i_height);
  picture_in.i_type = X264_TYPE_AUTO;
  picture_in.img.i_csp = X264_CSP_I420;
  // i have initilized my color space converter for BGR24 to YUV420 because my opencv video capture gives BGR24 image. You can initilize according to your input pixelFormat
  convertContext = sws_getContext(parameters.i_width,parameters.i_height, PIX_FMT_BGR24, parameters.i_width,parameters.i_height,PIX_FMT_YUV420P, SWS_FAST_BILINEAR, NULL, NULL, NULL);
}

我正在使用 VLC 作为客户端,无论我将 i_fps_num 设置为多少,我总是得到 12-14 FPS。例如,在 VLC 编解码器选项卡中显示 25 FPS,但在流统计选项卡中显示它平均只显示 13 FPS。这是 X264 编码器输出

x264 [debug]: frame=  72 QP=22.24 NAL=2 Slice:P Poc:144 I:97   P:116  SKIP:987  size=1464 bytes
x264 [info]: frame I:1     Avg QP:20.06  size: 17848
x264 [info]: frame P:72    Avg QP:22.12  size:  1337
x264 [info]: mb I  I16..4: 40.2%  0.0% 59.8%
x264 [info]: mb P  I16..4:  3.1%  0.0%  2.3%  P16..4:  8.3%  2.0%  0.6%  0.0%  0.0%    skip:83.7%
x264 [info]: coded y,uvDC,uvAC intra: 53.6% 46.4% 7.4% inter: 3.0% 1.6% 0.0%
x264 [info]: i16 v,h,dc,p: 11% 65% 12% 12%
x264 [info]: i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 46% 16%  3%  4%  3%  5%  3%  6%
x264 [info]: i8c dc,h,v,p: 46% 42% 10%  2%
x264 [info]: kb/s:312.60

编码的最后一个帧数是 72,而在 VLC 流统计中显示显示了 133 帧并解码了 66 个 block ,持续 10 秒流,此外视频播放是突发的。

我的问题是如何更改 x264 参数以获得 25 FPS?

最佳答案

我怀疑您的计算机无法实时编码 25 fps。您正在使用一个线程 - 这可能是瓶颈。您可以尝试使用相同的设置离线编码并检查编码速度吗?

视频捕获/摄像机也可能存在帧速率问题。尝试使用视频捕获和在屏幕上立即回放(无编码)的管道,以确保您的相机能够达到 25 fps。

关于c++ - 视频流 - 控制帧率 x264,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42542322/

相关文章:

c++ - 列出导致线程本地单例类崩溃的析构函数

c++ - 如何通过路径为 QFileSystemModel 选择 QTreeView 中的文件?

c++ - 修改CISCO openh264取图像帧和压缩帧

c++ - 如何在不将单独的帧图像写入磁盘的情况下从 C++ 程序中生成的多个图像中编码视频?

c++ - 创建指针以 boost asio tcp 套接字

python - 如何使用 pybind11 进行绑定(bind)?

java - 第 3 方媒体播放器 SDK 或其他选项

open-source - 跟踪视频中的对象

audio - 使用 ffmpeg,从视频文件中提取音频流并输出到单个立体声 wav 文件

ffmpeg - 使用 x264 生成所有 P 帧帧内刷新 H264