ffmpeg软编码之H.264

写在前面,下文是基于《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

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值