ffmpeg做h264编码,使用了libx264;想要降低cpu使用率,就需要牺牲图像质量;由于已经使用 baseline,就无需考虑B帧了。
目前能想到的,主要是需要调控以下一些参数:
1. qp值
此值范围为0~51 。值越小,量化步长越小,量化的精度就越高,意味着同样画质的情况下,产生的数据量可能会更大。数值越大,图像越模糊,CPU使用率越低。
2. 设置编码速度preset
指定编码速度,速度越慢,画质越好,cpu占用越高,可取值:
ultrafast,superfast,veryfast,faster,fast,
medium,slow,slower,veryslow,placebo调用方法:
x264_param_default_preset
3. partitions
H.264视频在压缩过程中划分为16×16的宏块。这些宏块可以进一步划分为更小的分割,这就是此选项要控制的部分。分割依不同帧类型(I、P、B)启用。可用的分割:p8x8, p4x4, b8x8, i8x8, i4x4, none, all
- I:i8x8、i4x4。
- P:p8x8(亦会启用p16x8/p8x16)、p4x4(亦会启用p8x4/p4x8)。
- B:b8x8(亦会启用b16x8/b8x16)。
- p4x4通常不怎么有用,而且性价比极低[4]。
4. no-cabac
预设值:b_cabac = 1。停用CABAC切换回效率较低的CAVLC。会降低压缩效率(通常10~20%)和解码的硬件需求。
coder:
熵编码类型,取值:
default
cavlc
cabac
vlc
ac
限制 CPU 使用率
添加:-threads 2
参数。
FFmpeg -i IN –threads 2 OUT
Process ffmpeg = new Process();
ffmpeg.StartInfo.UseShellExecute = false;
ffmpeg.StartInfo.FileName = "..\ffmpeg.exe";
ffmpeg.StartInfo.Arguments = "-threads 2"; // <=== Add this line
ffmpeg.StartInfo.CreateNoWindow = true;
ffmpeg.Start();
测试一 -threads
-threads 2 以两个线程进行运行, 加快处理的速度。
转换视频:7752c7dd-36aa-47eb-95a5-2193c9726541.wmv
目标视频:7752c7dd-36aa-47eb-95a5-2193c9726541.mp4
转换命令:
FFmpeg -i IN -map 0 -r 25 -threads 4 -y Out
本机测试机环境:
win7旗舰版+Intel(R) Core(TM)i5-2400 CPU @3.10GHz 3.10GHz+4.00GB+64bit
序号 | 开启的线程数 | 占用CPU数 | CPU使用率(%) | 转换时间(min) | 其他 |
---|---|---|---|---|---|
1 | 1 | 1 | 25 | 7 | |
2 | 2 | 4 | 40-55 | 3 | 2个CPU〉50%,1个=50%,1个CPU=40% |
3 | 4 | 4 | 60-70 | 3 | 4个CPU比较平均 |
4 | 4 | 4 | 70-80 | 2 | 4个CPU使用平均 |
5 | – | 4 | 80-85 | 2 | 4个CPU使用较平均 |
为了达到更快的转换速度,CPU使用率在可允许范围内,选择-threads 2。