Helix 解碼庫提供了MP3內容的MPEG相容解碼, 支持可變比特率, 恆定比特率以及立體聲和單聲道音頻格式. Helix 的定點解碼庫專門針對ARM處理器進行了優化. Helix 解碼庫是以幀為解碼單位的, 一次解碼一幀, 運行需要占用的資源很少, 可以在任何能夠執行長整數乘法運算(兩個32位輸... ...
目錄
- AIR32F103(一) 合宙AIR32F103CBT6開發板上手報告
- AIR32F103(二) Linux環境和LibOpenCM3項目模板
- AIR32F103(三) Linux環境基於標準外設庫的項目模板
- AIR32F103(四) 27倍頻216MHz,CoreMark跑分測試
- AIR32F103(五) FreeRTOSv202112核心庫的集成和示例代碼
- AIR32F103(六) ADC,I2S,DMA和ADPCM實現的錄音播放功能
- AIR32F103(七) AIR32F103CBT6/CCT6啟用96K記憶體
- AIR32F103(八) 集成Helix MP3解碼庫播放MP3
關於 Helix MP3 解碼庫
MP3(Moving Picture Experts Group Audio Layer III,MPEG Audio Layer 3)是一種音頻編碼方式, MPEG 音頻文件是 MPEG 標準中的聲音部分, 根據壓縮質量和編碼複雜程度劃分為三級 Layer-1, Layer-2, Layer-3, 分別對應MP1, MP2, MP3 這三種編碼格式, 級別越高壓縮率越高,編碼器也越複雜, MP3 壓縮率可達到 10:1 至 12:1.
Helix 解碼庫提供了MP3內容的MPEG相容解碼, 支持可變比特率, 恆定比特率以及立體聲和單聲道音頻格式. Helix 的定點解碼庫專門針對ARM處理器進行了優化. Helix 解碼庫是以幀為解碼單位的, 一次解碼一幀, 運行需要占用的資源很少, 可以在任何能夠執行長整數乘法運算(兩個32位輸入生成一個64位結果)和長整數乘法-累加(具有64位累加器的長整數乘法)的32位處理器上運行.
Helix 與 AIR32F103 驅動庫的集成
在 air32f103-template 項目中, 已經將 Helix 加入 Library 併在 Makefile 中增加了編譯選項, 設為y
就會增加Helix庫的支持.
# Build with Helix MP3 lib, y:yes, n:no
USE_HELIX ?= y
在項目中使用Helix庫, 只需要引用 mp3dec.h 和 mp3_data.h 這兩個頭文件, 初始化 HMP3Decoder
hMP3Decoder = MP3InitDecoder();
示例代碼
示例代碼: air32f103-template/tree/master/Examples/NonFreeRTOS/I2S/Helix_MP3_Play
- 因為 Helix 的官方倉庫已經不可用, 網上找到的大多是經過修改的代碼, 這裡使用的是這篇文章中的Helix庫.
- 為簡單起見, 示例直接使用位元組數組存儲mp3數據進行播放.
- 音頻的驅動: 使用兩個4096位元組的數組作為 DMA 的buffer, DMA中存放已經解碼完成的音頻數據, 直接傳輸到I2S介面播放. 每次一個buffer的DMA傳輸完成, 就切換到下一個buffer, 同時在主函數中讀取mp3數據並解碼, 快速填充前一個buffer.
- 因為使用的記憶體超過 42KB, 如果使用 CCT6, 需要開啟記憶體hack.
- 實際測試中, 需要系統頻率高於192MHz才能完全流暢播放, 建議使用 216MHz
示例中的I2S設置是針對PT8211的, 如果使用的是, 需要修改一下, 改成 Phillips 格式
// PT8211:LSB, MAX98357A:Phillips
I2S_InitStructure.I2S_Standard = I2S_Standard_LSB;
硬體準備
- AIR32F103開發板, 需要Flash大於 230 KB, 所以只能用 CCT6或RPT6
- MAX98357A 或 PT8211 等 I2S 介面音頻播放模塊
- 用於播放聲音的喇叭
接線
* AIR32F103 MAX98357A / PT8211
* PB12(SPI1_NSS/I2S_WS) -> LRC, WS
* PB13(SPI1_SCK/I2S_CK) -> BCLK, BCK
* PB15(SPI1_MOSI/I2S_SD) -> DIN
* GND -> GND
* VIN -> 3.3V
* + -> speaker
* - -> speaker
運行示例
編譯和燒錄的步驟, 參考前面的 AIR32F103(三) Linux環境基於標準外設庫的項目模板
運行後會重覆播放一段音樂.
播放其它MP3文件
首先要用工具將MP3剪輯到合適的大小(不要超過200KB), 格式為立體聲 44.1 KHz 採樣率, 不限制比特率.
然後用工具將其轉換為十六進位表示的位元組數組. 替換掉 mp3_data.c 中的內容, 同時修改 mp3_data.h 中的 MP3_DATA_SIZE.
bin2hex的轉換工具, 可以使用Perl Script to convert binary to hex 這個perl腳本
鏈接
- http://vedder.se/2012/07/play-mp3-on-the-stm32f4-discovery/
- https://github.com/cahya-wirawan/stm32f4-musicplayer