目录

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

链接

AIR32F103(八) 集成Helix MP3解码库播放MP3的更多相关文章

  1. 读取SD卡文件夹下的MP3文件和播放MP3文件

    首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中): /** * 读取目录中的Mp3文件的名字和大小 */ public Lis ...

  2. 【Linux_Fedora_应用系列】_1_如何安装音乐播放器和mp3解码

    因为安装环境的不同,Fedora在安装后会安装不同的软件包.通常在安装的时候有多种选择: 1.桌面环境: 适合个人日常使用,安装包含办公软件(Fedora 默认安装Open Office).娱乐影音软 ...

  3. libavcodec是一款LGPL自由软件编解码库,用于视频和音频数据的编解码工作

    http://zh.wikipedia.org/zh-cn/Libavcodec http://baike.baidu.com/view/856526.htm libavcodec是一款LGPL自由软 ...

  4. vc中播放mp3文件的方法小结

    一般播放MP3常见的有两种方法,一种是自己解码,另外一种用系统的库,比如MCI,当然如果可以用控件直接用个控件会更方便. 1.      使用mci #include <windows.h> ...

  5. Rhybox播放mp3, smplayer如何播放flv等等

    [[ 支持mp3,在终端: sudo apt-get install gstreamer0.10-*plugins-ugly 支持wma,在终端: sudo apt-get install gstre ...

  6. freeswitch使用mod_shout模块播放mp3

    概述 freeswitch 在对VOIP语音通话中,可以通过playback命令播放IVR语音文件. 默认情况下,freeswitch支持wav文件,也可以直接播放VOIP中常见编解码的G711文件. ...

  7. Java获取音频文件(MP3)的播放时长

    最近的一个项目需要按照时间播放mp3文件,例如,播放10分钟的不同音乐. 这就意味着我得事先知道mp3文件的播放时长,以决定播放几遍这个文件. 方案一:Java的方式 找第三方的库,真的感谢这些提供j ...

  8. ios开发——实用技术篇Swift篇&播放MP3

    播放MP3 // MARK: - 播放MP3 /*----- mp3 ------*/ //定时器- func updateTime() { //获取音频播放器播放的进度,单位秒 var cuTime ...

  9. 在C语言控制台程序中播放MP3音乐

    游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...

  10. VC播放mp3的方法

    1.使用msi库 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") ....... //打开文件 MCI_O ...

随机推荐

  1. 怎样在vue中隐藏el-form-item中的值、设置输入框的值是只读

    1.如何在前端vue中隐藏某一个元素(el-form-item怎样隐藏) 给每项表单项添加一个自己的id名,并用v-model绑定相对应的数据,利用v-if根据上一个表单项的数据值来进行显示或隐藏 & ...

  2. 齐博x1细节优化,自定义二、三、四维字段支持自定描述

    如下图所示,之前自定义字估中的二.三.四维字段,不支持自定义描述,导致用户输入的时候,不知道该输入什么信息内容.只有站长自己才知道. 现在支持自定义描述,及设置文本或数字.方便引导用户输入相应的信息内 ...

  3. [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)

    [数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构)    C#中的链表(源码)    可空类 ...

  4. 【HarmonyOS】【ArkUI】在Service中使用Emitter

    ​ 参考资料 1.相关基础知识:触发器Emitter2.启动服务:ServiceAbility开发 开发步骤 第一步:开发界面,界面内容由一个按钮组件+文本组件构成,然后在按钮组件中添加点击事件,开启 ...

  5. 实战中的sudo提权漏洞的使用姿势(CVE-2021-3156)

    实战中的sudo提权漏洞的使用姿势 免责声明: 0x00 漏洞概述 0x01 漏洞原理 0x02 受影响版本 0x03 不受影响版本 0x04 漏洞复现(centos) 复现POC1: 复现POC2: ...

  6. 【RPC和Protobuf】之RPC入门

    一,概念 RPC:Remote procedure call(远程过程调用),分布式系统中不同节点之间流行的通信方式 服务端: 注: 1.执行下面的代码之后,会相应的启动一个tcp进程 C:\User ...

  7. 读 Clean Code,关于变量命名和可维护代码

    原文见 http://mindprod.com/jgloss/unmain.html 如何写出不能维护的代码 如何程序命名 容易输入的名字.比如:Fred,asdf 单字母的变量名.比如:a,b,c, ...

  8. 19、从键盘输入两个数字n,m,求解n,m的最小公倍数

    /* 从键盘输入两个数字n,m,求解n,m的最小公倍数 */ #include <stdio.h> #include <stdlib.h> void getLowsetComM ...

  9. 6个tips缓解第三方访问风险

    随着开发和交付的压力越来越大,许多企业选择依赖第三方来帮助运营和发展业务.值得重视的是,第三方软件及服务供应商和合作伙伴也是云环境攻击面的重要组成部分.尽管企业无法完全切断与第三方的关联,但可以在向他 ...

  10. 解决Qt5 mouseMoveEvent事件不能直接触发

    问题描述 mouseMoveEvent 需要鼠标点击(左右中),然后在按下的同时移动鼠标才会触发 mouseMoveEvent事件函数. 解决 setMouseTracking(true);