音视频学习从零到整(1)
音视频学习从零到整(2)
音视频学习从零到整(3)
音视频学习从零到整(4)
音视频学习从零到整(5)
音视频学习从零到整(6)
一. H264基本概念.
I帧: 关键帧,采用帧内压缩技术.
- 举个例子,如果摄像头对着你拍摄,1秒之内,实际你发生的变化是非常少的.1秒钟之内实际少很少有大幅度的变化.摄像机一般一秒钟会抓取几十帧的数据.比如像动画,就是25帧/s,一般视频文件都是在30帧/s左右.对于一些要求比较高的,对动作的精细度有要求,想要捕捉到完整的动作的,高级的摄像机一般是60帧/s.那些对于一组帧的它的变化很小.为了便于压缩数据,那怎么办了?将第一帧完整的保存下来.如果没有这个关键帧后面解码数据,是完成不了的.所以I帧特别关键.
P帧: 向前参考帧.压缩时只参考前一个帧.属于帧间压缩技术.
- 视频的第一帧会被作为关键帧完整保存下来.而后面的帧会向前依赖.也就是第二帧依赖于第一个帧.后面所有的帧只存储于前一帧的差异.这样就能将数据大大的减少.从而达到一个高压缩率的效果.
B帧: 双向参考帧,压缩时即参考前一帧也参考后一帧.帧间压缩技术.
- B帧,即参考前一帧,也参考后一帧.这样就使得它的压缩率更高.存储的数据量更小.如果B帧的数量越多,你的压缩率就越高.这是B帧的优点,但是B帧最大的缺点是,如果是实时互动的直播,那时与B帧就要参考后面的帧才能解码,那在网络中就要等待后面的帧传输过来.这就与网络有关了.如果网络状态很好的话,解码会比较快,如果网络不好时解码会稍微慢一些.丢包时还需要重传.对实时互动的直播,一般不会使用B帧.
- 如果在泛娱乐的直播中,可以接受一定度的延时,需要比较高的压缩比就可以使用B帧.
- 如果我们在实时互动的直播,我们需要提高时效性,这时就不能使用B帧了.
二. GOF(Group of Frame)一组帧
如果在一秒钟内,有30帧.这30帧可以画成一组.如果摄像机或者镜头它一分钟之内它都没有发生大的变化.那也可以把这一分钟内所有的帧画做一组.
什么叫一组帧?
就是一个I帧到下一个I帧.这一组的数据.包括B帧/P帧.我们称为GOF.
GOF有什么好处了?它能解决什么问题了?
这个与我们接下来所学习的内容有关了.
三. SPS/PPS
SPS/PPS实际上就是存储GOP的参数.
SPS: (Sequence Parameter Set,序列参数集)存放帧数,参考帧数目,解码图像尺寸,帧场编码模式选择标识等.
- 一组帧的参数集.
PPS:(Picture Parameter Set,图像参数集).存放熵编码模式选择标识,片组数目,初始量化参数和去方块滤波系数调整标识等.(与图像相关的信息)
- 熵编码模式,片组数目等这些我们会在后面的内容讲解到.大家在这里主要了解到SPS/PPS即可.
大家只要记住,在一组帧之前我们首先收到的是SPS/PPS数据.如果没有这组参数的话,我们是无法解码.
如果我们在解码时发生错误,首先要检查是否有SPS/PPS.如果没有,是因为对端没有发送过来还是因为对端在发送过程中丢失了.
SPS/PPS数据,我们也把其归类到I帧.这2组数据是绝对不能丢的.
那么下面我们来看一下实际开发中遇到的问题.
四. 视频花屏/卡顿原因
我们在观看视频时,会遇到花屏或者卡顿现象.那这个与我们刚刚所讲的GOF就息息相关了.
- 如果GOP分组中的P帧丢失就会造成解码端的图像发生错误.
- 为了避免花屏问题的发生,一般如果发现P帧或者I帧丢失.就不显示本GOP内的所有帧.只到下一个I帧来后重新刷新图像.
- 当这时因为没有刷新屏幕.丢包的这一组帧全部扔掉了.图像就会卡在哪里不动.这就是卡顿的原因.
所以总结起来,花屏是因为你丢了P帧或者I帧.导致解码错误. 而卡顿是因为为了怕花屏,将整组错误的GOP数据扔掉了.直达下一组正确的GOP再重新刷屏.而这中间的时间差,就是我们所感受的卡顿.
五. 视频都有哪些视频编解码器?
X264/X265
X264: 是目前最使用最广泛X264编解码器.这个性能也是非常优秀.如果是使用软编解码基本上都是使用的X264. 那么X265也逐渐开始成熟了.但是在直播系统里,因为它的压缩比更高,它占用的CPU也是非常高的.在直播里,如果用X265的话,CPU就抖然就上去了.所以直播间里一般不会用H265.在点播系统里可以尝试使用X265.
OpenH264. 相对于X264性能要低一些.但是它有一个特点.支持SVC视频技术.什么是SVC视频技术,就是将视频分层传输.将数据分为小中大.3个部分.如果网络差,就只发最小的内核的视频帧.那么网络稍好就将中间的帧发送出去.如果网络补充就把全部的数据发送出去.发送到对端.将3层叠加在一起就还原原来的视频数据.如果网络差,只发送了内核层数据.那么就能看到视频图像的大概信息,但是不够清晰.每加一层就清晰一些.这就是SVC技术.但是它不好的一点就是移动端.因为我们移动端SVC技术标准很多硬件不支持.如果你要用SVC,你的移动端就不能用硬件来编解码.只能使用软编.使用软编就意味着只能用CPU. 对CPU是有很大的消耗的. 这就是一个取舍.你想要定制带宽,就不能使用手机硬件来编码.如果你要硬件编码就不能使用SVC技术.
vp8/vp9: 这是Google推出的.vp8是针对于x264.vp9是针对于x265.
关于H265这篇文章我个人觉得非常不错.通俗易懂,能让开发者比较全面了解.
https://blog.csdn.net/shaoqigulang/article/details/72915477