写在前面,下文是基于《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帧(红线)间隔差别

FFmpegFrameRecorder 固定5秒 ffmpeg设置gop_码率


FFmpegFrameRecorder 固定5秒 ffmpeg设置gop_码率_02


FFmpegFrameRecorder 固定5秒 ffmpeg设置gop_码率_03

  • 设置内部参数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

FFmpegFrameRecorder 固定5秒 ffmpeg设置gop_ffmpeg_04