FFmpeg码率控制及内置编码参数介绍
一、码率控制参数
二、编码速度&编码质量&视觉优化参数
一、码率控制:
码率控制:码率控制是一种决定为每一个视频帧分配多少比特数的方法,它将决定文件的大小和质量的分配。
普通用户常用CRF、Two-Pass ABR 两种
CRF(Constant Rate Factor - 限制码率因子)
适用范围:
优点:该方法在输出文件的大小不太重要的时候,可以使整个文件达到特定的视频质量。该编码模式在单遍编码模式下提供了最大的压缩效率,每一帧可以按照要求的视频质量去获取它需要的比特数。
缺点:不好的一面是,你不能获取一个特定大小的视频文件,或者说将输出位率控制在特定的大小上。
参数解析:
1)量化比例的范围为0~51,其中0为无损模式,23为缺省值,51可能是最差的。该数字越小,图像质量越好。从主观上讲,18~28是一个合理的范围。18往往被认为从视觉上看是无损的,它的输出视频质量和输入视频一模一样或者说相差无几。但从技术的角度来讲,它依然是有损压缩。
2)若Crf值加6,输出码率大概减少一半;若Crf值减6,输出码率翻倍。通常是在保证可接受视频质量的前提下选择一个最大的Crf值,如果输出视频质量很好,那就尝试一个更大的值,如果看起来很糟,那就尝试一个小一点值。
使用方法 - 命令行:
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>
使用方法 - 源码
在代码中使用时,通过 av_dict_set 设置到 AVDictionary 中,并作为参数传递给 avcodec_open2 即可
av_opt_set(pCodecCtx->priv_data,"crf",modeValue.c_str(),AV_OPT_SEARCH_CHILDREN);
1
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,\ 换为 ^
其他码率控制方式
ABR(Average Bitrate - 平均码率)
解析:
它提供了某种“运行均值”的目标,终极目标是最终文件大小匹配这个“全局平均”数字(因此基本上来说,如果编码器遇到大量码率开销非常小的黑帧,它将以低于要求的比特率编码,但是在接下来几秒内的非黑帧它将以高质量方式编码方式使码率回归均值)使用两遍编码模式时这个方法变得更加有效,你可以和“max bit rate ”配合使用来防止码率的波动。
使用方法 - 命令行
ffmpeg -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>
使用方法 - 源码
如果设置了AVCodecContext中bit_rate的大小,则采用abr的控制方式
如果没有设置AVCodecContext中的bit_rate,则默认按照crf方式编码,crf默认大小为23
CBR(Constant BitRate - 恒定码率)
解析:
事实上根本就没有CBR这种模式,但是你可以通过补充ABR参数“模拟”一个恒定比特率设置。
使用方法 - 命令行
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>
CQP(Constant Quantization Parameter - 固定质量参数)
解析:
值越大,压缩率越大,质量越低。
使用方法 - 命令行
ffmpeg -i <input> -c:v libx264 -qp 23 <output>
ffmpeg -i <input> -c:v libx265 -x265-params qp=23 <output>
最大比特率的CRF/2-pass模式
你可以通过声明-maxrate确保最大码率限制在一个范围里,对于流式传输非常有用,可以配合到(2-Pass)ABR或CRF模式一起使用。
使用方法 - 命令行
// crf
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 模式。
使用方法 - 源码
av_opt_set(pCodecCtx->priv_data,"qp",modeValue.c_str(),AV_OPT_SEARCH_CHILDREN);
1
二、编码速度&编码质量&视觉优化参数
preset
主要调节编码速度和质量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢。
tune
主要配合视频类型和视觉优化的参数况。如果视频的内容符合其中一个可用的调整值又或者有其中需要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的)。
tune的值有:
film: 电影、真人类型;
animation: 动画;
grain: 需要保留大量的grain时用;
stillimage: 静态图像编码时使用;
psnr: 为提高psnr做了优化的参数;
ssim: 为提高ssim做了优化的参数;
fastdecode: 可以快速解码的参数;
zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。
profile
H.264有四种画质级别,分别是baseline, extended, main, high:
1、Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;
2、Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;(用的少)
3、Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),
也支持CAVLC 和CABAC 的支持;
4、High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式;
H.264 Baseline profile、Extended profile和Main profile都是针对8位样本数据、4:2:0格式(YUV)的视频序列。在相同配置情况下,High profile(HP)可以比Main profile(MP)降低10%的码率。
根据应用领域的不同,Baseline profile多应用于实时通信领域,Main profile多应用于流媒体领域,High profile则多应用于广电和存储领域。
设置preset、tune、profile
使用方法 - 命令行
命令行的方式详见文档。
使用方法 - 源码
av_dict_set(&dictParam,"preset","medium",0);
av_dict_set(&dictParam,"tune","zerolatency",0);
av_dict_set(&dictParam,"profile","main",0);
...
avcodec_open2(pCodecCtx, pCodec,&dictParam);
参考:
https://www.jianshu.com/p/aac3e2a209c3
https://blog.csdn.net/owen7500/article/details/51832035
https://trac.ffmpeg.org/wiki/Encode/H.264
https://www.cnblogs.com/tinywan/p/6402007.html
---------------------
作者:hey_manman
来源:CSDN
原文:https://blog.csdn.net/DONGHONGBAI/article/details/84776431
版权声明:本文为博主原创文章,转载请附上博文链接!
FFmpeg码率控制及内置编码参数介绍相关推荐
- python3.5怎么使用-Python3.5常见内置方法参数用法实例详解
本文实例讲述了Python3.5常见内置方法参数用法.分享给大家供大家参考,具体如下: Python的内置方法参数详解网站为:https://docs.python.org/3/library/fun ...
- python max函数_Python max内置函数详细介绍
Python max内置函数 max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the largest ite ...
- linux awk 内置函数详细介绍(实例)
原文地址为: linux awk 内置函数详细介绍(实例) 这节详细介绍awk内置函数,主要分以下3种类似:算数函数.字符串函数.其它一般函数.时间函数 一.算术函数: 以下算术函数执行与 C 语言中 ...
- python中的内置函数getattr()介绍及示例
python中的内置函数getattr()介绍及示例 其实getattr()这个方法最主要的作用是实现反射机制.也就是说可以通过字符串获取方法实例.这样,你就可以把一个类可能要调用的方法放在配置文件里 ...
- AWK再次认识--内置的参数,以及编写脚本
原本这是篇给公司内同事写的培训文章,对于初学awk的人还蛮有帮助,贴到这里与大家共享一下. 〇.前言 意见反馈,请mailto:datouwang@gmail.com. 一.AWK简介 AWK名字来源 ...
- ffmpeg 码率控制
-preset 取值范围10个等级,默认medium 选择越快,质量越差,文件越小,速度越快 -crf 取值范围18~28 值越大,质量越差,文件越小, ...
- FFmpeg码率控制
在实际开发中,码率控制的需求还是比较多, 码率控制主要有以下几种: 1.CQP(Constant Quantization Parameter ) 特点: 值越大,压缩率越大,质量越低.使用方法(虽然 ...
- stylus使用文档总结:内置方法+参数+条件+迭代+导入+继承
一.内置方法 返回各种颜色的比重(如red(color)等) 颜色函数是CSS预处里器中内置的颜色函数功能,这些功能可以对颜色值进行处理,例如颜色的变亮.变暗.渐变颜色等处理十分的方便. lighte ...
- Python3.9的69个内置函数(内建函数)介绍,并附简单明了的示例代码
Python 解释器内置(内建)了很多函数,这篇博文对它们进行逐一介绍,博主觉得有必要给出示例代码的会给出示例代码. 声明:博主(昊虹图像算法)写这篇博文时,用的Python的版本号为3.9.10. ...
- ASP内置对象详细介绍
请求对象-Request 对象是一种复杂的数据类型,是由属性和方法构成的具有特定功能的集合,脚本语言一般都是基于对象的语言,都提供了功能强大的对象,其中有两个最为重要的对象就是Request请求对象和 ...
最新文章
- Linux0.00内核为什么要自己设置0x80号陷阱门来调用write_char过程?
- Spark is not running in local mode, therefore the checkpoint directory must not be on the local……
- 了解Scaffold Generator (转载)
- Java恶意序列化背后的历史和动机
- Python的几种实现
- 通过Ant控制Hibernate操作数据库
- 比ISA更简单的监管利器,谈谈关于公司上网监管的一点事儿
- 网管,真的是我该选择的路吗?
- iTextSharp 页面设置
- [手机Linux]一,线刷小米6到开发版,获取root权限
- vb/vb.net开发技巧荟萃(九)
- 售前技能——自我定位
- 方舟手游服务器怎么发位置,方舟手游怎么把自己号传到服务器 | 手游网游页游攻略大全...
- 软件开发环境SDK安装及注意事项
- Linkflow CDP亮相GDMS全球数字营销峰会
- CSS——CSS实现各种三角形样式
- 排名第一的亚马逊关键词工具
- 第八场多校联盟 Problem A: 序号互换 【模拟】
- 联想Z5刷android11,联想Z5 Pro GT升级安卓10 ZUI_11.5.141稳定版-支持TWRP偷渡升级
- 电脑重启出现蓝屏提示“beginning dump of physical memory”解决方法