硬件平台:STM32F746G-DISC
开发平台:KEIL_5.29
我这里不再介绍MP3文件的详细结构,只介绍如何使用MP3解码库,需要了解MP3文件信息可以参考这个网:https://www.cnblogs.com/ranson7zop/p/7655474.html
这个解码库可以从ST公司官网通过搜索关键词“x-cube-audio”下载。下载解压完后,进入到此路经下:STM32CubeExpansion_Audio_V1.1.1\Middlewares\ST\STM32_Audio\Codecs,可以看到有两个文件夹,如下图所示:
进入到解码库的目录下,会有3个文件夹,如下图所示:
进入lib文件夹下,会有3个解码库,分别对应不同的平台
我这里使用的是STM32F7,当然选用M7平台的lib文件。
接下来创建KEIL工程,先把SD卡驱动和音频芯片WM8994驱动调试好,然后将SpiritDSP_MP3_Dec文件夹复制到工程目录下,keil中添加lib文件,并设置include包含路经,那么MP3解码库就添加完成了。
接着说明一下MP3解码用到的函数,这些函数可以在spiritMP3Dec.h文件中找到。
1. void SpiritMP3DecoderInit(
TSpiritMP3Decoder *pDecoder,
fnSpiritMP3ReadCallback* pCallbackFn,
fnSpiritMP3ProcessCallback *pProcessFn,
void * token )
函数功能:初始化MP3解码器,每次解码完后,再重新解码新的MP3文件,就必须再次先调用这个函数,以完成MP3解码器的初始化。
参数:
TSpiritMP3Decoder *pDecoder:
指向要初始化的解码器结构。所有解码器变量都存储在此结构中。 解码器不使用非恒定的静态或全局变量,因此所有函数都是可重入的。
fnSpiritMP3ReadCallback* pCallbackFn:
回调函数指针,解码器将使用此功能来检索输入的mp3数据。
fnSpiritMP3ProcessCallback *pProcessFn:
回调函数指针,解码器将使用此功能来解码Layer3文件时,处理MDCT系数。目前不需要用到此功能,设置为NULL。
void * token:
传递给回调函数的可选参数。
2. typedef unsigned int (fnSpiritMP3ReadCallback)
(
void * pMP3CompressedData,
unsigned int nMP3DataSizeInChars,
void * token
)
函数功能:解码器使用它来读取MP3文件数据,必须实现此功能。
参数:
void * pMP3CompressedData:
存放读取的mp3数据。
unsigned int nMP3DataSizeInChars:
需要读取的MP3数据大小。
void * token :
回调函数的可选参数。
3. unsigned int SpiritMP3Decode (
TSpiritMP3Decoder *pDecoder,
short *pPCMSamples,
unsigned int nSamplesRequired,
TSpiritMP3Info * pMP3Info
);
函数功能:解码每一帧MP3数据,并将解码完后的数据存放在pPCMSamples中。如果此函数的返回值小于nSamplesRequired,则文件指针已到达MP3文件末尾,MP3文件解码完成,否者继续调用此函数解码。
参数:
TSpiritMP3Decoder *pDecoder:
指向初始化的解码器结构。
short *pPCMSamples:
存放解码输出的PCM数据。
unsigned int nSamplesRequired:
MP3文件每个音频帧的采样字节数
TSpiritMP3Info * pMP3Info:
解码完成后,存放当前音频帧的解码信息。其中TSpiritMP3Info结构体中的成员IsGoodStream,用来判断当前音频帧解码是否成功,解码成功为1,失败为0。
介绍下该解码库的使用流程,具体代码请参考我的程序。