vc 播放音乐
- #include <vfw.h>
- #pragma comment(lib,"vfw32.lib")
- ● 简单实现
- 要实现一个播放器,首先要先建立一个MFC应用程序,例如一个基于Dialog的MFC程序。一个简单实现的代码如下:
- HWND m_hAudio;
- m_hAudio = MCIWndCreate( GetSafeHwnd(), AfxGetInstanceHandle(), WS_CHILD | MCIWNDF_NOMENU, _T("音乐.mp3") );
- //m_hAudio = MCIWndCreate(m_hWnd,NULL,WS_CHILD | WS_CAPTION | WS_VISIBLE | MCIWNDF_SHOWPOS | MCIWNDF_SHOWNAME,filename);//可以显示播放器的小窗口。
- if( MCIWndCanPlay( m_hAudio ) )
- {
- MCIWndPlay( m_hAudio );
- }
- 这样,就可以播放出音乐来。支持的格式有wave files, midi files, AVI Video, cd audio, vcr, video disc, and others..,自己尝试了一下,好像还可以播放视频中的音轨。
- ● 常用的API函数
- /** 窗口句柄所指对象是否可播放 */
- MCIWndCanPlay(hwnd)
- /** 窗口句柄所指对象是否可录音 */
- MCIWndCanRecord(hwnd)
- /** 进行录音 */
- MCIWndRecord(hwnd)
- /** 关闭窗口句柄 */
- MCIWndClose(hwnd)
- /** 播放窗口句柄所指对象 */
- MCIWndPlay(hwnd)
- /** 停止播放窗口句柄所指对象 */
- MCIWndStop(hwnd)
- /** 暂停播放窗口句柄所指对象 */
- MCIWndPause(hwnd)
- /** 恢复(暂停)播放窗口句柄所指对象 */
- MCIWndResume(hwnd)
- /** 移动播放进度至指定位置 */
- MCIWndSeek(hwnd, lPos)
- /** 移动播放进度至初始位置 */
- MCIWndHome(hwnd)
- /** 移动播放进度至结束位置 */
- MCIWndEnd(hwnd)
- /** 倒退播放窗口句柄所指对象 */
- MCIWndPlayReverse(hwnd)
- /** 从指定位置播放窗口句柄所指对象 */
- MCIWndPlayFrom(hwnd, lPos)
- /** 播放窗口句柄所指对象直至指定位置 */
- MCIWndPlayTo(hwnd, lPos)
- /** 播放窗口句柄所指对象的指定区间 */
- MCIWndPlayFromTo(hwnd, lStart, lEnd)
- /** 获取当前的播放进度 */
- MCIWndGetPosition(hwnd)
- /** 获取窗口句柄所指对象文件的长度 */
- MCIWndGetLength(hwnd)
- /** 销毁窗口句柄 */
- MCIWndDestroy(hwnd)
- /** 设置播放音量 */
- MCIWndSetVolume(hwnd,iVol)
- /** 获取当前播放音量 */
- MCIWndGetVolume(hwnd)
- /** 设置播放速率 */
- MCIWndSetSpeed(hwnd,iSpeed)
- /** 获取播放速率 */
- MCIWndGetSpeed(hwnd)
- /** 设置是否循环播放 */
- MCIWndSetRepeat(hwnd,f)
- /** 获取是否循环播放 */
- MCIWndGetRepeat(hwnd
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- MCIWnd的使用
- Windows中提供了一个MCIWnd窗口类,可以更加方便的在一个VC窗口中操作多媒体。
- 使用MCIWnd,源文件中需要包含头文件 vfw.h,在Project->Settings->Link->Object/libray module中加入库 vfw32.lib。
- 1、MCIWnd的创建
- MCIWnd子窗口的创建可使用MCIWndCreate函数:
- HWND MCIWndCreate(
- HWND hwndParent, //父窗口句柄
- HINSTANCE hInstance, //应用程序的实例句柄
- DWORD dwStyle, //显示风格
- LPSTR szFile //多媒体文件名
- );
- 返回的HWND可以保存下来,以供以后使用,也可不保存。
- 该函数会在其父窗口上创建一个子窗口,类似于创建一个控间如按扭或列表框等。
- 该子窗口会占据父窗口一定空间,可带有播放按钮、进度条、菜单按钮等。
- 图3.3.1 MCIWnd子窗口
- 示例:
- ()建一个多文档的MFC应用程序。
- ()在View类的头文件中加入变量:
- HWND m_mciWnd;
- ()在View类中用ClassWizard重载OnInitialUpdate函数。
- ()在此函数中加入代码:
- m_mciWnd=MCIWndCreate(m_hWnd, AfxGetInstanceHandle(), MCIWNDF_SHOWALL | MCIWNDF_RECORD, GetDocument()->GetPathName());
- 这里,m_hWnd为此View窗口的HWND,
- AfxGetInstanceHandle()可取得本应用程序的实例句柄,
- MCIWNDF_flag们决定了子窗口中是否要加入播放按钮、录音按钮、菜单按钮、进度条等控件,
- GetDocument()->GetPathName()则可获得通过打开文件对话框取得的文件名。
- ()编译运行。
- ()在运行的程序中已经可以任意打开一个多媒体文件进行播放。例如 .wav、.avi、.mid文件。
- 2、MCIWnd的使用
- 如果在MCIWnd子窗口中有播放按钮、录音按钮、菜单按钮、进度条等控件,可以通过它们操作多媒体。
- 如果象上例一样保存了MCIWndCreate函数返回的HWND,则不管子窗口中是否有控件,都可通过MCIWndxxxx函数操作多媒体。
- ()在上面的程序中加入ID为 ID_NEW、ID_OPEN、ID_PLAY、ID_PLAYREVERSE、ID_RECORD、ID_SAVE、ID_STOP、ID_CLOSE 的菜单项或Toolbar按钮。
- ()在 ID_NEW 的消息响应函数中加入:
- MCIWndNew(m_mciWnd,"waveaudio");
- MCIWnd子窗口可以建立一个新的音频多媒体文件。
- ()在 ID_OPEN 的消息响应函数中加入:
- MCIWndOpen(m_mciWnd,"c:\\MyWav.wav",);
- MCIWnd子窗口可以打开一个已存在的多媒体文件。
- ()在 ID_PLAY 的消息响应函数中加入:
- MCIWndPlay(m_mciWnd);
- MCIWnd子窗口可以播放多媒体文件。
- ()在 ID_PLAYREVERSE 的消息响应函数中加入:
- MCIWndPlayReverse(m_mciWnd);
- MCIWnd子窗口可以倒着播放视频多媒体文件。
- ()在 ID_RECORD 的消息响应函数中加入:
- MCIWndRecord(m_mciWnd);
- MCIWnd子窗口可以录制音频多媒体文件。
- ()在 ID_SAVE 的消息响应函数中加入:
- MCIWndSave(m_mciWnd,"c:\\MyWav.wav");
- MCIWnd子窗口可以保存已录制的音频多媒体文件。
- ()在 ID_STOP 的消息响应函数中加入:
- MCIWndStop(m_mciWnd);
- MCIWnd子窗口可以停止正在播放或录制的多媒体文件。
- ()在 ID_CLOSE 的消息响应函数中加入:
- MCIWndClose(m_mciWnd);
- MCIWnd子窗口可以关闭当前的多媒体文件,若要再使用,必须重新打开。
- ()编译运行。
- ///////////////////////////////////////////////////////////////////////////////////////////////
- 如何响应消息:
- 创建播放播放窗口时使用 MCIWNDF_NOTIFYMODE 属性。
- 然后做一个消息映射。
- ON_MESSAGE(MCIWNDM_NOTIFYMODE, OnMCINotify)
- 然后在OnMCINotify()函数中判断是否收到停止消息(播完就会收到),然后播放下一个。
- 相关代码如下:
- .h中
- afx_msg void OnMCINotify(WPARAM wParam,LPARAM lParam);
- .cpp中
- ON_MESSAGE(MCIWNDM_NOTIFYMODE, OnMCINotify)
- BOOL MyVideoDlg::OnInitDialog()
- {
- ......
- m_hWndVideo = MCIWndCreate(
- this-> GetSafeHwnd(),
- AfxGetInstanceHandle(),
- WS_CHILD|WS_VISIBLE|WS_BORDER|
- MCIWNDF_NOPLAYBAR |
- MCIWNDF_NOMENU|MCIWNDF_NOTIFYMODE,
- m_sFileName.GetBuffer());
- MCIWndPlay(m_hWndVideo);
- ......
- }
- void MyVideoDlg::OnMCINotify(WPARAM wParam,LPARAM lParam)
- {
- if(lParam==MCI_MODE_STOP)
- {
- 播放下一个
- }
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////
- MCI(媒体控制接口)相关知识
- MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。
- MCI的控制方式:
- 一般说来,程序员使用两个函数就可以与MCI打交道了:
- MCIERROR mciSendCommand(MCIDEVICEID wDeviceID, UINT uMsg, DWORD dwFlags, DWORD dwParam);
- 命令字符串方式,用接近于日常生活用语的方式发送控制命令,适用于高级编程如VB、TOOLBOOK等。
- MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString, UINT cchReturn, HANDLE hwndCallback);
- 命令消息方式,用专业语法发送控制消息,适用于VC等语言编程,此方式直接与MCI设备打交道。
- 对于mciSendCommand,第一个参数指定了设备标识,这个标识会在程序员打开MCI设备时由系统提供。第二个参数指定将如何控制设备,详细请查阅后面“MCI指令”一栏。第三个参数为访问标识,第四个参数一般是一个数据结构,标识程序在访问MCI时要的一些信息。有关详细资料,请查阅本光盘配套书。
- 对于mciSendString,第一个参数为一串控制字符串,返回信息由系统填入第二个参数,第三个参数指明返回信息的最大长度,若对MCI装置设定了"notify"标志则需要在第四个参数填上返回窗口句柄。
- 举例:
- mciSendCommand(DeviceID, MCI_CLOSE, NULL, NULL); // 关闭一个MCI设备
- mciSendString("open aaa.avi", , , ); // 打开文件"aaa.avi"
- MCI的设备类型:
- 设备描述描述字符串说明
- MCI_ALL_DEVICE_ID所有设备
- MCI_DEVTYPE_ANIMATIONAnimation动画设备
- MCI_DEVTYPE_CD_AUDIOCdaudioCD音频
- MCI_DEVTYPE_DATDat数字音频
- MCI_DEVTYPE_DIGITAL_VIDEODigitalvideo数字视频
- MCI_DEVTYPE_OTHEROther未定义设备
- MCI_DEVTYPE_OVERLAYOverlay重叠视频
- MCI_DEVTYPE_SCANNERScanner扫描仪
- MCI_DEVTYPE_SEQUENCERSequencer MIDI序列器
- MCI_DEVTYPE_VCRVcr合式录像机
- MCI_DEVTYPE_VIDEODISCVideodisc激光视盘
- MCI_DEVTYPE_WAVEFORM_AUDIOwaveaudio Wave音频
- 对于未在上面定义的MCI设备,用户可查看system.ini文件中[mci]部分,例如:
- [mci]
- cdaudio=mcicda.drv
- sequencer=mciseq.drv
- waveaudio=mciwave.drv
- avivideo=mciavi.drv
- videodisc=mcipionr.drv
- vcr=mcivisca.drv
- ActiveMovie=mciqtz.drv
- QTWVideo=mciqtw.drv
- MPEGVideo=C:\PROGRA~\XING\XINGMP~\xmdrv95.dll
- 其中最后两句分别指明了Apple的QuickTime设备,设备名为"QTWVidio"、MPEG影像设备,设备名为"MPEGVideo"。
- //------------------------------
- // 广告时间:
- // 欢迎访问 C++ Builder 研究 - http://www.ccrun.com
- //------------------------------
- 在MCI编程中,既可以将设备描述当设备名,也可以将描述字符串当设备名,一个极端偷懒的办法是程序员不要在程序中指定设备名,Windows将自动根据文件扩展名识别设备类型。
- 举个例子来说,打开一个多媒体文件有以下三种方式:
- []:自动识别:打开一个"WAV"文件
- MCI_OPEN_PARMS mciOpen;
- mciOpen.lpstrDeviceType = ;
- mciOpen.lpstrElementName = "aaa.wav";
- mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
- []:指定设备描述:打开CD播放器
- MCI_OPEN_PARMS mciOpen;
- mciOpen.lpstrDeviceType = (LPSTR)MCI_DEVTYPE_CD_AUDIO ;
- mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID, (DWORD)&mciOpen);
- []:指定描述字符串: 打开一个AVI文件
- MCI_OPEN_PARMS mciOpen;
- mciOpen.lpstrDeviceType = "avivideo";
- mciOpen.lpstrElementName = "aaa.avi";
- mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
- 注意三种打开方式中,函数第三个参数的区别,后面会讲到这种区别。
- MCI指令
- MCI_BREAK设置中断键,缺省是”CTRL+BREAK"
- MCI_CAPTURE抓取当前帧并存入指定文件,仅用于数字视频
- MCI_CLOSE关闭设备
- MCI_CONFIGURE弹出配置对话框,仅用于数字视频
- MCI_COPY拷贝数据至剪贴板
- MCI_CUE延时播放或录音
- MCI_CUT删除数据
- MCI_DELETE删除数据
- MCI_ESCAPE仅用于激光视频
- MCI_FREEZE将显示定格
- MCI_GETDEVCAPS获取设备信息
- MCI_INDEX当前屏幕显示与否,仅用于VCR设备
- MCI_INFO获取字符串信息
- MCI_LIST获取输入设备数量,支持数字视频和VCR设备
- MCI_LOAD装入一个文件
- MCI_MARK取消或做一个记号,与MCI_SEEK配套
- MCI_MARK取消或做一个记号,与MCI_SEEK配套
- MCI_MONITOR为数字视频指定报告设备
- MCI_OPEN打开设备
- MCI_PASTE粘帖数据
- MCI_PAUSE暂停当前动作
- MCI_PLAY播放
- MCI_PUT设置源、目的和边框矩形
- MCI_QUALITY定义设备缺省质量
- MCI_RECORD开始录制
- MCI_RESERVE分配硬盘空间
- MCI_RESTORE拷贝一个bmp文件至帧缓冲
- MCI_RESUME使一个暂停设备重新启动
- MCI_SAVE保存数据
- MCI_SEEK更改媒体位置
- MCI_SET设置设备信息
- MCI_SETAUDIO设置音量
- MCI_SETTIMECODE启用或取消VCR设备的时间码
- MCI_SETTUNER设置VCR设备频道
- MCI_SETVIDEO设置video参数
- MCI_SIGNAL在工作区上设置指定空间
- MCI_STATUS获取设备信息
- MCI_STEP使播放设备跳帧
- MCI_STOP停止播放
- MCI_SYSINFO返回MCI设备信息
- MCI_UNDO取消操作
- MCI_UNFREEZE使使用MCI_UNFREEZE的视频缓冲区恢复运动
- MCI_UPDATE更新显示区域
- MCI_WHERE获取设备裁减矩形
- MCI_WINDOW指定图形设备窗口和窗口特性
- 其中比较常用的指令有MCI_OPEN、MCI_CLOSE、MCI_PLAY、MCI_STOP、MCI_PAUSE、MCI_STATUS等等。
vc 播放音乐的更多相关文章
- pcDuino-V2利用madplay播放音乐
在pcDuino的UBUNTU系统下,打开控制台,利用apt-get来下载madplay软件. sudo apt-get install madplay 播放音乐: madplay xxx.mp3 x ...
- matlab播放音乐
最近在做计算,写了一些matlab代码,脑壳还疼,所以决定发挥一下逗B精神,写一个程序玩一下. 想了想,既然写代码的时候喜欢听歌,而且我的电脑打开网易音乐的速度巨慢(不知道为什么..),那些一个程序直 ...
- go语言让windows发出声音,或者播放音乐
go语言让windows发出声音,或者播放音乐的例子:会发出alert警告的声音 ( 这是我应群员的求助写的, 如果你需要了解其中的调用原理或过程 或更多go语言调用win32api的资料,加群: 2 ...
- Inno调用dll --- 实现背景播放音乐
Inno 播放音乐可以调用系统api函数mciSendString来实现,而mciSendString函数存在C:\Windows\System32\winmm.dll中,因此最终只要成功从该dll文 ...
- 【分享】4412开发板ubuntu 12.0.4播放音乐没有声音解决方法
转自迅为论坛:http://bbs.topeetboard.com 准备工作 1.下载 vim 在命令行上输入 apt-get install vim 下载 vim 2.输入 vim /etc/hos ...
- 在Linux终端命令行下播放音乐的命令(Ubuntu)
现在的 Linux 桌面已经发展的很好了,在桌面下播放音乐操作起来也很简单.那么我们还记得在桌面不是那么好的时候我们是怎么播放音乐的么?哎,我是想不起来了,实在是太难了. 不过现在我们可以先安装一个小 ...
- C# 调用系统winmm.dll 播放音乐wav mp3
using System.Runtime.InteropServices;//放wav public partial class frmMain : Form { 系统放 播放音乐 wav mp3 [ ...
- iOS开发系列--扩展--播放音乐库中的音乐
众所周知音乐是iOS的重要组成播放,无论是iPod.iTouch.iPhone还是iPad都可以在iTunes购买音乐或添加本地音乐到音乐 库中同步到你的iOS设备.在MediaPlayer.fram ...
- C# Window Form播放音乐的4种方式
C#播放背景音乐通常有四种方式: 1.播放系统事件声音 2.使用System.Media.SoundPlayer播放wav------------------------仅仅是对波形音乐 3.使用MC ...
随机推荐
- Jmeter 中JDBC request 详解 !
JDBC Request: 这个sampler可以向数据库发送一个jdbc请求(sql语句),它经常需要和JDBC Connection Configuration 配置元件一起配合使用. 目录: 一 ...
- chrome 常用插件集锦
stylish 改变浏览器CSS样式
- P2812 校园网络【[USACO]Network of Schools加强版】
题目背景 浙江省的几所OI强校的神犇发明了一种人工智能,可以AC任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被♂掏♂空,他们来找你帮助他们. 题目描述 共 ...
- (转)Linux GCC常用命令
1简介 2简单编译 2.1预处理 2.2编译为汇编代码(Compilation) 2.3汇编(Assembly) 2.4连接(Linking) 3多个程序文件的编译 4检错 5库文件连接 5.1编译成 ...
- 【刷题】洛谷 P3808 【模板】AC自动机(简单版)
题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...
- 【刷题】BZOJ 1095 [ZJOI2007]Hide 捉迷藏
Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩 捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条 ...
- centos上部署nginx服务
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...
- 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 ...
- BNU-2017.7.4排位赛2总结
链接:https://www.bnuoj.com/v3/contest_show.php?cid=9147#info A题 sort之后交换首尾两个数. B题 for一遍,如果每个数都在对应位置了,输 ...
- LINUX安全加固操作
1.禁止Ctrl-Alt-Delete组合键重启系统 vi /etc/inittab #ca::ctrlaltdel:/sbin/shutdown -t3 -r now 如果还存在下面的文件,则需要注 ...