0%

音视频通用技术

直接 alpha 与 预乘 alpha

直接 alpha

使用直接 alpha 描述 RGBA 颜色时,颜色的 alpha 值会存储在 alpha 通道中。例如,若要描述具有 60% 不透明度的红色,使用以下值:\((255, 0, 0, 255 × 0.6) = (255, 0, 0, 153)\)。其中153(\(153 = 255 × 0.6\))指示颜色应具有 60% 的不透明度。

预乘 alpha

使用预乘 alpha 描述 RGBA 颜色时,每种颜色都会与 alpha 值相乘:\((255 × 0.6, 0 × 0.6, 0 × 0.6, 255 × 0.6) = (153, 0, 0, 153)\)

预乘的好处:

  • 混合时可以少一次乘法;
  • 关键:只有预测的纹理才能进行Texture Filtering(除非使用最近邻插值)。使得带透明度的图片纹理可以正常进行线性插值。

对于直接alpha转换为预乘alpha的过程,要么预先使用工具进行处理,要么交由GPU处理。

视频或音频数据存储的2种格式packed和planar

假设有一路音频流,有左右两声道的数据。左声道用L表示,右声道用R表示。

存储时,如果是左右声道数据交替存储成一维数组,这种格式称为packed。格式为LRLRLR....LRLR

如果是分开存储成二维数组,这种格式称为planar。格式为LLLLLLLLLLLLLL和RRRRRRRRRRRRR

视频也是如此,但是对于YUV格式的数据,比音频多一种存储方法叫semi-planar,也就是半planar。一共2路存储,Y一路,UV一路,其中UV交叉存储。

视频播放器原理

视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。他们的过程如图所示。

flowchart TB
流数据 --解协议--> 封装格式数据;
封装格式数据 --解封装--> 音频压缩数据 --音频解码--> 音频原始数据 --> 音视频同步 --> 视频驱动/设备;
封装格式数据 --解封装--> 视频压缩数据 --视频解码--> 视频原始数据 --> 音视频同步 --> 音频驱动/设备;

其中各个阶段的具体格式:

  • 流数据/协议层:HTTP、RTMP、FILE……
  • 封装格式:MKV、MP4、FLV、MPEG-TS、AVI……
  • 压缩数据:H264、H265、MPEG2、AAC……
  • 原始数据:YUV420P、YUV422P、RGB24、PCM……

解协议:将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP、RTMP或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。

解封装:将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。

解码:将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。

视音频同步:根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

音视频压缩与传统数据压缩

无论是视频还是音频,在传统压缩算法看来,文件中基本么有什么冗余信息,音视频的压缩都是人们对音视频针对性开发压缩算法,去掉实际的冗余信息。

欢迎关注我的其它发布渠道