51
STM32 音频应用

STM32 音频应用

Embed Size (px)

Citation preview

STM32 音频应用

Audio Engine(主机)

2

STM32 Audio Components 3

Common AddonsAddons CodecsCodecs

Player

Recorder

Generic Codec

Synchronizer

Equalizer

Loudness

Mixer

PDM

SRC

MP3 Enc

MP3 Dec

WMA Dec

AAC Dec

Speex

ADPCM-IMA

G.726

G.711

Mus

icV

oice

Out Interface

In Interface

Tag Extractor

Codecs

Presentation Title

4

音频格式——wav• WAV是微软公司(Microsoft)开发的一种声音文件格式,在多媒体中使用的声波文件格式之一,它是以RIFF(Resource Interchange File Format 资源交互文件格式) 格式为标准的。每个WAV文件的头四个字节就是“RIFF”。WAV文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分,文件头中还包含了音频流的编码参数。

• WAV文件是非常简单的一种RIFF文件,它的格式类型为 “WAVE ”。RIFF块包含两个子块,这两个子块的ID分别是 “fmt ”和“data ” 。其中“fmt ”子块由结构PCMWAVEFORMAT所组成,其子块的大小就是 sizeof(PCMWAVEFORMAT),数据组成就是PCMWAVEFORMAT结构中的数据。

5

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

WAV ——文件格式

Field Length ContentsckID 4 Chunk ID: "RIFF"

cksize 4 Chunk size: 4 + 26 + 12 +(8 + M * Nc * Ns + (0 or 1))

WAVEID 4 WAVE ID: "WAVE"

ckID 4 Chunk ID: "fmt "cksize 4 Chunk size: 18

wFormatTag 2 Format code

nChannels 2 Nc

nSamplesPerSec 4 FnAvgBytesPerSec 4 F * M * Nc

nBlockAlign 2 M * Nc

wBitsPerSample 2 8 * M (float data) or 16 (log-PCM data)cbSize 2 Size of the extension:0

ckID 4 Chunk ID: "fact"cksize 4 Chunk size: 4

dwSampleLength 4 Nc * Ns

ckID 4 Chunk ID: "data"cksize 4 Chunk size: M * Nc * Ns

sampled data M * Nc * Ns Nc * Ns channel-interleaved M-byte samplespad 0 or 1 Padding byte if M * Nc * Nsis odd

6

WAVE文件格式说明表它是由多个区块组成,详细如下:

提示:“fact” ID 主要用于非PCM 格式M :每个采样的字节数

WAV——RIFF 7

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

Wave File Format

Wave files have a master RIFF chunk which includes a WAVE identifier followed by sub-chunks. The data is stored in little-endian byte order.

Field Length Contents

ckID 4 Chunk ID: "RIFF"

cksize 4 Chunk size: 4+n

WAVEID 4 WAVE ID: "WAVE"

WAVE chunks n Wave chunks containing format information and sampled data

WAV——Fmt 8

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

Format ChunkThe Format chunk specifies the format of the data. There are 3 variants of the Format

chunk for sampled data. These differ in the extensions to the basic Formant chunk.

Field Length ContentsckID 4 Chunk ID: "fmt "cksize 4 Chunk size: 16 or 18 or 40

wFormatTag 2 Format codenChannels 2 Number of interleaved channelsnSamplesPerSec 4 Sampling rate (blocks per second)nAvgBytesPerSec 4 Data ratenBlockAlign 2 Data block size (bytes)wBitsPerSample 2 Bits per sample

cbSize 2 Size of the extension (0 or 22)

wValidBitsPerSample 2 Number of valid bitsdwChannelMask 4 Speaker position maskSubFormat 16 GUID, including the data format code

续上

Format Code PreProcessor Symbol Data

0x0001 WAVE_FORMAT_PCM PCM

0x0003 WAVE_FORMAT_IEEE_FLOAT IEEE float

0x0006 WAVE_FORMAT_ALAW 8-bit ITU-T G.711 A-law

0x0007 WAVE_FORMAT_MULAW 8-bit ITU-T G.711 µ-law

0xFFFE WAVE_FORMAT_EXTENSIBLE Determined by SubFormat

9

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

The standard format codes for waveform data are given below. The references above give many more format codes for compressed data, a good fraction of which are now obsolete.

WAV——Fact

Fact Chunk All (compressed) non-PCM formats must have a Fact chunk (Rev. 3

documentation). The chunk contains at least one value, the number of samples in the file.

10

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

Field Length Contents

ckID 4 Chunk ID: "fact"

cksize 4 Chunk size: minimum 4

dwSampleLength 4 Number of samples (per channel)

WAV——Data

Field Length ContentsckID 4 Chunk ID: "data"cksize 4 Chunk size: n

sampled data n Samplespad byte 0 or 1 Padding byte if n is odd

11

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

Data ChunkThe Data chunk contains the sampled data.

PCM数据的存放方式:样本样本样本样本1 样本样本样本样本2

8位单声道位单声道位单声道位单声道 0声道 0声道8位立体声位立体声位立体声位立体声 0声道(左) 1声道(右) 0声道(左) 1声道(右)

16位单声道位单声道位单声道位单声道 0声道低字节 0声道高字节 0声道低字节 0声道高字节16位立体声位立体声位立体声位立体声 0声道(左)低字节 0声道(左)高字节 1声道(右)低字节 1声道(右)高字节

样本大小样本大小样本大小样本大小 数据格式数据格式数据格式数据格式 最大值最大值最大值最大值 最小值最小值最小值最小值

