文章目录
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(¶m, "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(¶m, "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(¶m, "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
参考: