前言
`本博客主要记录音频的多通道Plane格式的处理。
一、音频的基本知识
先看具体解释,后面给出示意图
1.采样频率
常见采样率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz。采样率表示每秒采样多少次。比如44.1kHz就表示每秒采样44100次。
2.通道数
通道数可以用来描述同时用几个采样设备进行采样。
3.Plane格式和Packet格式
Plane格式意思是各通道数据单独存放。Packet格式是多通道数据交叉存放。
4.采样位数
常见采样位数有8位、16位、32位、64位。采样位数越大,音频音质越高。而这个位数具体指什么意思呢?位数其实经常用来描述一个采样点占用的字节数,比如32位,就说明一个采样点占用了4字节。
5.示例
上面文字叙述显得苍白无力,看几个图就明白了。下面格式分别对应的数据存储样式:
(1)单通道,采样位数16位:
采样位数8位就说明一个采样点占两字节,采样位数32位就说明一个采样点占四字节,以此类推。
(2)双通道,采样位数32位,Packet格式:
各通道数据交叉存放,如下LRLRLR…
(3)双通道,采样位数32位,Plane格式:
通道的数据分开存放。
这三个例子可以达到举一反三的效果,其他的"x位、y个通道、Plane(Packet)"类型,就都能知道具体数据存放样式了。
二、音频格式
音频格式有以下方式,还涉及到位宽,Plane格式还是Packet格式。最后一个字母带P的就是Plane格式,其他就是Packet格式。
常见的音频格式及对应的位宽
enum AVSampleFormat {
AV_SAMPLE_FMT_NONE = -1,
AV_SAMPLE_FMT_U8, // unsigned 8 bits, packet
AV_SAMPLE_FMT_S16, // signed 16 bits, packet
AV_SAMPLE_FMT_S32, // signed 32 bits, packet
AV_SAMPLE_FMT_FLT, // float packet
AV_SAMPLE_FMT_DBL, // double packet
AV_SAMPLE_FMT_U8P, // unsigned 8 bits, planar
AV_SAMPLE_FMT_S16P, // signed 16 bits, planar
AV_SAMPLE_FMT_S32P, // signed 32 bits, planar
AV_SAMPLE_FMT_FLTP, // float 32 bits, planar
AV_SAMPLE_FMT_DBLP, // double, planar
AV_SAMPLE_FMT_S64, // signed 64 bits, packet
AV_SAMPLE_FMT_S64P, // signed 64 bits, planar
AV_SAMPLE_FMT_NB // Number of sample
};
三、音频多声道Plane格式的处理
平时播放设备播放所需要的pcm裸流,是需要Packet格式。也就是各通道数据交叉存放。有时候对视频里的音频或者封装后的音频(如MP3)进行解码后,音频数据可能是以多通达Plane格式存放的。所以在送到播放设备前,需要我们将Plane格式转化为Packet格式。其实经过上面的示例图之后,就很容易转了,只需要知道音频的通道数、位宽,就可以将数据进行去Plane化(Plane转Packet)。
比如说有一个32位的三通道的Plane格式,需要转换成Packet格式。那么音频原样式为:
上面分别对应通道1、通道2、通道3。(通道3里面的X是我随便表示的,我知道一般表示有L(左声道)、R(右声道),但是往上3声道4声道怎么表示就不太清楚了,这个不是重点)。
上面就是32位的三通道的Plane格式存放样式。一般解码后会存放一个data中,1、2、3…声道数据分别存放在data[0]、data[1]、data[2]…中。
所以对于三通道,如果想要将Plane格式转换为Packet格式,就需要对data[0]、data[1]、data[2]中的数据进行交叉。比如示例数据中位宽是32位,那么就需要我们四字节四字节的交叉起来。交叉后的样式为: