目录
背景
5G网络作为第5代的移动通信网络,它的网络峰值传播速度可1以达到10Gbps/s.这比4G的的传输速度快数百倍.举个例子,整部超高画质电影下载可在1秒钟之内下载完成.
当然,随着5G技术的诞生,用在智能终端分享3D电影,游戏或者超高画质节目的时代已经毫无悬念的向我们走来.
想必大家也逐步了解,国内外的互联网公司也已经布局音视频,3D技术方面的开发者招聘和相关产品研发.目前落地推广最普遍的就是直播类项目和小视频类的项目.当然未来的方向肯定不止如此.
编码
一、为什么编码
编码就是按照一定的格式记录采样和量化后的数据.
从存储角度和网络传输以及通用性 3个角度,压缩已经成了不可或缺的动作.压缩编码最基本的指标,就是压缩比. 压缩比通常都是小于1(如果等于或者大于1,是不是就失去了编码的意义了.编码的目的就是为了压缩数据体量).
二、硬编码、软编码
硬编码: 使用非CPU进行编码,例如使用GPU芯片处理
软编码: 使用CPU来进行编码计算.
硬编码:性能高,低码率下通常质量低于硬编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。
软编码: 实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点
硬编码,就是使用GPU计算,获取数据结果,优点速度快,效率高.
软编码,就是通过CPU来计算,获取数据结果.
三、压缩
压缩算法分为2种,有损压缩与无损压缩.
无损压缩:解压后的数据可以完全复原,在常用的压缩格式中,无损压缩使用频次较低
有损压缩:解压后数据不能完全复原,会丢失一部分信息.压缩比越小,丢失的信息就会越多.信号还原的失真就会越大. 需要根据不同的场景(考虑因素包括存储设备,传输网络环境,播放设备等)选用不同的压缩编码算法.
四、框架
硬解码
视频: VideoToolBox框架
音频: AudioToolBox 框架
软解码
视频: 使用FFmpeg,X264算法解码
音频: 使用fdk_aac 解码
播放
ijkplayer 播放框架
kxmovie 播放框架
编码概念
一、压缩可能性
视频压缩,该从那几个方向去进行数据的压缩了? 实际上压缩的本质都是从冗余信息开始出发压缩的. 而视频数据之间是有极强的相关性.也就是这样会产生大量的冗余信息.这样的冗余包括空间上的冗余信息和时间上的冗余信息.
使用帧间编码技术可以去除时间上的冗余信息,具体包括如下
-
运动补偿: 运动补偿是通过先前的局部图形来预测,补偿当前的局部图像.它是减少帧序列冗余信息很有效的方法.
-
运动表示: 不同区域的图像需要使用不同的运动矢量来描述运动信息
-
运动估计: 运动估计就是从视频序列中抽取运动信息的一整套技术.
二、IPB帧
视频压缩中,每帧代表着一副静止的图像.而进行实际压缩时,会采用各种算法以减少数据的容量.其实IPB帧是最常用的一种方式:
I帧: 帧内编码帧(intra picture),I帧通常是每个GOP(MPEG所使用的一种视频压缩技术)的第一帧.经过适度的压缩.作为随机访问的参考点,可以当做静态图像.I帧可以看做一个图像经过压缩后的产物.I帧压缩可以得到6:1的压缩比而不会产生任何可察觉的模糊现象.I帧压缩去除了视频空间的冗余信息.
P帧: 前后预测编码帧(predictive-frame),通过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像.
B帧: 双向预测编码帧(bi-directional interpolated prediction frame),既要考虑源图像序列前面已编码帧,又要顾及源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像.
如果从编码的角度,获取我们顺序思考会存在难度.但如果我们从解码的角度来思考就显得不是那么不可理解了.
I帧,自身可以通过视频解码算法解压成一张单独的完整的视频画面.所以I帧去掉的是视频帧在空间维度上的冗余信息.
P帧,需要参考前面的一个I帧或P帧解码成一个完整的视频画面
B帧,需要参考前面的一个I帧或者P帧以及后面的一个P帧来生成一个完整的视频画面.
所以,P和B帧去掉的视频帧在时间上维度上的冗余信息.
三、解码中PTS 与 DTS
PTS(Presentation Time Stamp),主要用于解码节点进行视频的同步和输出.
DTS(Decoding Time Stamp),主要用于视频的解码;
在没有B帧的情况下,DTS和PST的输出顺序是一样的.因为B帧会打乱了解码和显示顺序.所以一旦存在B帧,PTS和DTS势必会不同.实际上在大多数编解码标准中,编码顺序和输入顺序并不一致.于是需要PTS和DST这2种不同的时间戳.
四、 GOP概念
两个I帧之间形成的一组图片,就是GOP(Group of Picture).
通常在编码器设置参数时,必须会设置gop_size的值.其实就是代表2个I帧之间的帧数目. 在一个GOP组中容量最大的就是I帧.所以相对而言,gop_size设置的越大,整个视频画面质量就会越好.但是解码端必须从接收的第一个I帧开始才可以正确解码出原始图像.否则无法正确解码.
行者常至,为者常成!