ffmpeg:码率控制模式、编码方式

码率控制模式

码率控制:码率控制是在决定为每一个帧画面分配多少比特数,这是在权衡文件体积和画面质量
在ffmpeg里支持一下三种码率控制模式:

-qp(constant quantizer恒定量化器模式)

所谓的量化器就是利用特殊算法将画质转化为数字,这样的话每一帧的画质都可以通过量化参数来判定。在qp模式下,画质被分为0…20…40…51个级别,0就是无损的画质。用qp压制视频,每一帧的画面都能达到该级别的质量,严格的遵循量化参数来编码,这么一来他的画质是最好的,体积也是最大的,大到你无法想象,所以我们都不采用这种码率控制模式。

除非你想无损压制视频
无损压缩的例子(快速编码)

ffmpeg -i input.mkv -vcodec libx264 -preset ultrafast -qp 0 output.mkv

无损压缩的例子(高压缩比)

ffmpeg -I input.mkv -vcodec libx264 -preset veryslow -qp 0 output.mkv

-vcodec libx264】指定编码器libx264
-preset veryslow】设置编码器预设为veryslow
-qp 0】设置码率控制模式采用恒定量化器模式,并且画质为无损的画质

-crf(constant rate factor恒定速率因子模式)

crf其实是一个浮动的qp模式,他按照特定的标准,根据人体肉眼的特点,给予每帧画面不同的量化参数,有些画面画质低一点,有些画面画质高一点其实人眼是很难识别的。所以我们可以降低一点码率,然后把这些码率用到视觉敏感的画面里,这么一来,画质的变化几乎看不出来,码率却降低了不少,文件体积自然也变小了

-b(bitrate固定目标码率模式)

编码器会试图让最终文件的整体码率与我们给定的码率相等,这么一来视频码率和文件体积都是确定的,适用于对码率和体积有规定的情景。一般情况下现在大部分的视频软件都有这方面的限制,如果你们有上传视频的需求,并且希望在有限的条件下达到较高的画质,那么就可以采用这种码率控制模式。但为什么要这么做呢?我们利用crf压制一个足够清晰,体积适中的视频文件,无论是用于存储还是上传都可以,不同的视频网站有不同的参数限制,而且基本上他们都会二次压制后转码,为了追求那么一点点画质,针对不同网站分别压制视频,实在是太浪费时间了,如果那些网站的参数变动的话,我们怎么办,又要重新压制嘛,所以基本上我们不采用这种码率控制模式。除非是压制极小的视频,或者是对视频文件大小有严格限制的场景。

以上三种码率控制均是单遍编码,所以在采用qp或者crf的时候,最好搭配编码器预设veryslow,这样一来参数控制更精准一些。

编码方式

VBR(variable bit rate)

bitrate固定目标码率模式默认采用的是VBR动态(可变)比特率的方式进行编码,简单的内容少给点码率,复杂的内容多给点码率。
VBR例子:ffmpeg -i input.mp4 -vcodec libx264 -preset veryslow output.mp4

ABR(average bit rate)

现在的网络视频基本上都是采用ABR平均比特率的编码方式,如果VBR的码率变化太大,用户的设备或网络状况又不好的情况下很容易变成花屏或者黑屏。
ABR例子:ffmpeg -i input.mp4 -vcodec libx264 -preset veryslow -b:v 3000k output.mp4

CBR(constant bit rate)

CBR恒定比特率,他其实就是在ABR的基础上加上一些指令(…-b:v 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k…)让码率尽可能固定在一个数值上。

那么ffmpeg如何控制码率?

ffmpeg控制码率有3种参数选择,-minrate -b:v -maxrate
-b:v】主要是控制平均码率
比如一个视频源的码率太高了,有10Mbps,文件太大,想把文件弄小一点,但是又不破坏分辨率。可以如下操作:

ffmpeg -i input.mp4 -b:v 2000k output.mp4

这个操作把码率从原码率10Mbps转成2Mbps码率,这样其实也间接让文件变小了。目测接近一半。

不过,ffmpeg官方wiki比较建议,设置b:v时,同时加上 -bufsize
-bufsize 】用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。(简单来说,比如1 2的平均值是1.5, 1.49 1.51 也是1.5,当然是第二种比较好)

ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4

-minrate -maxrate】就简单了,在线视频有时候,希望码率波动,不要超过一个阈值,可以设置maxrate。

ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章