AIR32F103(八) 集成Helix MP3解码库播放MP3
目录
- 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
AIR32F103(八) 集成Helix MP3解码库播放MP3的更多相关文章
- 读取SD卡文件夹下的MP3文件和播放MP3文件
首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中): /** * 读取目录中的Mp3文件的名字和大小 */ public Lis ...
- 【Linux_Fedora_应用系列】_1_如何安装音乐播放器和mp3解码
因为安装环境的不同,Fedora在安装后会安装不同的软件包.通常在安装的时候有多种选择: 1.桌面环境: 适合个人日常使用,安装包含办公软件(Fedora 默认安装Open Office).娱乐影音软 ...
- libavcodec是一款LGPL自由软件编解码库,用于视频和音频数据的编解码工作
http://zh.wikipedia.org/zh-cn/Libavcodec http://baike.baidu.com/view/856526.htm libavcodec是一款LGPL自由软 ...
- vc中播放mp3文件的方法小结
一般播放MP3常见的有两种方法,一种是自己解码,另外一种用系统的库,比如MCI,当然如果可以用控件直接用个控件会更方便. 1. 使用mci #include <windows.h> ...
- Rhybox播放mp3, smplayer如何播放flv等等
[[ 支持mp3,在终端: sudo apt-get install gstreamer0.10-*plugins-ugly 支持wma,在终端: sudo apt-get install gstre ...
- freeswitch使用mod_shout模块播放mp3
概述 freeswitch 在对VOIP语音通话中,可以通过playback命令播放IVR语音文件. 默认情况下,freeswitch支持wav文件,也可以直接播放VOIP中常见编解码的G711文件. ...
- Java获取音频文件(MP3)的播放时长
最近的一个项目需要按照时间播放mp3文件,例如,播放10分钟的不同音乐. 这就意味着我得事先知道mp3文件的播放时长,以决定播放几遍这个文件. 方案一:Java的方式 找第三方的库,真的感谢这些提供j ...
- ios开发——实用技术篇Swift篇&播放MP3
播放MP3 // MARK: - 播放MP3 /*----- mp3 ------*/ //定时器- func updateTime() { //获取音频播放器播放的进度,单位秒 var cuTime ...
- 在C语言控制台程序中播放MP3音乐
游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...
- VC播放mp3的方法
1.使用msi库 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") ....... //打开文件 MCI_O ...
随机推荐
- sql面试50题------(21-30)
文章目录 21.查询不同老师所教不同课程平均分从高到低显示 23.使用分段[100,85),[85,70),[70,60),[<60] 来统计各科成绩,分别统计各分数段人数:课程ID和课程名称 ...
- 长文梳理muduo网络库核心代码、剖析优秀编程细节
前言 muduo库是陈硕个人开发的tcp网络编程库,支持Reactor模型,推荐大家阅读陈硕写的<Linux多线程服务端编程:使用muduo C++网络库>.本人前段时间出于个人学习.找工 ...
- 前端学习笔记--HTML5
网页的优点(客户端为网页)(B/S)模式 开发成本低) 不需要安装 无需更新 跨平台(最重要)可以有效的减小开发成本 传统的为C/S模式,开发成本高 前端工程师负责写网页的源代码,而浏览器负责把网页渲 ...
- 搜索"xxxx"的进程,同时杀进程
一.搜索"xxxx"的进程,同时杀进程,命令如下: ps -ef|grep xxxx|grep -v 'grep'|awk '{print $2}'|xargs kill -9 命 ...
- Go语言核心36讲02
你好,我是郝林,今天我分享的主题是,学习专栏的正确姿势. 到了这里,专栏的全部内容已经都推送到你的面前了.如果你已经同步学习完了,那么我要给你点一个大大的赞! 还没有看完的同学也不要着急,因为推送的速 ...
- gdb不能使用mac
先说问题:1.gdb不能使用,重新用homebrew install 了gdb 2.brew装的gdb可以用了,但是等start调试的时候报这些错误: dyld: Library not ...
- 基于sklearn的集成学习实战
集成学习投票法与bagging 投票法 sklearn提供了VotingRegressor和VotingClassifier两个投票方法.使用模型需要提供一个模型的列表,列表中每个模型采用tuple的 ...
- 【离线数仓】Day04-即席查询(Ad Hoc):Presto链接不同数据源查询、Druid建多维表、Kylin使用cube快速查询
一.Presto 1.简介 概念:大数据量.秒级.分布式SQL查询engine[解析SQL但不是数据库] 架构 不同worker对应不同的数据源(各数据源有对应的connector连接适配器) 优缺点 ...
- 云原生架构(二)环境搭建(Mac上安装Docker+Kubernetes+Istio一条龙)
一.背景 Istio 项目由 Google 和 IBM 的团队与 Lyft 的 Envoy 团队合作启动.它已经完全在 GitHub 上公开开发.目前已经是"Service Mesh服务网格 ...
- codeforce E - Binary Inversions题解
题目: 给你一个01串,现在你可以(或者不用)选取其中一个元素进行一次反转操作0-1,1-0:从而使得串中的逆序对个数最多. 题目链接:codeforce origin problem 思路: 1. ...