8位位位位PCM unsigned int 225 016位位位位PCM int 32767 -32767

WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。

WAV——((((实例实例实例实例))))1、、、、以下就经常见的一种格式以下就经常见的一种格式以下就经常见的一种格式以下就经常见的一种格式PCM(44字节字节字节字节)的的的的WAV文件头进行分析文件头进行分析文件头进行分析文件头进行分析

下下下下面数是面数是面数是面数是:::: spiritdsp48.wav( 大小大小大小大小798764 字节字节字节字节),,,,文件头如下文件头如下文件头如下文件头如下::::

• 地地地地址址址址00H-03H,,,,值为值为值为值为““““RIFF”标志标志标志标志;;;;

• 地地地地址址址址04H-07H,,,,值为值为值为值为““““24 30 0C 00”,,,,存储的是文件大小刨去存储的是文件大小刨去存储的是文件大小刨去存储的是文件大小刨去8字节后的值字节后的值字节后的值字节后的值,,,,注意这个是注意这个是注意这个是注意这个是little-endian 的的的的,,,,也就是高地址存低位也就是高地址存低位也就是高地址存低位也就是高地址存低位,,,,地地址存高位地地址存高位地地址存高位地地址存高位,,,,所以所以所以所以Size=000C3024H=798756字节字节字节字节,,,,比文件总大小少比文件总大小少比文件总大小少比文件总大小少8个字节个字节个字节个字节,,,,

这这这这8个字节就是个字节就是个字节就是个字节就是00H-07H;;;;

• 地址地址地址地址08H-0FH,,,,就是就是就是就是““““WAVEfmt ” 标记标记标记标记;;;;

• 地址地址地址地址10H-13H,,,,fmt格式的块大小格式的块大小格式的块大小格式的块大小,,,,这种格式时是这种格式时是这种格式时是这种格式时是““““10 00 00 00”,,,,也是也是也是也是little-endian 的的的的,,,,即块大小为即块大小为即块大小为即块大小为16,,,,也也也也有可能为有可能为有可能为有可能为18,,,,这时最后多了这时最后多了这时最后多了这时最后多了2个字节的附加信息个字节的附加信息个字节的附加信息个字节的附加信息。。。。其他格式的可能是其他格式的可能是其他格式的可能是其他格式的可能是20;;;;

• 地址地址地址地址14H-15H,,,,““““01 00”,,,,也是也是也是也是little-endian 的的的的,,,,标记编码方式标记编码方式标记编码方式标记编码方式,,,,一般为一般为一般为一般为0x0001;;;;

• 地址地址地址地址16H-17H,,,,““““02 00”,,,,也是也是也是也是little-endian ,,,,标记声道数标记声道数标记声道数标记声道数,,,,这里值为这里值为这里值为这里值为1。。。。注意注意注意注意1代表单声道代表单声道代表单声道代表单声道,,,,2代表双声道代表双声道代表双声道代表双声道;;;;

WAV——续上

• 地址地址地址地址18H-1BH,,,,““““80 BB 00 00”,,,,也是也是也是也是little-endian ,,,,标记采样频率标记采样频率标记采样频率标记采样频率,,,,这里这里这里这里为为为为48000Hz;;;;

• 地址地址地址地址1CH-1FH,,,,““““00 EE 02 00”每秒所需的字节数每秒所需的字节数每秒所需的字节数每秒所需的字节数,,,,也是也是也是也是little-endian ,,,,bytepersec=0002EE00H=192000( 字节字节字节字节)。。。。• ((((192000=频率频率频率频率*采样采样采样采样*通道数通道数通道数通道数,一次占的字节数一次占的字节数一次占的字节数一次占的字节数=48000*2*2))));;;;

• 地址地址地址地址20H-21H,,,,““““04 00”,,,,采样一次占字节数采样一次占字节数采样一次占字节数采样一次占字节数,,,,有些地方也叫数据块对齐单位有些地方也叫数据块对齐单位有些地方也叫数据块对齐单位有些地方也叫数据块对齐单位,,,,也是也是也是也是little-endian 的的的的,,,,• 这里是两个字节这里是两个字节这里是两个字节这里是两个字节。。。。声道数声道数声道数声道数*量化数量化数量化数量化数/8=2*16/8=4(字节字节字节字节);;;;

• 地址地址地址地址22H-23H,,,,““““10 00”,,,,量化数量化数量化数量化数,,,,也就是每个采样需要的也就是每个采样需要的也就是每个采样需要的也就是每个采样需要的bit数数数数,,,,也是也是也是也是little-endian 的的的的,,,,所以这里是所以这里是所以这里是所以这里是16位位位位;;;;

• 地址地址地址地址24H-27H,,,,““““64 61 74 61”,,,,就是数据标识符就是数据标识符就是数据标识符就是数据标识符““““data”了了了了;;;;

• 地址地址地址地址28H-2BH,,,,““““00 30 0C 00”,,,,存储的是文件大小刨去存储的是文件大小刨去存储的是文件大小刨去存储的是文件大小刨去44字节后的值字节后的值字节后的值字节后的值,,,,这个也是这个也是这个也是这个也是little-endian 的的的的,,,,Size=000C3000H=798720字节字节字节字节。。。。

音频解码格式之——MP3 14

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

MP3就是一种音频压缩技术,由于这种压缩方式的全称叫MPEG-1 Audio Layer3,所以人们把它简称为MP3。MP3

是利用MPEG Audio Layer 3 的技术,将音乐以1:10 甚至 1:12 的压缩率,压缩成容量较小的file,换句话说,能够在音质丢

