C语言 我需要做些什么才能让H.264库将帧压缩到250Kb或以下?

sz81bmfz  于 2023-02-07  发布在  其他
关注(0)|答案(1)|浏览(107)

我正在使用H.264 library逐帧压缩视频。它工作正常,我可以在本地回放,没有任何问题。
然而,我需要通过局域网发送视频,而局域网已经很忙碌了,所以我需要将每帧的大小限制在最大250Kb左右。
我使用下面的代码来设置参数,但是更改比特率值似乎对库处理输入帧的操作没有任何影响:

x264_param_t param = {};
if(x264_param_default_preset(&param, "faster", nullptr) < 0)
{
    return -1;
}

param.i_csp = X264_CSP_I420;
param.i_width = 3840;
param.i_height = 2160;
param.i_keyint_max = static_cast<int>(f_frame_header.f_fps);
param.i_threads = X264_THREADS_AUTO;
param.b_vfr_input = 0;
param.b_repeat_headers = 1;
param.b_annexb = 1;

  // the following three parameters are the ones I tried to change with no results
  param.rc.i_bitrate = 100000;
  param.rc.i_vbv_max_bitrate = 100000;
  param.rc.i_vbv_buffer_size = 125000;

if(x264_param_apply_profile(&param, "high") < 0)
{
    return -1;
}

...enter loop reading frames and compressing them...

改变i_bitratei_vbv_max_bitratei_vbv_buffer_size参数似乎对结果帧的大小完全没有影响。我仍然得到一些超过500Kb的帧,在许多甚至,相当大的帧一个接一个,如以下大小所示:

20264
358875
218429
20728
25215
310230
36127
9077
29785
341541
222778
23542
21356
276772
25339
32459
421036
11179
6172
286070
193849

我所需要的是最大的帧在它的最大值是250,000左右。现在我明白了,偶尔它会超过一点,但不是2×。这只是太多了,我目前的可用带宽。
我在上面的参数设置中做错了什么?
我看过this command line

ffmpeg -i input -c:v libx264 -b:v 2M -maxrate 2M -bufsize 1M output.mp4

这意味着我上面所做的应该可以工作(我尝试了各种各样的值,包括命令行中的值)。然而,帧大小在我的运行之间并没有真正改变。

k10s72fa

k10s72fa1#

我试着在每一帧上应用模糊,看看它是否有帮助。是的!它有帮助。结果是一部比原来小2. 44倍的电影。
要从原始图像加载每个JPEG图像,我使用ImageMagick++(在C++中),因此我只对每个图像执行以下模糊操作:

image.blur(0.0, 5.0);

总共花了大约10个小时(如果没有模糊,同样的处理大约需要40分钟),但这是值得的,因为最终压缩的电影从1,293,272,023字节变成了 * 只有 * 529,556,265字节(小了2.44218倍)。模糊每帧增加了约3. 3秒的处理时间,原始图像中有11,000多帧。

**注:**我使用5.0来模糊,因为我有4K图像,虽然我可以看到一个尖锐的差异,当我看一帧,当播放产生的电影,我没有注意到最终的模糊。如果你有较小的图像,你可能会想使用一个较小的数字。看起来很多人使用的模糊只有0.05,并已在压缩比很好的结果。

在C中,使用BlurImage()函数:

Image *BlurImage(const Image *image,const double radius,
                 const double sigma,ExceptionInfo *exception)

以下是有关使用模糊进一步压缩JPEG图像的一些参考,因为它有助于消除在JPEG格式中压缩效果不佳的锐边(因为锐边不自然):

相关问题