来自:http://bbs.ednchina.com/BLOG_ARTICLE_276006.HTM

玩MP3播放,之前已经实现了VS1003的正弦波测试,从耳机可以听到一定频率的声音了。之后开始写程序,希望从MMC/SD卡读取文件发送到VS1003播放。我的板子上MMC卡和VS1003都接在同一个硬件SPI接口上,靠不同的片选控制。程序的思路就是单片机从MMC卡读取一个扇区(512字节)的音频文件暂存在SRAM中,然后再依次将其发送到VS1003的串行数据口(SDI),循环以上过程从而实现音频文件的播放。原理还是很简单的,但是编出来的程序却不能播放声音出来,通过串口输出的调试信息看到有数据传送,可就是不响。经过仔细检查程序发现是引用的一个函数的变量类型指定错了(应该为unsigned int,写成了unsigned char)。排除这个错误后再实验,更新程序,上电运行,初始化MMC卡和VS1003,发命令开始播放文件,从耳机里传来了久违的音乐声。当时还是很激动的,毕竟从能出声(正弦波)到能放音乐之间花费的时间太久了。
能播放MP3之后又试了WMA,也是没有问题的。接下来的就是选不同的MP3文件进行码率测试了。最初,程序能流畅播放8,16,24,32,48,64kbps文件,再往上就会卡,估计是文件传送的速度不够快,开始优化程序。首先把SPI的时钟调到8Mhz,再实验,感觉好了点,但改善不大。问题出在哪呢?回过头来再看程序,读MMC卡的函数里我使用了循环,循环512次每次读一个字节,这样完成一个block的读取,发送数据到VS1003的函数也是如此。这样写程序层次感很好,但感觉循环的开销太大了(因为是512次循环,变量还必须用int型的)。于是改程序,在读扇区函数里每次循环读8字节数据,只需循环64次了,VS1003函数也同样修改。这样再试验,板子已经可以流畅播放128kbps的MP3,峰值数据传输率达到140k。有了这次的成功,我继续对程序优化,再次修改MMC_read(),每次循环读64字节数据,循环8次。VS1003_write()中每次循环读32字节数据,循环16次(数据手册说VS1003在芯片空闲时,至少能接收32字节数据,再多就需要查询DREQ引脚状态再判断)。这回提升的效果也很让人振奋,播放160k码率文件很流畅,换用高码率文件测试峰值数据传输速率172kbps。优化程序的成就感还是很大的:)
之后又对SPI中断函数动了手术,去掉了关中断和开中断的语句(因为我的中断函数中执行的语句就2条),尽量压缩处理时间。另外在SPI发送数据后有一个等待发送完成的检测环节,必须等SPI发送完毕才可以进行下一次发送,经过分析后,我发现这个检测可以去掉,因为我的SPI时钟已经达到8M,CPU工作在33M,STC宏晶的数据手册上显示一条指令大都在2-3个时钟周期内才可以完成,再加上每次SPI发送后我都需要移动指针(又是一条指令),而这时SPI发送早已完成。因此可以不必检测,直接再次发送数据。按照这个思路修改程序后,我的板子解码速度已经达到272kbps了,后来又做了些小的修改最高解码速率稳定在280kbps。至此,除了320k CBR编码的MP3播放有点卡以外,其他各种音频文件已没有任何问题(当然得是VS1003支持的格式:))。
在这个程序的开发过程中,我深深地感到仔细很重要,另外,有时候可以突破陈规大胆尝试(去掉SPI发送完毕检测就是一例)。现在模式只能顺序播放MMC卡中指定区域的数据,下一步我准备移植FAT文件系统到MCU上,这样就可以按文件播放了。希望我的经历对同样在用STC单片机,VS1003的朋友有所益处。

STC12+VS1003播放MP3程序开发历程
控制VS1003成功-〉播放正弦波-〉播放MP3成功-〉性能提高-〉64kbps-〉112kbps-〉140kbps-〉172kbps-〉272kbps-〉280kbps