失很小的情况下把文件压缩到更小的程度。而且还非常好的保持了原来的音质。

MP3也是一个数据压缩格式。它丢弃掉脉冲编码调制(PCM)音频数据中对人类听觉不重要的数据(类似于JPEG是一

个有损图像压缩),从而达到了小得多的文件大小。在MP3中使用了许多技术其中包括心理声学以确定音频的哪一部分可以

丢弃。MP3音频可以按照不同的位速进行压缩,提供了在数据大小和声音质量之间进行权衡的一个范围。

根据MPEG规范的说法,尽管有许多创造和推广其他格式的重要努力,MPEG-4标准中的AAC(Advanced Audio Coding)

将是MP3格式的接棒者。然而,由于MP3的空前的流通,在目前来说,其他格式并未能威胁其地位。MP3不仅有广泛的用

户端软体支持,也有很多的硬件支持,比如便携式数位音频播放器(泛指MP3播放器)、DVD和CD播放器。

mp3 ——标准标准标准标准

• MP3主要应用到MPEG的MPEG-1和MPEG-2两个音频压缩标准• MPEG-1

国际标准化组织(ISO)和国际电工委员会(IEC)组成的活动图像专家组(MPEG)颁布了ISO/IEC11172国际标准“对以1.5Mbits/s左右数据率进行的数字存储媒体的活动图像和相应声频的编码”,它用来对数字视频和声频信号进行数据率压缩,它于1992年11月最终定稿,即通常所称的MPEG-1。

• MEPG-2的声频标准(ISO/IEC DIS 13818-3)

是在原MEPG-1声频标准(ISO/IEC11172-3)的基础上发展起来的,

它有两版本MPEG-2/LSF和MPEG-2/Multichannel

• MPEG-Layer 3

MPEG 音频文件是MPEG1/2 标准中的声音部分,也叫MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即 Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3 这三种声音文件。

15

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

MPEG 支持的采样率支持的采样率支持的采样率支持的采样率

(kHz)通道通道通道通道 比特率比特率比特率比特率

(k/bps)

MPEG-1 32、44.1、48 1/2 32-448

MPEG-2 16、22.05、24 1/2/5 8-1K

Layer 压缩比压缩比压缩比压缩比

Layer-1 4:1

Layer-2 6:1 / 8 : 1

Layer-3 10:1/ 12: 1

mp3 - 格式特点格式特点格式特点格式特点

• MP3是一个数据压缩格式是一个数据压缩格式是一个数据压缩格式是一个数据压缩格式。。。。

• 它它它它丢弃掉脉冲编码调制丢弃掉脉冲编码调制丢弃掉脉冲编码调制丢弃掉脉冲编码调制((((PCM))))音频数据中对人类听觉不重要的数据音频数据中对人类听觉不重要的数据音频数据中对人类听觉不重要的数据音频数据中对人类听觉不重要的数据((((类似于类似于类似于类似于JPEG是一个有损图像压缩是一个有损图像压缩是一个有损图像压缩是一个有损图像压缩),),),),从而达从而达从而达从而达

到了小得多的文件大小到了小得多的文件大小到了小得多的文件大小到了小得多的文件大小。。。。

• MP3音频可以按照不同的位速进行压缩音频可以按照不同的位速进行压缩音频可以按照不同的位速进行压缩音频可以按照不同的位速进行压缩,,,,提供了在数据大小和声音质量之间进行权衡的一个范围提供了在数据大小和声音质量之间进行权衡的一个范围提供了在数据大小和声音质量之间进行权衡的一个范围提供了在数据大小和声音质量之间进行权衡的一个范围。。。。MP3格式使用了混格式使用了混格式使用了混格式使用了混

合的转换机制将时域信号转换成频域信号合的转换机制将时域信号转换成频域信号合的转换机制将时域信号转换成频域信号合的转换机制将时域信号转换成频域信号。。。。

• 32波段多相积分滤波器波段多相积分滤波器波段多相积分滤波器波段多相积分滤波器((((PQF)。)。)。)。

• 36或者或者或者或者12 tap 改良离散余弦滤波器改良离散余弦滤波器改良离散余弦滤波器改良离散余弦滤波器((((MDCT););););每个子波段大小可以在每个子波段大小可以在每个子波段大小可以在每个子波段大小可以在0...1和和和和2...31之间独立选择之间独立选择之间独立选择之间独立选择。。。。

• MP3不仅有广泛的用户端软件支持不仅有广泛的用户端软件支持不仅有广泛的用户端软件支持不仅有广泛的用户端软件支持,,,,也有很多的硬件支持比如便携式媒体播放器也有很多的硬件支持比如便携式媒体播放器也有很多的硬件支持比如便携式媒体播放器也有很多的硬件支持比如便携式媒体播放器((((指指指指MP3播放器播放器播放器播放器))))DVD和和和和CD播放器播放器播放器播放器。。。。

16

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

mp3 – 文文文文件结构件结构件结构件结构

MP3文件大体分为三部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1)

17

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

[ID3。。。。。。。。。。。。] ID3 V2的头的头的头的头,,,,大多数最新的大多数最新的大多数最新的大多数最新的MP3,,,,都有这个头都有这个头都有这个头都有这个头

[APE 头头头头] 用于用于用于用于APE格式的头格式的头格式的头格式的头,,,,现在也用于现在也用于现在也用于现在也用于MPEG

第一帧包含第一帧包含第一帧包含第一帧包含::::

