视频编码-码率控制CQP/CRF/ABR/CBR/VBV

目录

  1. 参考
  2. 概述
  3. CQP(Constant QP)
  4. CRF(Constant Rate Factor)/CQF(Constant Quality Factor)
  5. ABR(Average Bitrate)
  6. CBR(Constant Bitrate)
  7. VBV(Video Buffering Verifier)

1. 参考

2. 概述

编码器中有一个码率控制模块,通过选择一系列编码参数,来控制编码视频的码率满足需要,并且使编码失真尽可能小。码率控制严格上不属于视频编码标准,属于率失真优化

码率控制的几种模式[1]:

  1. CQP(Constant QP):恒定QP(Quantization Parameter)。
  2. CRF(Constant Rate Factor)/CQF(Constant Quality Factor):恒定质量因子。
  3. ABR(Average Bitrate):指定平均码率。
  4. CBR(Constant Bitrate):恒定码率,相对的是可变码率(VBR, Variable Bitrate)。
  5. VBV(Video Buffering Verifier):视频缓冲校验。

3. CQP(Constant QP)

恒定QP(Quantization Parameter)。

  • 瞬时码率会随场景复杂度波动。
  • x264和x265中支持CQP模式,libvpx不支持。
  • H.264中QP范围是[0, 51]。QP值越大表示越大的量化步长,编码视频的质量越低。QP为0表示进行无损编码。
  • 使用FFmpeg指定QP的示例如下所示。
ffmpeg -s 1280x720 -i <input> -c:v libx264 -qp 23 <output>
ffmpeg -s 1280x720 -i <input> -c:v libx265 -x265-params qp=23 <output>
  • 不推荐使用这个模式,除非你明确知道这个模式的原理而有特定的用途。

4. CRF(Constant Rate Factor)/CQF(Constant Quality Factor)

恒定质量因子。

  • 与恒定QP类似,但追求主观感知到的质量恒定,瞬时码率也会随场景复杂度波动。
  • 对于快速运动或细节丰富的场景会适当增大量化失真(因为人眼不敏感),反之对于静止或平坦区域则减少量化失真。
  • CRF是x264和x265的默认码率控制方式,也可用于libvpx。
  • CRF值越大视频压缩率越高,但视频质量越低,各codec的CRF取值范围、默认值和建议值见下表。
codec 取值范围 默认值 建议值
x264 [0, 51] 23 [18, 28]
x265 [0, 51] 28 ?
VP9 [0, 63] - [15, 35]
  • 使用FFmpeg中指定x264编码的crf值的示例如下。
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
  • 如果你不确定要使用什么CRF,从默认值开始,并根据对输出的主观印象进行更改。如果质量没有足够好则较低的CRF。如果文件太大了则选择更高的CRF。更改±6会导致码率大小的一半/两倍左右的变化,±1会导致码率10%左右的变化。[2]

5. ABR(Average Bitrate)

指定平均码率。

  • 使用FFmpeg指定ABR的示例如下所示。
ffmpeg -s 1280x720 -i <input> -c:v libx264 -b:v 1M <output>
ffmpeg -s 1280x720 -i <input> -c:v libx265 -b:v 1M <output>
ffmpeg -s 1280x720 -i <input> -c:v libvpx-vp9 -b:v 1M <output>

2-Pass ABR

  • 允许编码器执行两次(或更多次)使得它可以估计未来的情况。第一遍计算编码的成本,在第二遍中更有效地使用可用比特。这确保了在特定比特率约束下输出质量最佳。
  • 对于x264,使用FFmpeg编码的示例:
ffmpeg -i <input> -c:v libx264 -b:v 1M -pass 1 -f null /dev/null
ffmpeg -i <input> -c:v libx264 -b:v 1M -pass 2 <output>.mp4
  • 对于x265,使用FFmpeg编码的示例:
ffmpeg -i <input> -c:v libx264 -b:v 1M -x265-params pass=1 -f null /dev/null
ffmpeg -i <input> -c:v libx264 -b:v 1M -x265-params pass=2 <output>.mp4
  • 对于VP9,使用FFmpeg编码的示例:
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -pass 1 -f null /dev/null
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -pass 2 <output>.webm
  • 这是为流式传输编码文件的最简单方法。有两点需要注意:
    1. 不知道最终的质量是什么,因此你必须做一些测试,以确保指定的码率实际上足够高,可以用于某些复杂的内容。
    2. 此模式的另一个缺点是可能存在比特率的本地峰值,这意味着可能发送超过客户端可以接收的峰值。

6. CBR(Constant Bitrate)

前面几个模式都属于可变码率VBR(Variable Bitrate),瞬时码率在波动。恒定码率与之相对,在更小的时间窗口保持码率的波动更小。

  • 可以通过启用nal-hrd选项强制编码器始终使用某个比特率[1]。输出文件需要是.ts(MPEG-2 TS),因为MP4不支持NAL填充。注意,如果视频源是易于编码的,此模式将浪费带宽,但它确保比特率在整个流中保持不变
ffmpeg -i <input> -c:v libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v 1M -minrate 1M -maxrate 1M -bufsize 2M <output>
  • 对于VP9,使用FFmpeg通过下面的命令控制:
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -minrate 1M <output>

7. VBV(Video Buffering Verifier)

视频缓冲校验提供了一种方法,以保证码率被限制在一定的最大值。

  • 适用场景:带宽约束下的流媒体; 直播(指定CRF,1-pass); VoD流媒体(目标比特率,2-pass)。
  • 可用于2-pass VBR(在两遍中使用它)。注意:使用1-pass方法也可以 - 根据x264开发人员 - 通常与2-pass一样好,但压缩效率低一些。
  • 可用于CRF编码,也称为“capped CRF”。
  • 使用-maxrate-bufsize选项打开VBV以设置最大比特率和预期的客户端缓冲区大小:
ffmpeg -i <input> -c:v libx264 -crf 23 -maxrate 1M -bufsize 2M <output>
ffmpeg -i <input> -c:v libx265 -crf 28 -x265-params vbv-maxrate=1000:vbv-bufsize=2000 <output>
  • VP9有一个类似的模式,不叫VBV,但背后是相同的思想:
ffmpeg -i <input> -c:v libvpx-vp9 -crf 30 -b:v 2M <output>
  • 使用受约束的ABR-VBV编码的方法:
ffmpeg -i <input> -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f null /dev/null
ffmpeg -i <input> -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 2 <output>
  • 对于x265:
ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=1:vbv-maxrate=1000:vbv-bufsize=2000 -f null /dev/null
ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=2:vbv-maxrate=1000:vbv-bufsize=2000 <output>
  • 对于VP9:
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f null /dev/null
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 2 <output>

如何设置bufsize?

  • 这取决于码率需要有多大的可变性。
  • 一个好的默认设置:缓冲区大小是最大速率的两倍,但建议可能会因流设置而异。
  • 如果客户端缓冲区较小(只需几秒钟),bufsize应该与maxrate大小相同。
  • 如果要限制流的码率,尝试将bufsize设置为最大速率的一半或更低。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352