目录

关于 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脚本

链接

最新文章

  1. ReSharper.8.0.14.856注册码
  2. Eclipse断点调试方法
  3. hibernate----(Hql)另一种查询---利用Criteria类
  4. 【LeetCode OJ】Interleaving String
  5. CSS圆角,输入框提示信息,JS查找同级元素
  6. redis缓存技术
  7. linux系统中中断已连接的用户
  8. python + selenium <二>
  9. Now trying to drop the old temporary tablespace, the session hangs.
  10. 在Unix系统中,主存索引节点和辅存索引节点从内容上比较有什么不同,为什么要设置主存索引节点?
  11. c/c++ 表达式求值
  12. 超详细SQLMap使用攻略及技巧分享
  13. 使用fastreport以代码方式创建报表
  14. Python变量访问权限控制
  15. python的zipfile、tarfile模块
  16. SpringCloud报错:Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
  17. 阿里云rds实例恢复到本地
  18. 20155334 《网络攻防》Exp5 MSF基础应用
  19. Hive环境的安装部署(完美安装)(集群内或集群外都适用)(含卸载自带mysql安装指定版本)
  20. golang之strings

热门文章

  1. import cv2报错
  2. How to install the Package Controller
  3. 谷歌拼音输入法扩展API开发指南
  4. 图文详解丨iOS App上架全流程及审核避坑指南
  5. element-plus 消息提示
  6. 长事务 (Long Transactions)
  7. EXCEL_BASIC
  8. JavaScript 实现地图搜索功能
  9. Selenium4+Python3系列(七) - Iframe、Select控件、交互式弹出框、执行JS、Cookie操作
  10. toB应用私有化交付发展历程、技术对比和选型