VS1003音频解码芯片MP3播放器实现的问题-转载相关推荐

  1. 我的Android进阶之旅------Android MediaPlayer播放网络音频的实例--网络mp3播放器

    上一篇写了个简单的MP3播放器 ,这次写一个可以播放网络音频资源的播放器 本实例可以实现音乐播放器除了来电的时候会暂停播放,通话结束后恢复播放外,打开其他的Activity都可以继续播放音乐,享受一边 ...

  2. zblog音频MP3播放器插件

    简介: zblog音频MP3播放器插件在主题管理中上传并启用 一款网页音频播放器,支持上传MP3或第三方MP3外链地址. 使用说明:将zba插件在zblog后台程序上传后,启用插件 网盘下载地址: h ...

  3. php 音频顺序播放,MP3播放器音频文件不按顺序播放的解决方法,简单实用

    MP3播放器对于现在的我们来说很多已经是过去了,但是我们总会有用到它的时候:当你听一些录音课程或者评书故事,亦或者使用迷你音响播放歌曲时常会发现拷贝进MP3播放器中的音频文件根本不按照你自己的想象进行 ...

  4. MP3播放器以及对音频的剪辑

    由于原生的Java类库中所支持的音频是不支持MP3格式的,会直接放不出来所以改使用MP3Player.可以直接支持MP3文件的播放 可以直接实现文件的选择和音频的剪辑功能 package gui;im ...

  5. 基于Stm32的MP3播放器设计与实现

    原创博文,转载请注明出处 这是我高级电子技术试验课做的作业,拿来共享一下.项目在安福莱例程基础之上进行的功能完善,里面的部分内容可参考安福莱mp3例程.当然用的板子也是安福莱的板子,因为算起来总共做了 ...

  6. MP3播放器的工作原理

    MP3全称是MPEG Audio Layer 3,MPEG压缩格式是由运动图像专家组(Motion Picture Experts Group)制定的关于影像和声音的一组标准,其中MP3就是为了压缩声 ...

  7. java mp3播放器 无界面

    一.服务器端: 最近没有系统学习的计划,看了开源的YOYOPlayer(一个相当强大的播放器软件,基于java编写),心里痒痒,比较肤浅的学习下javasound. javasound是比较小巧的底层 ...

  8. java mp3播放器 ×××面

    一.服务器端: 最近没有系统学习的计划,看了开源的YOYOPlayer(一个相当强大的播放器软件,基于java编写),心里痒痒,比较肤浅的学习下javasound. javasound是比较小巧的底层 ...

  9. java mp3 暂停,Java MP3播放器 - 使用jLayer播放,暂停和搜索不能正常工作

    我正在尝试在java中实现mp3播放器,它将从字节数组中播放音频 . 该类应该像这样工作: 加载用aes加密的mp3文件 将其解密为bytes / inputstream数组 播放变量中的音乐 让用户 ...

最新文章

  1. Centos7 系统下搭建.NET Core2.0+Nginx+Supervisor+Mysql环境
  2. 更改已经收货的采购订单价格
  3. ubuntu终端彻底删除软件
  4. mysql 多数据库实例_Mysql多实例安装
  5. 设计一个可扩展的用户登录系统
  6. pm1 android,Android Sensor SDK
  7. 3l如何使用_慢阻肺患者如何选购呼吸机和制氧机,需要注意哪些?
  8. Java Duration类| 带示例的compareTo()方法
  9. python代码规范准则_Python编码规范
  10. 腾讯发出合并邀约:斗鱼股价下跌8.51%,虎牙下跌9.83%
  11. Josephus 线段数版
  12. Web后端学习笔记 Flask(7)数据库
  13. 9.5---所有字符串的排列组合(CC150)
  14. 注意,你需要注意的使用盗版破解软件发论文存在的风险及规避方法
  15. 用百用计算机弹出,CPU使用率老是100%怎么办?小编详解解决CPU过高的问题
  16. 教你一招:解决Win 10安装软件时提示:文件系统错误 (-1073740940)
  17. C++ TCP 网络编程与数据通信
  18. Android消息机制(Handler机制) - 线程的等待和唤醒
  19. Linux无法联网解决方案
  20. POJ3069-Saruman's Army-贪心水题

热门文章

  1. [Ubuntu]修改 Ubuntu16.04 源为清华大学
  2. 新概念二册 Lesson 47 A thirsty ghost嗜酒的鬼魂(复习文章)
  3. 关于 Word2vec 的理解与感悟
  4. [附源码]Python计算机毕业设计SSM辽宁省高考志愿智能辅助填报系统(程序+LW)
  5. 专升本C语言试题分析(一)
  6. DiskGenius分区工具
  7. 利用递归求两个数字的最大公约数
  8. 第四届“青春影像”全国大中学生原创作品大赛落幕
  9. 在虚拟机CentOS系统中安装ns2
  10. 超赞!阿里资深P9架构师总结出第一本《Java异步编程实战》