音视频编解码总结(实习轮岗)

音视频编解码总结

  编解码本质就是压缩解压,一切的一切都是围绕着如何实现低资源的存储和传输。在这个过程中还要去找到一个有损压缩和保证质量的平衡点。

在这里插入图片描述


  视频是连续图像构成的,RGBYUV都作为图像的表示方法。RGB通过三种颜色不同强度的组合来形成任意可见色。YUV根据人眼对光感敏感色度次之的特性,用一个通道Y来存储亮度信息,两个通道UV来存储色度信息,过程中可以适当对色度数据进行压缩,这样虽然是有损的,但是一定程度上不会影响人眼对图像质量的感知。具体来说的话,就是YUV的色度子采样机制,让多个亮度像素共用一个色度像素,这样就对色度数据进行了压缩。在还原(渲染)时再把色度分辨率拉回同亮度即可。(在同等条件下,虽然YUV+子采样的存储形式会比RGB节省空间,但是这还是远远不能满足存储和传输要求)

  RGB的存在是因为当前几乎所有的输入输出设备本质上只支持RGB,而对YUV格式的数据,是需要内部进行处理后间接支持的。另外RGBYUV之间有转换公式,程序中可以用矩阵乘法来运算。


进一步将YUV数据进行压缩(编码)

在这里插入图片描述

  帧内预测就是为了压缩空间冗余数据,即图像中很多相邻的像素点往往都是相似的。具体来说比如H264会对一帧图像划分成宏块的形式,默认亮度16×16,色度8×8,亮度和色度是独立预测的。不过如果说一个宏块内的数据差异过于大的话,那么还会继续灵活划分为更小的子块。之后可以进行相邻宏块的预测(已经编码部分来预测尚未编码部分图像),将当前宏块的左侧临近列和上方临近行作为参考,同时选择合适的预测模式。这样只需对实际值和预测值之间的差别(残差)进行编码即可,残差一般是比较小的。

  帧间预测就是为了压缩时间冗余数据,即相邻两帧的内容几乎不会有太大差异,大部分只是一些图像的位移(除非是场景之间的切换)。具体来说就是找到前一个参考帧中跟自己非常相似的宏块,之后加上矢量信息进行编码,而不需要将当前宏块所有信息进行编码。

  参考帧分为I、P、BI帧的话为关键帧,不需要任何其它帧就能进行还原渲染,只能进行帧内压缩,压缩率低。P帧需要参考之前的IP帧进行还原。而B帧需要参考前后两个方向的参考帧进行还原,压缩率最高,和P帧一样可以采用帧内和帧间预测技术。

  GOP:一个场景的若干帧,首帧为I帧,因为一个场景下,相邻帧的变化不会特别明显,所以划为一组。但是如果时间过长的话,为了减少误差也要分为多个GOP

  buffer:因为帧间预测需要参考编码好的帧,而一个参考帧可能是多个其他帧参考的对象,此时就不能说用一次就重建一次,这样操作是重复的。所以需要缓存队列缓存编码好的再解码重建的帧来给后续编码的帧作为参考帧。之所以不拿原始帧作为参考,是因为原始帧和编码再重建帧宏块的划分并不完全一致,而解码时只有编码再重建的帧作为参考,没有原始帧。为了对标解码流程,所以不能是原帧作为参考。

扫描二维码关注公众号,回复: 15058746 查看本文章

  时间戳DTSPTS:前者为解码时间,后者为显示时间。没有B帧的话,I帧P帧都是解码即显示的。但有了B帧之后,I帧依旧解码即显示,但P帧有可能解码后需要等其前边的B帧解码显示后自己再显示,所以这种情况下,DTSPTS就会存在一个时间差。

  交换DCT:图像中的灰度值变化缓慢的地方称为低频,如轮廓部分。反之称为高频,如图像边缘和噪点。因为人眼的视觉敏感度是有限的,所以适当的消除一些高频信息,对视觉影响不大。将一个宏块做交换处理后,使得高频信息放到右下角,低频信息放到左上角。

  量化:就是做一个除法,量化值QP越大则量化的粒度越高,压缩率越大,码率更小,视频质量越低,呈现出来就是马赛克比较大,画面不细腻,画面比较模糊。反之,压缩率低,码率大,质量高,画面细腻,细节丰富。最终使得宏块右下角都基本为0

  熵编码:去除信息熵冗余,因为之前量化后的数据右下角基本为0,为了使得最后码流中能有更多的连续0便于压缩,所以采用了重排序机制('Z'字形)。之后再采用一个编码算法,有定长编码和变长编码两种方式。最后输出01串的码流。


  不同的封装格式就是用不同容器将不同排列方式的音频和视频流(帧)进行盛放,在使用时需要解封装。

  

笔记:

Ubuntu下FFmpeg的安装方式_Lu Zelin的博客-CSDN博客

音视频入门基础知识_Lu Zelin的博客-CSDN博客

H264基本概念(入门)_Lu Zelin的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/qq_40342400/article/details/129730043