1.MPEG 音频头音频头音频头音频头, 固定的固定的固定的固定的4 字节字节字节字节.((((当当当当Protection bit==0 时时时时,,,,帧头后会有帧头后会有帧头后会有帧头后会有16bit=2byte 的的的的CRC,,,,此时此时此时此时帧头大小为帧头大小为帧头大小为帧头大小为6字节字节字节字节))))

2.边信息边信息边信息边信息,,,,9/17/32 字节字节字节字节

[3.Xing 头头头头] 8----120字节字节字节字节,,,,如果是如果是如果是如果是VBR,,,,多数都有此多数都有此多数都有此多数都有此Xing头头头头,,,,而且只有第一帧有而且只有第一帧有而且只有第一帧有而且只有第一帧有

。。。。。。。。。。。。。。。。。。。。音频数据音频数据音频数据音频数据。。。。。。。。。。。。。。。。

第二帧第二帧第二帧第二帧((((帧头帧头帧头帧头,,,,边信息边信息边信息边信息,,,,数据数据数据数据。。。)。。。)。。。)。。。)

第三帧第三帧第三帧第三帧((((帧头帧头帧头帧头,,,,边信息边信息边信息边信息,,,,数据数据数据数据。。。)。。。)。。。)。。。)

。。。。。。。。。。。。

最后一帧最后一帧最后一帧最后一帧((((帧头帧头帧头帧头,,,,边信息边信息边信息边信息,,,,数据数据数据数据。。。)。。。)。。。)。。。)

[TAG 。。。。。。。。。。。。] 128字节的字节的字节的字节的ID3 V1信息信息信息信息,,,,如果没有前面的如果没有前面的如果没有前面的如果没有前面的ID3 V2,,,,多数都有这个多数都有这个多数都有这个多数都有这个ID3 V1的头的头的头的头

mp3 – ID3V1• ID3v1标签用来描述MPEG音频文件。包含艺术家,标题,唱片集,发布年代和流派。另外还有额外的注释空间。位于音频文件的最后固定为128字节。可以读取该文件的最后这128字节获得标签。

结构如下:

AAABBBBB BBBBBBBB BBBBBBBB BBBBBBBBBCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCD DDDDDDDD DDDDDDDD DDDDDDDD DDDDDEEE EFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFG

18

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

MP3 – ID3V2• D3V2 的版本

D3V2 到现在一共有4 个版本,但流行的播放软件一般只支持第3 版,既ID3v2.3。由于ID3V1 记录在MP3 文件的末尾,ID3V2 就只好记录在MP3 文件的首部了(如果有一天发布ID3V3,真不知道该记录在哪里)。也正是由于这个原因,对ID3V2 的操作比ID3V1 要慢。而且ID3V2 结构比ID3V1 的结构要复杂得多,但比前者全面且可以伸缩和扩展。

• 下面就介绍一下ID3V2.3:每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存

放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序

存放在MP3 文件的首部

(一)、标签头

在文件的首部顺序记录10 个字节的ID3V2.3 的头部。数据结构如下:char Header[3]; /*必须为"ID3"否则认为标签不存在*/ char Ver; /*版本号ID3V2.3 就记录3*/ char Revision; /*副版本号此版本记录为0*/ char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/ char Size[4]; /*标签大小,所有的标签帧的大小*/ (1).标志字节

标志字节一般为0,定义如下:abc00000 a --表示是否使用Unsynchronisation,一般不设置b --表示是否有扩展头部,一般没有(至少Winamp没有记录),所以一般也不设置c --表示是否为测试标签(99.99%的标签都不是测试用的啦,所以一般也不设置)

(2).标签大小一共四个字节,但每个字节只用7 位,最高位不使用恒为0。所以格式如下0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx计算大小时要将0 去掉,得到一个28 位的二进制数,就是标签大小(不懂为什么要这样做),计算公式如下:

total_size = (Size[0]&0x7F)*0x200000+(Size[1]&0x7F)*0x4000+(Size[2]&0x7F)*0x80+(Size[3]&0x7F)

19

mp3 – ID3V2((((续上续上续上续上))))(二)、标签帧

每个标签帧都有一个10 个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中的到内容大

小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。

帧头的定义如下:

char FrameID[4]; /*用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表*/ char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/ char Flags[2]; /*存放标志,只定义了6 位,稍后详细解说*/ (1).帧标识

用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:

TIT2=标题表示内容为这首歌的标题,下同TPE1=作者TALB=专集TRCK=音轨格式:N/M 其中N 为专集中的第N 首,M 为专集中共M 首,N 和M 为ASCII 码表示的数字TYER=年代是用ASCII 码表示的数字TCON=类型直接用字符串表示。。。。。。。。。(有很多种)

(2)帧大小这个可没有标签头的算法那么麻烦,每个字节的8 位全用,格式如下xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx算法如下:

FSize = Size[0]*0x1000000 +Size[1]*0x10000 +Size[2]*0x100 +Size[3];

(3).标志只定义了6 位,另外的10 位为0,但大部分的情况下16 位都为0 就可以了。格式如下:abc00000 ijk00000 a --标签保护标志,设置时认为此帧作废b --文件保护标志,设置时认为此帧作废c --只读标志,设置时认为此帧不能修改(但我没有找到一个软件理会这个标志) i --压缩标志,设置时一个字节存放两个BCD 码表示数字j --加密标志(没有见过哪个MP3 文件的标签用了加密) k --组标志,设置时说明此帧和其他的某帧是一组值得一提的是winamp 在保存和读取帧内容的时候会在内容前面加个'\0',并把这个字节计算在帧内容的大小中。

20

MP3——实例 21

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

• 下面我们用一个实例来介绍一下ID3:

