1. #include <vfw.h> 
  2. #pragma comment(lib,"vfw32.lib")  
  3. 简单实现     
  4. 要实现一个播放器,首先要先建立一个MFC应用程序,例如一个基于DialogMFC程序。一个简单实现的代码如下:  
  5. HWND m_hAudio;   
  6. m_hAudio = MCIWndCreate( GetSafeHwnd(), AfxGetInstanceHandle(), WS_CHILD | MCIWNDF_NOMENU, _T("音乐.mp3") ); 
  7. //m_hAudio = MCIWndCreate(m_hWnd,NULL,WS_CHILD | WS_CAPTION | WS_VISIBLE | MCIWNDF_SHOWPOS | MCIWNDF_SHOWNAME,filename);//可以显示播放器的小窗口。   
  8. if( MCIWndCanPlay( m_hAudio ) ) 
  9. {     
  10. MCIWndPlay( m_hAudio ); 
  11. }
  12. 这样,就可以播放出音乐来。支持的格式有wave files, midi files, AVI Video, cd audio, vcr, video disc, and others..,自己尝试了一下,好像还可以播放视频中的音轨。
  13.     
  14. 常用的API函数
  15. /** 窗口句柄所指对象是否可播放 */ 
  16. MCIWndCanPlay(hwnd)
  17.  
  18. /** 窗口句柄所指对象是否可录音 */ 
  19. MCIWndCanRecord(hwnd)
  20.  
  21. /** 进行录音 */ 
  22. MCIWndRecord(hwnd)
  23.  
  24. /** 关闭窗口句柄 */ 
  25. MCIWndClose(hwnd)
  26.  
  27. /** 播放窗口句柄所指对象 */ 
  28. MCIWndPlay(hwnd)
  29.  
  30. /** 停止播放窗口句柄所指对象 */ 
  31. MCIWndStop(hwnd)
  32.  
  33. /** 暂停播放窗口句柄所指对象 */ 
  34. MCIWndPause(hwnd)
  35.  
  36. /** 恢复(暂停)播放窗口句柄所指对象 */ 
  37. MCIWndResume(hwnd)
  38.  
  39. /** 移动播放进度至指定位置 */ 
  40. MCIWndSeek(hwnd, lPos)
  41.  
  42. /** 移动播放进度至初始位置 */ 
  43. MCIWndHome(hwnd)
  44.  
  45. /** 移动播放进度至结束位置 */ 
  46. MCIWndEnd(hwnd)
  47.  
  48. /** 倒退播放窗口句柄所指对象 */ 
  49. MCIWndPlayReverse(hwnd)
  50.  
  51. /** 从指定位置播放窗口句柄所指对象 */ 
  52. MCIWndPlayFrom(hwnd, lPos)
  53.  
  54. /** 播放窗口句柄所指对象直至指定位置 */ 
  55. MCIWndPlayTo(hwnd, lPos)
  56.  
  57. /** 播放窗口句柄所指对象的指定区间 */ 
  58. MCIWndPlayFromTo(hwnd, lStart, lEnd)
  59.  
  60. /** 获取当前的播放进度 */ 
  61. MCIWndGetPosition(hwnd)
  62.  
  63. /** 获取窗口句柄所指对象文件的长度 */ 
  64. MCIWndGetLength(hwnd)
  65.  
  66. /** 销毁窗口句柄 */ 
  67. MCIWndDestroy(hwnd)
  68.  
  69. /** 设置播放音量 */ 
  70. MCIWndSetVolume(hwnd,iVol)
  71.  
  72. /** 获取当前播放音量 */ 
  73. MCIWndGetVolume(hwnd)
  74.  
  75. /** 设置播放速率 */ 
  76. MCIWndSetSpeed(hwnd,iSpeed) 
  77.  
  78. /** 获取播放速率 */ 
  79. MCIWndGetSpeed(hwnd) 
  80.  
  81. /** 设置是否循环播放 */ 
  82. MCIWndSetRepeat(hwnd,f) 
  83.  
  84. /** 获取是否循环播放 */ 
  85. MCIWndGetRepeat(hwnd

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  1. MCIWnd的使用
  2. Windows中提供了一个MCIWnd窗口类,可以更加方便的在一个VC窗口中操作多媒体。
  3.   使用MCIWnd,源文件中需要包含头文件 vfw.h,在Project->Settings->Link->Object/libray module中加入库 vfw32.lib
  4. 1、MCIWnd的创建
  5.   MCIWnd子窗口的创建可使用MCIWndCreate函数:
  6.     HWND MCIWndCreate(
  7.       HWND hwndParent,   //父窗口句柄
  8.       HINSTANCE hInstance, //应用程序的实例句柄
  9.       DWORD dwStyle,    //显示风格
  10.       LPSTR szFile     //多媒体文件名
  11.     );
  12.   返回的HWND可以保存下来,以供以后使用,也可不保存。
  13.   该函数会在其父窗口上创建一个子窗口,类似于创建一个控间如按扭或列表框等。
  14.   该子窗口会占据父窗口一定空间,可带有播放按钮、进度条、菜单按钮等。
  15. 3.3.1 MCIWnd子窗口
  16. 示例:
  17.  ()建一个多文档的MFC应用程序。
  18.  ()在View类的头文件中加入变量:
  19.     HWND m_mciWnd;
  20.  ()在View类中用ClassWizard重载OnInitialUpdate函数。
  21.  ()在此函数中加入代码:
  22.      m_mciWnd=MCIWndCreate(m_hWnd, AfxGetInstanceHandle(), MCIWNDF_SHOWALL | MCIWNDF_RECORD, GetDocument()->GetPathName());
  23.    这里,m_hWnd为此View窗口的HWND
  24.       AfxGetInstanceHandle()可取得本应用程序的实例句柄,
  25.       MCIWNDF_flag们决定了子窗口中是否要加入播放按钮、录音按钮、菜单按钮、进度条等控件,
  26.       GetDocument()->GetPathName()则可获得通过打开文件对话框取得的文件名。
  27.  ()编译运行。
  28.  ()在运行的程序中已经可以任意打开一个多媒体文件进行播放。例如 .wav、.avi、.mid文件。
  29. 2、MCIWnd的使用
  30.   如果在MCIWnd子窗口中有播放按钮、录音按钮、菜单按钮、进度条等控件,可以通过它们操作多媒体。
  31.   如果象上例一样保存了MCIWndCreate函数返回的HWND,则不管子窗口中是否有控件,都可通过MCIWndxxxx函数操作多媒体。
  32.  ()在上面的程序中加入ID ID_NEWID_OPENID_PLAYID_PLAYREVERSEID_RECORDID_SAVEID_STOPID_CLOSE 的菜单项或Toolbar按钮。
  33.  ()在 ID_NEW 的消息响应函数中加入:
  34.      MCIWndNew(m_mciWnd,"waveaudio");
  35.    MCIWnd子窗口可以建立一个新的音频多媒体文件。
  36.  ()在 ID_OPEN 的消息响应函数中加入:
  37.      MCIWndOpen(m_mciWnd,"c:\\MyWav.wav",);
  38.    MCIWnd子窗口可以打开一个已存在的多媒体文件。
  39.  ()在 ID_PLAY 的消息响应函数中加入:
  40.      MCIWndPlay(m_mciWnd);
  41.    MCIWnd子窗口可以播放多媒体文件。
  42.  ()在 ID_PLAYREVERSE 的消息响应函数中加入:
  43.      MCIWndPlayReverse(m_mciWnd);
  44.    MCIWnd子窗口可以倒着播放视频多媒体文件。
  45.  ()在 ID_RECORD 的消息响应函数中加入:
  46.      MCIWndRecord(m_mciWnd);
  47.    MCIWnd子窗口可以录制音频多媒体文件。
  48.  ()在 ID_SAVE 的消息响应函数中加入:
  49.      MCIWndSave(m_mciWnd,"c:\\MyWav.wav");
  50.    MCIWnd子窗口可以保存已录制的音频多媒体文件。
  51.  ()在 ID_STOP 的消息响应函数中加入:
  52.      MCIWndStop(m_mciWnd);
  53.    MCIWnd子窗口可以停止正在播放或录制的多媒体文件。
  54.  ()在 ID_CLOSE 的消息响应函数中加入:
  55.      MCIWndClose(m_mciWnd);
  56.    MCIWnd子窗口可以关闭当前的多媒体文件,若要再使用,必须重新打开。
  57.  ()编译运行。
  58. ///////////////////////////////////////////////////////////////////////////////////////////////
  59. 如何响应消息:
  60. 创建播放播放窗口时使用 MCIWNDF_NOTIFYMODE 属性。
  61. 然后做一个消息映射。
  62. ON_MESSAGE(MCIWNDM_NOTIFYMODE, OnMCINotify)
  63. 然后在OnMCINotify()函数中判断是否收到停止消息(播完就会收到),然后播放下一个。
  64. 相关代码如下:
  65. .h
  66. afx_msg void OnMCINotify(WPARAM wParam,LPARAM lParam);
  67. .cpp
  68. ON_MESSAGE(MCIWNDM_NOTIFYMODE, OnMCINotify)
  69. BOOL MyVideoDlg::OnInitDialog()
  70. {
  71. ......
  72. m_hWndVideo = MCIWndCreate(
  73. this-> GetSafeHwnd(),
  74. AfxGetInstanceHandle(),
  75. WS_CHILD|WS_VISIBLE|WS_BORDER|
  76. MCIWNDF_NOPLAYBAR |
  77. MCIWNDF_NOMENU|MCIWNDF_NOTIFYMODE,
  78. m_sFileName.GetBuffer());
  79. MCIWndPlay(m_hWndVideo);
  80. ......
  81. }
  82. void MyVideoDlg::OnMCINotify(WPARAM wParam,LPARAM lParam)
  83. {
  84. if(lParam==MCI_MODE_STOP)
  85. {
  86. 播放下一个
  87. }
  88. }
  89. ///////////////////////////////////////////////////////////////////////////////////////////////
  90. MCI(媒体控制接口)相关知识
  91. MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。
  92. MCI的控制方式:
  93. 一般说来,程序员使用两个函数就可以与MCI打交道了:
  94. MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);
  95. 命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VBTOOLBOOK等。
  96. MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
  97. 命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
  98. 对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
  99. 对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。
  100. 举例:
  101. mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备
  102. mciSendString("open aaa.avi", , , ); // 打开文件"aaa.avi"
  103. MCI的设备类型:
  104. 设备描述描述字符串说明
  105. MCI_ALL_DEVICE_ID所有设备
  106. MCI_DEVTYPE_ANIMATIONAnimation动画设备
  107. MCI_DEVTYPE_CD_AUDIOCdaudioCD音频
  108. MCI_DEVTYPE_DATDat数字音频
  109. MCI_DEVTYPE_DIGITAL_VIDEODigitalvideo数字视频
  110. MCI_DEVTYPE_OTHEROther未定义设备
  111. MCI_DEVTYPE_OVERLAYOverlay重叠视频
  112. MCI_DEVTYPE_SCANNERScanner扫描仪
  113. MCI_DEVTYPE_SEQUENCERSequencer MIDI序列器
  114. MCI_DEVTYPE_VCRVcr合式录像机
  115. MCI_DEVTYPE_VIDEODISCVideodisc激光视盘
  116. MCI_DEVTYPE_WAVEFORM_AUDIOwaveaudio Wave音频
  117. 对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:
  118. [mci]
  119. cdaudio=mcicda.drv
  120. sequencer=mciseq.drv
  121. waveaudio=mciwave.drv
  122. avivideo=mciavi.drv
  123. videodisc=mcipionr.drv
  124. vcr=mcivisca.drv
  125. ActiveMovie=mciqtz.drv
  126. QTWVideo=mciqtw.drv
  127. MPEGVideo=C:\PROGRA~\XING\XINGMP~\xmdrv95.dll
  128. 其中最后两句分别指明了AppleQuickTime设备,设备名为"QTWVidio"MPEG影像设备,设备名为"MPEGVideo"
  129. //------------------------------
  130. // 广告时间:
  131. // 欢迎访问 C++ Builder 研究 - http://www.ccrun.com
  132. //------------------------------
  133. MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。
  134. 举个例子来说,打开一个多媒体文件有以下三种方式:
  135. []:自动识别:打开一个"WAV"文件
  136. MCI_OPEN_PARMS mciOpen;
  137. mciOpen.lpstrDeviceType = ;
  138. mciOpen.lpstrElementName = "aaa.wav";
  139. mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
  140. []:指定设备描述:打开CD播放器
  141. MCI_OPEN_PARMS mciOpen;
  142. mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
  143. mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
  144. []:指定描述字符串: 打开一个AVI文件
  145. MCI_OPEN_PARMS mciOpen;
  146. mciOpen.lpstrDeviceType = "avivideo";
  147. mciOpen.lpstrElementName = "aaa.avi";
  148. mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
  149. 注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
  150. MCI指令
  151. MCI_BREAK设置中断键,缺省是”CTRL+BREAK"
  152. MCI_CAPTURE抓取当前帧并存入指定文件,仅用于数字视频
  153. MCI_CLOSE关闭设备
  154. MCI_CONFIGURE弹出配置对话框,仅用于数字视频
  155. MCI_COPY拷贝数据至剪贴板
  156. MCI_CUE延时播放或录音
  157. MCI_CUT删除数据
  158. MCI_DELETE删除数据
  159. MCI_ESCAPE仅用于激光视频
  160. MCI_FREEZE将显示定格
  161. MCI_GETDEVCAPS获取设备信息
  162. MCI_INDEX当前屏幕显示与否,仅用于VCR设备
  163. MCI_INFO获取字符串信息
  164. MCI_LIST获取输入设备数量,支持数字视频和VCR设备
  165. MCI_LOAD装入一个文件
  166. MCI_MARK取消或做一个记号,与MCI_SEEK配套
  167. MCI_MARK取消或做一个记号,与MCI_SEEK配套
  168. MCI_MONITOR为数字视频指定报告设备
  169. MCI_OPEN打开设备
  170. MCI_PASTE粘帖数据
  171. MCI_PAUSE暂停当前动作
  172. MCI_PLAY播放
  173. MCI_PUT设置源、目的和边框矩形
  174. MCI_QUALITY定义设备缺省质量
  175. MCI_RECORD开始录制
  176. MCI_RESERVE分配硬盘空间
  177. MCI_RESTORE拷贝一个bmp文件至帧缓冲
  178. MCI_RESUME使一个暂停设备重新启动
  179. MCI_SAVE保存数据
  180. MCI_SEEK更改媒体位置
  181. MCI_SET设置设备信息
  182. MCI_SETAUDIO设置音量
  183. MCI_SETTIMECODE启用或取消VCR设备的时间码
  184. MCI_SETTUNER设置VCR设备频道
  185. MCI_SETVIDEO设置video参数
  186. MCI_SIGNAL在工作区上设置指定空间
  187. MCI_STATUS获取设备信息
  188. MCI_STEP使播放设备跳帧
  189. MCI_STOP停止播放
  190. MCI_SYSINFO返回MCI设备信息
  191. MCI_UNDO取消操作
  192. MCI_UNFREEZE使使用MCI_UNFREEZE的视频缓冲区恢复运动
  193. MCI_UPDATE更新显示区域
  194. MCI_WHERE获取设备裁减矩形
  195. MCI_WINDOW指定图形设备窗口和窗口特性
  196. 其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。

