简易音乐播放器的设计与实现

2022-11-13

随着网络速度的提升, 我们的网上生活变得异常丰富, 除了上网聊天, 浏览网页我们还在享受着多媒体给我们带来的便利自己也尝试开发一个简单易用的音乐播放器, 达到我们日常听音乐的基本要求。

本系统采用C/S模式, 采用Socket技术向音乐服务器请求网页数据, 将请求回来的数据进行分析, 把一定的音乐信息提取再经过复杂处理后插入到一列表框中, 当双击列表中的某一项时, 获得音乐数据及音乐网址, 用多线程下载的音乐数据, 用异步存储方式将文件保存为本地的一个文件夹内, 系统自动读取本文夹内的音乐文件并过滤掉播放器不能播放的文件, 并将它们插入到播放列表中进行播放。本播放器支持的音乐格式为:wma, mp3, wav。

1 界面的开发

由于此音乐播放器用VC++开发, 所以就离不开自己重绘窗体界面, VC开发界面又不需其他的开发平台, 可以很方便的定制出美观的界面, 所以我采用了一种相对比较简单的方法, 用图片取代Windows窗口的各个部分, 窗口的各个部分完成不同的同能, 所以需要各自绘制, 具体的绘图是在MFC里面的OnPaint () 方法里面完成, 下面我们就谈谈CWnd::OnPaint () 。[1]

方法原型:afx_msg void OnPaint () ;如果GetUpdateRect返回0, 则应用程序不应调用BeginPaint和EndPaint成员函数。应用程序负责检查是否需要内部重画或更新这可通过查看每条WM_PAINT消息的内部数据结构来完成, 因为一条WM_PAINT可能是由于一个无效区域或由于使用RDW_INTERNALPAINT标志调用了RedrawWindow成员函数而引起的。Windows只发送一次内部WM_PAINT消息, 在通过UpdateWindow成员函数向窗口发送了内部WM_PAINT消息以后, 将不会再向窗口发送其它WM_PAINT消息, 直到再次使用RDW_INTERNAL-PAINT标志调用了RedrawWindow成员函数。

2 功能实现

2.1 音乐播放

当打开音乐播放器时, 默认加载文件夹music下的音乐到播放列表, 如果music中没有音乐, 则需要用户手动添加音乐到音乐播放列表, 从本地其它文件夹下添加方式有单曲添加、同时添加多首歌曲、添加一个音乐文件夹等3种。

可以添加音乐的位置有4种:

(1) 在音乐列表中右键添加

(2) 在客户区域大红X图表上左键添加

(3) 在客户区域其他地方右键添加

(4) 或是以拖拽的方式添加

音乐播放主要IMediaControl->run () IMediaControl->Stop () IMediaControl->pause () 等方法对音乐进行控制, 这些方法控制音乐的基本播放操作。至于快进、快退可以IMediaPosition或IMediaSeeking接口seek到一个特定的位置播放。

2.2 音乐下载

音乐下载是本音乐播放器的重中之重, 也是此播放器的难点, 如果对它设计的不好会导致很多致命的问题, 例如线程死锁, 播放器内存泄漏, 系统崩溃等。我们需要使用WinInetAPI函数[2], 在使用这些函数时, 必须严格区分它们使用的句柄。按照这些句柄的产生顺序和调用关系, 可以分为三个级别, 下一级的句柄由上一级的句柄得到。

以下载百度音乐排行榜为例介绍一下。先初始化网络套接字向百度音乐服务器请求数据, 得到静态页面http://list mp3.baidu.com/list/iframe.html的源代码存于字符串strbaidulistmusic中, 我们对strbaidulistmusic进行分析, 取出百度音乐列表数据及其网址。

当用户点击百度音乐列表中的某一个链接时, 又要向百度音乐服务器请求数据得到它们的静态网页数据, 存于一字符串中, 这样我们再对此字符串进行分析, 得到歌曲的名字、歌手等信息, 以便我们在百度搜索引擎中搜到。

下载一首歌曲的具体步骤:

(1) 发送请求;

(2) 得到文件的具体信息比如:是否支持断点, 整个文件长度;

(3) 接收一定数据;

(4) 将接收到的数据写入文件;

(5) 判断是否接收完毕;

(6) 如果没有则继续接收, 如果接收完毕则断开此次连接。

每当一首歌曲下载完毕, 并且完全写入文件后, 就会把下载歌曲的信息插入到下载历史记录里面, 方便我们的查阅、分析和历史播放。

2.3 系统设置

系统设置可以让用户设置搜索过滤条件, (如:过滤MP3格式, 歌曲保存的路径等信息) , 相当于对环境变量的一些设定这些信息写入到一个叫Download.ini的文件中, 对INI文件的操作主要用到的方法有8个, 我们只介绍我们经常用到的例如:GetPrivateProfileSection () WritePrivateProfileString () GetPrivateProfileStruct () WritePrivateProfileStruct () ;。

3 结语

由于水平有限, 对于VC++、多线程、指针的操作还不是相当的熟练, 有时会出现内存忘记释放和线程死锁等严重问题, 导致弹出错误提示框, 影响音乐播放器的正常播放。由于是初步设计, 很多功能都是想到后一步一步加上的, 例如, 隐藏为系统托盘, 由于类设计时考虑不完善, 难免有代码冗余, 和重用性不高的问题出现, 导致代码量增加, 软件运行速度慢, 还有由于音乐下载采用的是线程池和内存池, 这些技术都是新学新用, 理解深度不够, 难免有错误, 运行时会出现下载部分的线程死锁。

摘要:采用Socket技术向音乐服务器请求网页数据, 将请求回来的数据进行分析, 把一定的音乐信息提取, 再经过复杂处理后插入到一列表框中, 由此能够下载的音乐网址, 用多线程下载的音乐数据, 用异步存储方式将文件保存为本地的一个文件夹内, 系统自动读取本文夹内的音乐文件, 过滤掉音乐播放器不能播放的文件, 并将它们插入到播放列表中进行播放。

关键词:Socket,服务器,多线程,播放

参考文献

[1] 宋坤, 刘锐宁, 李伟明.MFC程序开发参考大全[M].人民邮电出版社, 2007.

[2] 张荣梅, 梁晓林.Visual C++实用教程[M].冶金工业出版社, 2004.

[3] 宋坤, 刘锐宁, 李伟明.Visual C++视频开发宝典参考大全[M].人民邮电出版社, 2007.

上一篇:建筑物理教学方式探讨下一篇:《科技创新导报》编辑部学术论文征集启事