• 标签头• Header

我们在文件的开始看见“49 44 43”

说明它是在ID3V2,版本号是3,那么

说明它是一个ID3V2.3.0的标签头。

• Flag

它是“00”,我们不关心它。

• Size

标签大小“00 00 0F 76”,我们用上

面的公式可以算出来它的大小是0x7F6

• 标签帧• 帧标识

“54 49 54 32”———TIT2(这里还有其它的如“TRCK”.”TCON”)

• 帧大小

“00 00 00 0D” –——13字节

• 帧标志

“00 00” –——基本上没有配置

• 帧内容

• “00 B2 BB D4 D9 C8 C3 C4 E3 B9 C2 B5 A5 ”-------“不再让你孤单”

MP3——音频帧格式音频帧格式音频帧格式音频帧格式

• 一个MPEG音频文件是许多的称为帧的较小部分组成的,通常,帧是独立的组成部分。每一帧都拥有自己的头和音频信息。没有文件头。

(一)帧头格式

帧头由每一帧的前4个字节(32位)组成。帧头的前11比特(或前12个位,见下文关于帧同步)总是固定的称作“帧同步”。因此,可以在整个文件中查找第

一个帧同步(即:必须找到一个值为255的且其后跟着三到四个最高位置1的字节。)然后读取整个头检查值是否正确。

下面是一个头内容图示,使用字符A到M表示不同的区域。在表格中你可以看到每一区域的详细内容。

AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM

22

12/25/2014

符号符号符号符号i 长度长度长度长度((((Bits))))

位置位置位置位置

((((bits))))描述描述描述描述

A 11 (31-21) 帧同步(所有位置为1)B 2 (20,19) MPEG版本(00:MPEG2.5;10:MPEG2;11:MPEG1)

C 2 (18,17) Layer描述(01:Layer3; 10:Layer2; 11:Layer1)

D 1 (16) 校验位(0-紧跟帧头后有两字节用作CRC校验,1-无)

E 4 (15-12) 采样率,详细请参考下表

F 2 (11,10) 采样频率,详细请参考下表

G 1 (9) 填充位(为了达到正确的比特率)0-无;1-有填充位

H 1 (8) 私有比特,可以用来做特殊应用。

I 2 (7,6) 表示声道, 00-立体声Stereo 01-Joint Stereo 10-双声道11-单声道

J 2 (5,4) 扩充模式(当声道模式为01是才使用)

K 1 (3) 文件是否合法,0-不合法1-合法

L 1 (2) 是否原版, 0-非原版1-原版

M 2 (1,0) 用于声音经降噪压缩后再补偿的分类,00-未定义01-50/15ms 10-保留11-CCITT J.17

续上 23

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

比特比特比特比特

率率率率

MPEG 1 MPEG 2, 2.5 (LSF)Layer I Layer II Layer III Layer I Layer II & III

0000 空闲空闲空闲空闲

0001 32 32 32 32 80010 64 48 40 48 160011 96 56 48 56 240100 128 64 56 64 320101 160 80 64 80 400110 192 96 80 96 480111 224 112 96 112 561000 256 128 112 128 641001 288 160 128 144 801010 320 192 160 160 961011 352 224 192 176 1121100 384 256 224 192 1281101 416 320 256 224 1441110 448 384 320 256 1601111 保留保留保留保留

下面是比特率索引表,(单位:Kbit/sec):

采样频率表:

采采采采样样样样

频率频率频率频率

MPEG 1MPEG 2

(LSF)MPEG 2.5

(LSF)

00 44100 Hz 22050 Hz 11025 Hz

01 48000 Hz 24000 Hz 12000 Hz

10 32000 Hz 16000 Hz 8000 Hz

11 保留保留保留保留

MP3——音频帧格式音频帧格式音频帧格式音频帧格式

• 除了上面这种固定比特率的音频帧之外,我们还有另外一种可变比特率的MP3 Xing格式。

(一)Xing格式

此tag由XING公司推出的算法/规范,所以叫做XING。

对于大多数的VBR文件都加了此头,但并不全是。此头位于MPEG音频头后面的某个特定位置。包好了此XING头的第一个帧,其后的数据是空的,所以即使解码器没有考虑到此头,也可以正常处理此帧。对于Layer III的文件来说,比如常见的MP3,此VBR放在边信息(side information)之后。

24

位置位置位置位置

长度长度长度长度

((((字节字节字节字节))))

含义含义含义含义 示例示例示例示例

0 44个ASCII字符的VBR头 ID,要么是Xing,要么是Info,无NULL结尾(普通字符串都以NULL,即\0结尾)

'Xing'

4 4

存放一个标志,用于表示接下来存在哪些域/字段,各字段逻辑或的结果.0x0001 -存在总帧数(Frames)字段0x0002 -存在文件大小(Bytes)字段0x0004 –存在TOC字段0x0008 –存在音频质量指示字段

0x0007 就就就就表示下面存在表示下面存在表示下面存在表示下面存在总总总总

帧数帧数帧数帧数,,,,文件大小总文件大小总文件大小总文件大小总

字节数字节数字节数字节数,,,,TOC表表表表

8 4 总帧数(Frames),大端[可选] 73448/12 4 文件总大小,单位字节,大端[可选] 45000

8/12/16 100 TOC表,大端[可选]8/12/16/108/112/116 4 音频质量指示音频质量指示音频质量指示音频质量指示,,,,最差最差最差最差0,,,,最好最好最好最好100,,,,大端大端大端大端[可选可选可选可选] 0

