FFmpeg码率控制

   在实际开发中,码率控制的需求还是比较多, 码率控制主要有以下几种:

1、CQP(Constant Quantization Parameter )

特点:

     值越大,压缩率越大,质量越低。使用方法(虽然这里使用的是命令行的形式,但在编写代码时也有参考价值)。

ffmpeg -i <input> -c:v libx264 -qp 23 <output>
ffmpeg -i <input> -c:v libx265 -x265-params qp=23 <output>

仅适用于视频编码研究,除非确切知道自己在做什么,否则不要使用这种模式。

2、ABR(Average Bitrate)。使用方法:

fmpeg -i <input> -c:v libx264 -b:v 1M <output>
ffmpeg -i <input> -c:v libx265 -b:v 1M <output>
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M <output>

避免使用这种模式!x264 开发者甚至说永远不要用它,因为质量不可控。

3、CBR(Constant BitRate)

使用:

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 -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -minrate 1M <output>

输出文件需要是 .ts 文件,因为 MP4 不支持 NAL 填充,如果输入文件易于编码,使用这种方式会浪费带宽,适用于视频直播。

4、CRF(Constant Rate Factor)

使用方法:

ffmpeg -i <input> -c:v libx264 -crf 23 <output>
ffmpeg -i <input> -c:v libx265 -crf 28 <output>
ffmpeg -i <input> -c:v libvpx-vp9 -crf 30 -b:v 0 <output>

      x264 默认值是 23(推荐 17 ~ 28),x265 是28(推荐 24 ~ 34),可用值是 0 到 51。值越小编码质量越好,码率越高(每 -6,比特率加倍),值等于 0 时则为无损编码。注意:如果不是基于 ffmpeg 的播放器,可能无法解码无损压缩的视频。

      很方便,但比特率、文件大小不好控制 ,适用于文件存储或需要实现最好的质量的场景;不适用于流媒体。

       在代码中使用时,通过 av_dict_set 设置到 AVDictionary 中,并作为参数传递给 avcodec_open2 即可

5、Two-Pass ABR

用于限制输出文件的大小,比如预期视频文件有 10min(600s),200 MB:

200 * 8192 / 600 = ~2730 Kb
2730 - 128(音频常用的比特率) = 2602 kb

那么:

ffmpeg -y -i input -c:v libx264 -b:v 2600k -pass 1 -c:a aac -b:a 128k -f mp4 /dev/null && \
ffmpeg -i input -c:v libx264 -b:v 2600k -pass 2 -c:a aac -b:a 128k output.mp4

如果是 Windows 环境, /dev/null 换为 NUL,\ 换为 ^

6.VBV(Video Buffer Verifier)

       可以确保最大码率限制在一个范围里,对于流式传输非常有用,可以配合到 (2-Pass)ABR 或 CRF 模式一起使用,使用方法:

// crf & 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>

ffmpeg -i <input> -c:v libvpx-vp9 -crf 30 -b:v 2M <output>

// 2-pass abr & vbv
ffmpeg -i <input> -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f mp4 /dev/null
ffmpeg -i <input> -c:v libx264 -b:v 1M -maxrate 1M -bufsize 2M -pass 2 <output>



ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=1:vbv-maxrate=1000:vbv-bufsize=2000 -f mp4 /dev/null
ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=2:vbv-maxrate=1000:vbv-bufsize=2000 <output>


ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 1 -f webm /dev/null
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M -maxrate 1M -bufsize 2M -pass 2 <output>

       编写代码的话,指定 AVCodecContext 的 rc_max_rate 和 rc_buffer_size 即可。bufsize 根据你希望比特率获得多大的可变性而设置,默认为 maxrate 的两倍,如果想限制流的比特率,可以设置为 maxrate 的一半。

       配合 CRF 模式使用的时候,如果设置的 crf 值过低,视频码率可能超出 -maxrate 的时候,编码器会自动调整 crf,避免出现较大的码率波动。然而,x264 不会严格控制你指定的最大码率,除非使用 2 pass 模式。

7、preset、tune

       如果参数的设置有些复杂,可以使用 preset、tune 参数(编写代码时可以通过 av_dict_set 设置),preset 是一个用于控制编码速度压缩比的选项集合,编码速度越慢,压缩率越高。可选值有:

ultrafast
superfast
veryfast
faster
fast
medium – default preset
slow
slower
veryslow

不同选项的编码速度对比:

      在目标比特率和硬件配置基本一致的情况下。通常,比特率越高,编码所需的时间越多。

这是一个示例,显示了1080p视频的两次通过编码的(标准化)编码时间:

                                                                                        preset 编码速度对比

tune 可根据输入情况(不同的视频类型等)调整设置(比如对画面作出一些优化),可选值有:

film        – use for high quality movie content; lowers deblocking
animation   – good for cartoons; uses higher deblocking and more reference frames
grain       – preserves the grain structure in old, grainy film material(纹理调整)
stillimage  – good for slideshow-like content(适用于 ppt 等内容)
fastdecode  – allows faster decoding by disabling certain filters
zerolatency – good for fast encoding and low-latency streaming(适用于快速编码及低延迟流)
发布了538 篇原创文章 · 获赞 1318 · 访问量 194万+

猜你喜欢

转载自blog.csdn.net/fanyun_01/article/details/103734587
今日推荐