vc 播放音乐的更多相关文章

  1. pcDuino-V2利用madplay播放音乐

    在pcDuino的UBUNTU系统下,打开控制台,利用apt-get来下载madplay软件. sudo apt-get install madplay 播放音乐: madplay xxx.mp3 x ...

  2. matlab播放音乐

    最近在做计算,写了一些matlab代码,脑壳还疼,所以决定发挥一下逗B精神,写一个程序玩一下. 想了想,既然写代码的时候喜欢听歌,而且我的电脑打开网易音乐的速度巨慢(不知道为什么..),那些一个程序直 ...

  3. go语言让windows发出声音,或者播放音乐

    go语言让windows发出声音,或者播放音乐的例子:会发出alert警告的声音 ( 这是我应群员的求助写的, 如果你需要了解其中的调用原理或过程 或更多go语言调用win32api的资料,加群: 2 ...

  4. Inno调用dll --- 实现背景播放音乐

    Inno 播放音乐可以调用系统api函数mciSendString来实现,而mciSendString函数存在C:\Windows\System32\winmm.dll中,因此最终只要成功从该dll文 ...

  5. 【分享】4412开发板ubuntu 12.0.4播放音乐没有声音解决方法

    转自迅为论坛:http://bbs.topeetboard.com 准备工作 1.下载 vim 在命令行上输入 apt-get install vim 下载 vim 2.输入 vim /etc/hos ...

  6. 在Linux终端命令行下播放音乐的命令(Ubuntu)

    现在的 Linux 桌面已经发展的很好了,在桌面下播放音乐操作起来也很简单.那么我们还记得在桌面不是那么好的时候我们是怎么播放音乐的么?哎,我是想不起来了,实在是太难了. 不过现在我们可以先安装一个小 ...

  7. C# 调用系统winmm.dll 播放音乐wav mp3

    using System.Runtime.InteropServices;//放wav public partial class frmMain : Form { 系统放 播放音乐 wav mp3 [ ...

  8. iOS开发系列--扩展--播放音乐库中的音乐

    众所周知音乐是iOS的重要组成播放,无论是iPod.iTouch.iPhone还是iPad都可以在iTunes购买音乐或添加本地音乐到音乐 库中同步到你的iOS设备.在MediaPlayer.fram ...

  9. C# Window Form播放音乐的4种方式

    C#播放背景音乐通常有四种方式: 1.播放系统事件声音 2.使用System.Media.SoundPlayer播放wav------------------------仅仅是对波形音乐 3.使用MC ...

随机推荐

  1. Jmeter 中JDBC request 详解 !

    JDBC Request: 这个sampler可以向数据库发送一个jdbc请求(sql语句),它经常需要和JDBC Connection Configuration 配置元件一起配合使用. 目录: 一 ...

  2. chrome 常用插件集锦

    stylish 改变浏览器CSS样式

  3. P2812 校园网络【[USACO]Network of Schools加强版】

    题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们. 题目描述 共 ...

  4. (转)Linux GCC常用命令

    1简介 2简单编译 2.1预处理 2.2编译为汇编代码(Compilation) 2.3汇编(Assembly) 2.4连接(Linking) 3多个程序文件的编译 4检错 5库文件连接 5.1编译成 ...

  5. 【刷题】洛谷 P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...

  6. 【刷题】BZOJ 1095 [ZJOI2007]Hide 捉迷藏

    Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...

  7. centos上部署nginx服务

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...

  8. Codeforces Round #207 (Div. 2)A B C E 水 思路 set 恶心分类

    A. Group of Students time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. BNU-2017.7.4排位赛2总结

    链接:https://www.bnuoj.com/v3/contest_show.php?cid=9147#info A题 sort之后交换首尾两个数. B题 for一遍,如果每个数都在对应位置了,输 ...

  10. LINUX安全加固操作

    1.禁止Ctrl-Alt-Delete组合键重启系统 vi /etc/inittab #ca::ctrlaltdel:/sbin/shutdown -t3 -r now 如果还存在下面的文件,则需要注 ...