MP3——音频音频音频音频帧帧帧帧长度长度长度长度 25

• 如何计算帧长度,我们首先区分两个术语:帧大小和帧长度。

• 帧大小:即是每帧采样数表示一帧

中采样的个数,这是恒定值。其值入

右表所示:

• 帧长度:即是压缩时每一帧的长度,包括帧头。它将填充的空位也计算在内。Layer-I的一个空位长4字节,

Layer-II和Layer-III的空位是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧

注意:因为有填充和比特率变换,帧长度可能变化。

从头中读取比特率,采样频率和填充,

LyaerI使用公式:

帧长度(字节) = (( 每帧采样数 / 8 * 比特率 ) / 采样频率 ) + 填充 * 4 LyerII和LyaerIII使用公式:

帧长度(字节)= (( 每帧采样数 / 8 * 比特率 ) / 采样频率 ) + 填充例:

LayerIII比特率 128000,采样频率 44100,填充0 =〉帧大小 417字节

MPEG 1MPEG 2 (LSF)

MPEG 2.5 (LSF)

Layer I 384 384 384Layer II 1152 1152 1152Layer III 1152 576 576

MP3——音频音频音频音频帧持续时间帧持续时间帧持续时间帧持续时间 26

• 对于计算帧时间:这里我们有两种情况需要分别介绍:

• 固定比特率(CBR):用如下两个公式可以计算MP3的播放时间,以秒为单位:

1、、、、总总总总播播播播放时间放时间放时间放时间 = 文件大小文件大小文件大小文件大小÷÷÷÷比特率比特率比特率比特率×××× 8

2 每帧的每帧的每帧的每帧的播播播播放时间放时间放时间放时间 =每帧每帧每帧每帧比特率比特率比特率比特率/ 采样频率采样频率采样频率采样频率

对于CBR的文件,可以用上面的公式,通过第一帧,算出整个文件的播放时间。

• 可变比特率(VBR):我们可以通过VBR的头文件找到总的帧数,然后通过通过下面的公司去计算出总的播放时间:

VBR文件播放总时间文件播放总时间文件播放总时间文件播放总时间====总的帧数总的帧数总的帧数总的帧数××××每一帧的采样个数每一帧的采样个数每一帧的采样个数每一帧的采样个数÷÷÷÷采样率采样率采样率采样率

音频之音频之音频之音频之——WMA 27

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

• WMA(Windows Media Audio),它是微软公司推出的一种的音频格式,在较低的采样频率下能产生较好的音质。一般使用Windows Media Audio编码格式的文件以WMA作为扩展名,一些使用Windows Media Audio编码格式编码其所有内容的纯音频ASF文件也使用WMA作为扩展名。

• 现在WMA 有四种不同码率或者格式:

• 原始的或者基本的WMA 格式,它和MP3的压缩方式相似。

• 专业WMA, 它是一种新的和专业的编解码,支持多通道和高音频质量。• lossless codec,是微软开发的一种CD音频无损格式,能够使得还原出的声音与CD一模一样,而相同时间的数据量仅仅是CD的一半左右一般码率在720~890之间

• WMA Voice, 主要应用与对话 ,一些比较低比特率的场景.

Original WMA Codec

WMA Professional

WMA Lossless

WMA Voice

WMA——文件格式 28

• WMA的文件头信息:

WMA——文件格式 29

• WMA文件的基本组织单元叫做对象,wma文件宏观上由三个顶级对象组成:• 头对象(Header Object)

• 文件属性对象(全局文件属性)

• 流属性对象(定义一个媒体流及其属性)

• 内容描述对象(包含所有目录信息)

• 部件下载对象(提供播放部件信息)

• 流组织对象(逻辑上把多个媒体流组织在一起)

这些对象主要描述了非音频压缩数据的一些信息。例如作者,曲目信息,用户加入的命令信息,码流的码率等信息。

每个对象相当于一个信息描述符。

• 数据对象(Data Object)数据对象以数据包的形式存储压缩的音频数据,以便于实现网络传输。

• 其它顶级对象(Other top-level objects)——可选• 下面我们简介介绍一些这些对象:

1、头对象:

对象名称 数据结构 大小(位) 描述

对象ID GUID 128 固定为 30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C对象 Size QWORD 64 是包括对象ID、对象大小项本身、以及对象数据在内的总长度。而本表的对象大

小也可以看作是数据对象的起始偏移量

头对象个数 DWORD 32 指其它所有的子对象,这些子对象也被称为头对象

保留1 BYTE 8保留2 BYTE 8

WMA——文件格式(续上) 30

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

2、文件属性对象:

对象名称 数据结构 大小(位) 描述

对象 ID GUID 128 固定为A1 DC AB 8C 47 A9 CF 11 8E E4 00 C0 0C 20 53 65对象大小 QWORD 64文件 ID GUID 128文件大小 QWORD 64创建日期 QWORD 64数据包总数 QWORD 64 必须与数据对象中的数据包总数相等

播放持续时间 QWORD 64发送持续时间表 QWORD 64Preroll QWORD 64标志 DWORD 32最小数据包大小 DWORD 32最低数据包大小 DWORD 32最大比特率 DWORD 32

对象名称 数据结构 大小(位) 描述

对象 ID GUID 128 固定为 B5 03 BF 5F 2E A9 CF 11 8E E3 00 C0 0C 20 53 65对象大小 QWORD 64保留1 GUID 128 固定为 11 D2 D3 AB BA A9 CF 11 8E E6 00 C0 0C 20 53 65保留2 WORD 16头扩展对象大小 DWORD 32头扩展对象数据 BYTE varies

