写在前面,下文是基于《FFmpeg从入门到精通》一书,4.1章节的精简
- 查看编码器x264是否安装成功
ffmpeg -h encoder=libx264
若显示 “Encoder libx264 [libx264 H.264…"则成功
- 编码器预设参数设置preset
preset – 编码器预设参数,字符串类型
编码方式的转码速度从大到小排序:ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
编码方式的选择影响清晰度、编码效率…
/*以ultrafast为例,码率设置为2000k
预设参数在preset后进行修改即可
转码速度越大,画质越差*/
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -b:v 2000k output.mp4
- 优化参数tune
使用tune参数调优H.264编码时,可以包含:film, animation, grain, stillimage等多个场景,每个场景参数设置除默认参数设置 ‘-tune <场景名>’ 外,略有差别,这里不一一列举。
- profile与level设置
profile – 档次(Baseline, Extented, Main, High, High10, High422, High444)
level – 等级 (1, 1b, 1.1, 1.2, 1.3, 2, 2.1, 2.2, 3, 3.1, 3.2, 4, 4.1, 4.2, 5, 5.1, 5.2)
/*以baseline和high为例
level 均为3.1
均截取10s*/
ffmpeg -i input.mp4 -vcodec libx264 -profile:v baseline -level 3.1 -an -y -t 10 output_baseline.ts
ffmpeg -i input.mp4 -vcodec libx264 -profile:v high -level 3.1 -an -y -t 10 output_high.ts
比较两种profile的区别,以B帧数量为例
tips:I帧、P帧、B帧:I – 帧内编码图像帧(关键帧),P帧 --预测编码图像帧(与之前的I/P帧比较),B帧 – 双向预测编码图像帧(与之前的I/P帧,之后的P帧双向比较,压缩比最高)
/*grep,wc都是linux里的命令,如果用win10建议装一个linux 的bush。否则可用findstr等替换*/
ffprobe -v quiet -show_frames -select_streams v output_baseline.ts |grep "pict_type=B"|wc -l
ffprobe -v quiet -show_frames -select_streams v output_high.ts |grep "pict_type=B"|wc -l
profile为baseline的输出0,high的输出不为0
- 控制场景切换关键帧插入函数sc_threshold
GOP:两个I帧之间的间隔。GOP值越大,P/B帧越多,平均每帧占用的字节越少,视频质量越高。
但是,遇到场景切换时,会强行插入一个I帧从而GOP被缩短。
-g <帧数> 可以用来设置GOP长度
/*每50帧设置为一个GOP间隔*/
ffmpeg -i input.mp4 -c:v libx264 -g 50 output.mp4
-sc_threshold 0 控制场景切换不插入关键帧
ffmpeg -i input.mp4 -c:v libx264 -g 50 -sc_threshold 0 output.mp4
以下为同一视频编译前后的编码数据图像,可以很明显地看出I帧(红线)间隔差别
- 设置内部参数x264opts
我们可以通过设置x264opts,对x264内部参数(如I/P/B帧的顺序、频率等各种规律)进行设置。
/*不出现B帧*/
ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=0" output.mp4
/*每两个P帧之间存放3个B帧*/
ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=3:b-adapt=0" output.mp4
- CBR恒定码率设置参数nal-hrd
编码模式:VBR(可变码率),CBR(恒定码率)
/*每两个P帧之间存放10个B帧
视频码率为1000k bit/s
最大码率和最小码率均为1000k bit/s
buffer(控制编码时的波动)为50KB
设置信号形势为CBR
每50帧一个GOP
场景切换不强行插入关键帧*/
ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=10:b-adapt=0" -b:v 1000k -maxrate 1000k -minrate 1000k -bufsize 50k -nal-hrd cbr -g 50 -sc_threshold 0 output.ts