win mobile 5播放mp3音乐的方法(4)--5mbox封装类的代码

来源:互联网 发布:身骑白马知乎 编辑:程序博客网 时间:2024/05/02 17:03
北京理工大学  20981  陈罡
前几篇说到在win mobile 5上面播放mp3音频需要了解的基本知识。
在这里我再总结一下:

首先是移植libmad,mp3文件解码器这是必不可少的第一步;

然后是使用libmad把mp3文件解码成为pcm码流,也就是wav文件
(其实还是有一些区别的,wav文件是有wav头的pcm码流)。

最后就是利用pcm码流的播放api实现最终的播放目的,在这当中,
需要善于利用缓冲队列。
 
如果能够把这么多东西封装成一个方便使用的类就好了,我在开发
5mbox的过程中也是这么想的,所以就按照上一篇所讲的原理编写了
一个类专门用于封装解码线程和pcm码流播放线程的。不知道为什么,
虽然在真机上的效果已经可以让人满意了,但是在模拟器上播放mp3
的时候,总是听上去稍微有一点点一顿一顿的感觉。如果哪位大侠
从下面的代码中发现了修正这个问题的方法,还请不吝赐教!
 
使用方法如下:
(1)新建win mobile 5.0 ppc工程(我在这里创建的是WM5Mp3Demo工程),
然后把mp3core这个目录整个拷贝到系统自动创建的目录下面。
 
(2)在"Solution Explore"里面,右键单击"WM5Mp3Demo",在弹出菜单
中选择"Add"->"New filter",创建一个目录,取名叫"mp3core",然后
再用类似的方法在mp3core上面再创建目录,然后在每个目录上单击右键
选择"Add"->"Existing item...",把对应的目录下的所有源文件都选上。
这样就可以完成mp3core目录下的源文件添加到你的新建项目的操作。
如下图所示:
 
(3)可以根据需要选择debug模式或者release模式,然后选择"Project"->
"WM5Mp3Demo Properties",然后如图所示,设置附加包含路径:
 
(4)然后设置编译器不采用预编译头文件,如下图所示:
 
(5)好了,然后就是添加代码了,要使用mp3core的封装,必须加入:
#include "M5Mp3Play.h"
然后声明一个全局的变量,如:g_mp3play之类的:
// Global Variables:
HINSTANCE   g_hInst;   // current instance
HWND    g_hWndMenuBar;  // menu bar handle
CM5Mp3Play   g_mp3_play ;  // mp3 player
我用的是win32 api风格的ppc开发,如果用到mfc之类的库的朋友,也可以
不声明成全局的变量,这里只是为了清晰、简单。
然后找到可以调用的入口,比如button的OnClick处理啦,键盘的事件啦之类的
地方,加入下面的调用代码即可。我这里是用WndProc里面的键盘事件:
case WM_KEYDOWN:
// Handle any non-accelerated key commands
 switch (wParam) {
  case VK_ACTION:
  case VK_RETURN:
   {
    // 这里是定义了退出
    PostMessage(hWnd, WM_CLOSE, 0, 0);
    return 0L;
   }
  case VK_UP:
   {
    // 按上方向键停止播放
    g_mp3_play.Stop() ;
   }
   break ;
  case VK_DOWN:
   {
    // 按下方向键开始播放,注意这里用的是绝对路径
    // 需要把test.mp3拷贝到手机内存的相应位置下面才能够播放,
    // 这一点一定要注意。这里的第一个参数是mp3文件的路径,
    // 第二个参数是是否循环播放,如果是true则循环播放,播放
    // 完毕后会自动从头开始重新播放;如果是false则播放一遍后
    // 停止播放。
    g_mp3_play.Init("/Program Files/WM5Mp3Demo/test.mp3", true) ;
    g_mp3_play.Play() ;
   }
   break ;
  }
  break;
好了,至此win mobile 5.0下面播放mp3文件的方法就全部介绍完毕了。
上述整个demo的源代码可以自由下载,希望下载的朋友能够多多提出改进的意见,谢谢。
 
文件:WM5Mp3Demo.rar大小:179KB下载:下载

 

发表于: 2007-12-21,修改于: 2007-12-22 00:02,已浏览900次,有评论5条 推荐投诉网友:雨后 时间:2007-12-23 21:51:43 IP地址:222.70.151.★
终于等到更新了:)

网友:so927 时间:2008-02-16 09:53:43 IP地址:222.210.117.★
您好

我仔细阅读了您写的《win mobile 5播放mp3音乐的方法(4)--5mbox封装类的代码》

有几个问题想请教一下,希望您能够提供帮助,谢谢,

我的E_mail: so_zhou@qq.com

期待您的帮助,谢谢


网友:igogo 时间:2008-03-20 18:04:52 IP地址:218.241.186.★
能不能谈下在线播放mp3的思路?我计划3个线程,3个缓冲区

1. 数据接收线程 写入数据接收缓冲区,满了就往数据解码缓冲区拷

2. 解码线程  读数据解码缓冲区,解码后的数据放入pcm数据缓冲区里

3. 播放线程 拿pcm数据缓冲区里的数据播放

但是在线程间同步上想不太清楚,而且和播放本地文件时的,解码器读入那块有什么不同?

我邮箱 qindagg@gmail.com 谢谢

网友:本站网友 时间:2008-05-12 20:05:52 IP地址:121.33.206.★
看了您的着几篇文章,我也在模拟器上试了,但是在模拟器上总是效果不佳。

也试着改了下,但是总是达不到预期的效果。请问你知道了在模拟器上的改进方法了吗?

邮箱:lhm19851126@163.com


网友:本站网友 时间:2009-02-11 17:00:49 IP地址:123.127.75.★
我编译这个程序放到WM5的机器上去运行,感觉还是有一顿一顿的感觉啊,博主是否解决了这个问题?
原创粉丝点击