3、头扩展对象:

注:头扩展对象也可以包含子对象

WMA——文件格式(续上) 31

4、流属性对象:

当流类型为ASF_Audio_Media时,它典型的数据结构如下,我们能从它之中得到采样率,通道数,比特率等等。

对象名称 数据结构 大小(位) 描述

对象 ID GUID 128 固定为 91 07 DC B7 B7 A9 CF 11 8E E6 00 C0 0C 20 53 65对象大小 QWORD 64流类型 GUID 128 固定为 40 9E 69 F8 4D 5B CF 11 A8 FD 00 80 5F 5C 44 2B纠错类型 GUID 128 固定为 50 CD C3 BF 8F 61 CF 11 8B B2 00 AA 00 B4 E2 20时间补偿 QWORD 64特定类型数据长度 DWORD 32纠错数据长度 DWORD 32标志 WORD 16保留 DWORD 32特殊数据 BYTE varies纠错数据 BYTE varies

域名 Field type Size (bits)ID WORD 16通道数 WORD 16采样率 DWORD 32每秒平均字节数 DWORD 32块对齐 WORD 16比特率 WORD 16Codec Specific Data Size WORD 16Codec Specific Data BYTE varies

WMA——文件格式(续上) 32

5、数据对象:

对象名称 数据结构 大小(位) 描述

对象 ID GUID 128 固定为 36 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C对象大小 QWORD 64l文件 ID GUID 128数据包总数 QWORD 64保留 WORD 16数据包(1…….n) varies

音频之音频之音频之音频之——AAC 33

12/25/2014

• AAC音频编码格式,完整名称叫做"高级音频编码(Advanced Audio Codec)”。这种先进而高级的编码规范,是由Fraunhofer IIS公司(前MP3标准的制定者)、Dolby、AT&T、索尼、苹果等产业巨头共同开发的。

• AAC音频编码技术早在1997年就制定成型,当时在MPEG-2中作为了MPEG2-AAC音频编码规格之一,后来,在2000年被用在MPEG-4中(ISO 14496-3 Audio),所以现在变更为MPEG-4 AAC标准,也就是说,AAC已经成为MPEG4家族的主要成员之一,它是MPEG4第三部分中的音频编码系统。AAC可提供最多48个全音域音频通道。

• AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如PS,SBR等),衍生出了LC-AAC,HE-AAC,HE-AACv2三种主要的编码,LC-AAC就是比较传统的AAC,相对而言,主要用于中高码率(>=80Kbps),HE-AAC(相当于AAC+SBR)主要用于中低码 (<=80Kbps),而新近推出的HE-AACv2(相当于AAC+SBR+PS)主要用于低码率(<=48Kbps),事实上大部分编码器设成<=48Kbps自动启用PS技术,而>48Kbps就不加PS,就相当于普通的HE-AAC。

RAW

ADTS

ADIF

MP4Complexity& Information

LOAS LATM

AAC——规格规格规格规格• AAC共有9种规格,以适应不同的场合的需要:

• MPEG-2 AAC LC 低复杂度规格(Low Complexity)--比较简单,没有增益控制,但提高了编码效率,在中等码率的编码效率以及音质方面,都能找到平衡点

• MPEG-2 AAC Main 主规格

• MPEG-2 AAC SSR 可变采样率规格(Scaleable Sample Rate)

• MPEG-4 AAC LC 低复杂度规格(Low Complexity)------现在的手机比较常见的MP4文件中的音频部份就包括了该规格音频文件

• MPEG-4 AAC Main 主规格 ------包含了除增益控制之外的全部功能,其音质最好

• MPEG-4 AAC SSR 可变采样率规格(Scaleable Sample Rate)

• MPEG-4 AAC LTP 长时期预测规格(Long Term Predicition)

• MPEG-4 AAC LD 低延迟规格(Low Delay)

• MPEG-4 AAC HE 高效率规格(High Efficiency)-----这种规格适合用于低码率编码,有Nero ACC 编码器支持

• 目前使用最多的是LC和HE(适合低码率)。流行的Nero AAC编码程序只支持LC,HE,HEv2这三种规格,编码后的AAC音频,规格显示都是LC。HE其实就是AAC(LC)+SBR技术,HEv2就是AAC(LC)+SBR+PS技术;

34

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

AAC——格式格式格式格式 35

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

AAC文件格式总览:

AAC——格式格式格式格式((((续上续上续上续上)))) 36

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

文件类型ATOM :

AAC——格式格式格式格式((((续上续上续上续上)))) 37

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

视频信息ATOM :

AAC——格式格式格式格式((((续上续上续上续上)))) 38

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

用户数据ATOM :

AAC——格式格式格式格式((((续上续上续上续上)))) 39

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

数据ATOM :

Note :每一个ATOM的详细的信息,大家可以参考QuickTime文件格式规格书

Protection Mechanism (1/2)

• 3 levels of protection:

40

STM32 Locked

Part# Locked

All STM32.Use CRC32.License paid directly by customer.

STM32 General All STM32 (Any Cortex M3/ M4 !)

Specific part # (ie. STM32F217W)License paid by ST (included in STM32 price)

- “U“ Universal (all stacks, current & future)- “W” devices: support MP3 Decoder and Encoder- “V” devices: support MP3 Decoder

SpiritDSP deliveries

• All deliveries in binary form (no code source available)

• Naming code:

41

Meaning ST Naming (Packaging)

Optimized for Cortex M3 lib_xxxdecoder_cortex_m3.a

Optimized for Cortex M4 lib_xxxdecoder_cortex_m4.a

