ffmpeg h264设置

1. H264编码控制

ffmpeg中采用H264,H265标准编码时,可能需要设置profile、preset和tune,ffmpeg中需要采用额外参数AVDictionary传入avcodec_open2()函数中实现。

1.1 profile

H.264有四种画质级别,分别是baseline, extended, main, high:

profile取值	含义	释义
baseline	基本画质	支持I/P 帧,只支持无交错(Progressive)和CAVLC
extended	进阶画质	支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC(用的少)
main	主流画质	提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),也支持CAVLC 和CABAC 的支持
high	高级画质	在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则多应用于广电和存储领域。

代码实现:

// profile
av_dict_set(&param, "profile", "main", 0);

1.2 preset

preset值	释义
ultrafast	极快
superfast	超快
veryfast	非常快
faster	更快
fast	快
medium	中
slow	慢
slower	更慢
veryslow	非常慢
placebo	超慢

编码加快,意味着信息丢失越严重,输出图像质量越差。

他们之间的区别这取决于源材料,目标比特率和您的硬件配置。 通常,比特率越高,编码所需的时间越多。
这是一个示例,显示了1080p视频的两次通过编码的(标准化)编码时间:

从中到慢,所需时间增加了约40%。 相反,变慢会导致所需时间增加大约100%(将花费两倍的时间)。 与中等速度相比,veryslow需要原始编码时间的280%,而质量较慢的速度只有很少的改进。
使用快速可节省大约10%的编码时间,快则可节省25%。 超快将节省55%的成本,但质量要低得多。

代码实现:

// preset
av_dict_set(&param, "preset", "veryfast", 0);

如果未配置该选项,或者采取较慢的速度,会导致CPU消耗过大的问题。

1.3 tune

主要配合视频类型和视觉优化的参数况。如果视频的内容符合其中一个可用的调整值又或者有其中需要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的)。

tune值	释义
film	电影、真人类型
animation	动画
grain	需要保留大量的grain时用
stillimage	静态图像编码时使用
psnr	为提高psnr做了优化的参数
ssim	为提高ssim做了优化的参数
fastdecode	可以快速解码的参数
zerolatency	零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码

代码实现:

// tune
av_dict_set(&param, "tune", "zerolatency", 0);

2. h264 码率控制

2.1 VBR与CBR的含义和区别

VBR是动态码率。CBR是静态码率。

VBR(Variable
Bitrate)动态比特率。也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么比特率,这是以质量为前提兼顾文件大小的方式。
VBR也称为动态比特率编码,使用这个方式时,你可以选择从最差音质/最大压缩比到最好音质/最低压缩比之间的种种过渡级数,在MP3文件编码之时,程序
会尝试保持所选定的整个文件的品质,将选择适合音乐文件的不同部分的比特率来编码。主要优点是可以让整首歌都能大致达到我们的品质要求,缺点是编码时无法
估计压缩出来的文件大小。

CBR(Constants Bit Rate)即固定码率,就是静态(恒定)比特率的意思,CBR是一种固定采样率的压缩方式。优点是压缩快,能被大多数软件和设备支持,缺点是占用空间相对大,效果不十分理想,现已逐步被VBR的方式取代。

固定码率是一个用来形容通信服务质量(QoS,Quality of Service)的术语。和该词相对应的词是可变码率或可变比特率(英文variable bit rate,缩写VBR)。

当形容编解码器的时候,CBR编码指的是编码器的输出码率(或者解码器的输
入码率)应该是固定制(常数)。当在一个带宽受限的信道中进行多媒体通讯的时候CBR是非常有用的,因为这时候受限的是最高码率,CBR可以更好的易用这
样的信道。但是CBR不适合进行存储,因为CBR将导致没有足够的码率对复杂的内容部分进行编码(从而导致质量下降),同时在简单的内容部分会浪费一些码
率。

2.2 ffmpeg设置方法

ffmpeg中CBR(固定码率控制)的设置:

c->bit_rate = br;
c->rc_min_rate =br;
c->rc_max_rate = br; 
c->bit_rate_tolerance = br;
c->rc_buffer_size=br;
c->rc_initial_buffer_occupancy = c->rc_buffer_size*3/4;
c->rc_buffer_aggressivity= (float)1.0;
c->rc_initial_cplx= 0.5; 

ffmpeg中VBR(可变率控制)的设置:

c->flags |= AV_CODEC_FLAG_QSCALE;
c->rc_min_rate =min;
c->rc_max_rate = max; 
c->bit_rate = br;

2.3 试用场景

VBR 适合的应用场景是媒体存储,而不是网络传输。

其实实际网络传输中所谓的 CBR 一般都是
ABR(平均比特率),即只要是单位时间内把码率控制在额定码率就可以了,因为编码输出本来就有缓冲可以起到平滑波动的作用。

严格意义上的 CBR 是
每一帧都分配同样的码字,试想一下,如果某一帧所需要的码字本来就很少,而你却一定要给它分配很多码字,那不是浪费么?另一方面,如果某一帧所需要的码字
本来就多,而你却给得很少,那这帧的效果会很差。这样编下来,整体序列质量会忽好忽坏地不停发生跳变,反而对视觉冲击很大;因此
ABR 才是最适合网络传输的方案。
本文出处:http://blog.csdn.net/austinblog/article/details/28426587

参考:

  1. https://www.w3school.com.cn/htmldom/dom_intro.asp
  2. https://blog.csdn.net/Martin_chen2/article/details/105772872
  3. https://www.cnblogs.com/jameszh/p/4237619.html
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baibingql

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值