Locked to STM32 (CRC only) lib_xxxdecoder_cortex_mx.a

Locked to Part# lib_xxxdecoder_STM32FxxVlib_xxxdecoder_STM32FxxW

MP3 Encoder

• Audio encoding operates independently on the "frame by frame" basis. Frame length is:

• 1152 audio samples for MPEG-1 • 576 samples for MPEG-2 and MPEG-2.5.

• Supported features • MPEG-1, 2 or 2.5 formats. • Layer 3 encoding. • Mono or stereo input streams. • Fixed bitrate encoding

• Excluded features • No support for Layer 1 or Layer 2 encoding • No Variable Bit Rate (VBR) mode encoding • No CRC encoding

42

MP3 EncoderStd 8-48 KHz16-bit PCM (Little Endian)

Std 8-320 kbpsMPEG1 - ISO-11172-3

MPEG version kHz kbpsSamples

per Frame

MPEG-1 (ISO/IEC 11172-3) 32, 44.1, 48 32-320 1152

MPEG-2 (ISO/IEC 13818-3) 16, 22.05, 248-160 576

MPEG-2.5 8, 11.025, 12

MP3 Encoder 43

• Encoder Flow Work• Initialize• Encode buffer (576 samples) and send output

data to its destination

Application

PCM data buffer:- 576 samples, - 16-bit, - Mono or stereo

MP3 Encoder

Internal coded

data bufferPointer to coded data

Data Pointer to PCM data

Buffer size, byte

MP3 Decoder 44

• Supported features • MPEG-1, 2 or 2.5 formats.• Layers 1, 2 and 3.• VBR and Free-Format streams.• Mono or stereo input streams.

• Excluded features • CRC code verification

MP3 DecoderStd 8-320 kbpsMPEG1 - ISO-11172-3

Stereo 16-bit PCM

MPEG version kHz kbpsSamples

Per Frame

MPEG-1 (ISO/IEC 11172-3) 32, 44.1, 48 32-320 1152

MPEG-2 (ISO/IEC 13818-3) 16, 22.05, 248-160 576

MPEG-2.5 8, 11.025, 12

MP3 Decoder 45

User Code

Data request

User-supplied callback{retrun fread(…);}

PCM buffer

MP3 decoder

Pointer to Callback function

Internal PCM buffer(576 samples)

Internal mp3 data buffer

Decoding

• Decoder Flow Work• Initialize• fnSpiritMP3ReadCallback () is used by the

decoder to retrieve input data

• SpiritMP3Decode function decodes a given number of samples and stores them in the pPCMSamples buffer

WMA Decoder

• SPIRIT WMA decoder is a fully compliant implementation of Microsoft’s WMA decoder v9.1.

• The decoder converts compressed data into raw 16-bit PCM samples. All standard sampling rates and bit-rates are supported.

• Features• Fully compliant to the Microsoft Windows Media Technology specification

• Bitrates from 5 Kbps to 384 Kbps, CBR and VBR streams

• Sample rates from 8 kHz to 48 kHz

• Sample ASF parser provided in source code

46

WMA DecoderWMA decoder v9.15 - 384 Kbps8 - 48 kHz

Stereo 16-bit PCM

+ASF Parser“Advanced Streaming Format”

WMA Decoder 47

• Three main routines must be respected for WMA decoding:

1. Initialize

2. Feed the decoder a new portion of data,

3. Decode (and get total number of decoded samples).

Init(WMA)

Action?

NewBuffer(WMA) Decode(WMA)

State = GetState(WMA)

Output PCM

End of Decoding

State_done

State_Input

State_decodeState_getPCM

Note: Application should make a call of SpiritWMADe c_GetState() function to get current decoder state and perform the corresponding action (API call).

SpiritWMADec_Init()

SpiritASFReader_Start()

State = state_inputSpiritWMADec_GetState()

SpiritWMADec_BufferAttach()

SpiritWMADec_Decode()SpiritASFReader_GetData()

AAC Decoder 48

AAC DecoderMPEG2/4 AAC8 - 1152 Kbps8 – 96 kHz

RAW (LOAS/LATM)ADTSADIF

Stereo 16-bit PCM

• 3 profiles:• AAC-LC, AAC-HE v1, AAC-HE v2

• Forward and backward compatible

• 3 libraries, one for each profile to minimize SRAM usage:• AAC-LC

• AAC-HE v1

• Full Library (AAC-HE v2)

AAC Decoder• 3 different ways to get data

49

AACD__ReadFileInfo() AACD__ReadDecoderSpecificInfo()Initialize directly

TAACD_initParams structure

ADIF/ADTS file header data MP4/LATM: DSI field Custom format (RTP)

AACD__Init()TAACD_initParams structure

AACD__DecodeFrame()TAACD_initParams structure

End of Decoding

status = AACD_STATUS_OK ?

Music Codecs Footprint and CPU load 50

ModuleMIPS avg (MHz) MIPS peak (MHz) ROM (bytes) RAM (bytes)

CM3 CM4 CM3 CM4 CM3 CM4 CM3 CM4

MP3 Encoder 27 16.5 33 21 25123 24212 16060 18454

MP3 Decoder 20 9.53 22 12 22616 19490 12344 14928

WMA Decoder 21 9.7 24 17.9 44970 50029 36076 36076

AAC LC Decoder 17 11.5 18 13.2 30000 30000 16852

AAC++ v2 Decoder 34 22 38 23.5 55000 51144 68000

51

12/25/2014Audio/Smartphone accessories Training - Plan Proposal

THANKS!