C++ 播放声音

本文详细介绍了在Windows系统中播放各种格式声音的方法,包括使用MessageBeep播放系统预设声音,PlaySound播放WAV文件,MCI接口播放任意格式声音,MCIWndCreate创建播放窗口,以及利用WindowsMediaPlayer控件进行多媒体播放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、播放系统的消息声音

  BOOL WINAPI MessageBeep( __in  UINT uType);

   MSDN 中对这个函数的说明是:播放一个波形文件(也就是wav格式),每一个声音类型的波形声音在注册表中有一个条目(entry)指定.


 
  1. MessageBeep(MB_OK);

  2. Sleep(3000);

  3. MessageBeep(MB_ICONWARNING);

  4. Sleep(3000);

  5. MessageBeep(MB_ICONSTOP);

  6. Sleep(3000);

  7. MessageBeep(MB_ICONERROR);

  8. Sleep(3000);

  9. MessageBeep(MB_ICONEXCLAMATION);

 

二、播放mav格式声音

BOOL PlaySound(LPCTSTR pszSound,HMODULE hmod,DWORD fdwSound);

    具体的函数详情参照MSDN吧    一个简单实例如下

PlaySound("C:/love.wav",AfxGetInstanceHandle(), SND_FILENAME|SND_ASYNC );

 

三、利用MCI 接口实现播放任意格式声音


 
  1. #include <mmsystem.h> //导入声音头文件库

  2. #pragma comment(lib,"winmm.lib")//导入声音的链接库

然后直接用mciSendString函数即可  


 
  1. mciSendString("open C:/123.mp3" , NULL, 0, 0);

  2. mciSendString("play C:/123.mp3 ", NULL, 0, 0);

上面两条 便可以播放 C盘下的123.mp3 了

具体的mci 编程,有待进一步的学习

 

四、利用强悍的MCIWndCreate()函数


 
  1. HWND m_hwndMCI;

  2. if(m_hwndMCI!=NULL) //建立一个MCIWND 窗口

  3. {

  4. MCIWndDestroy(m_hwndMCI);

  5. }

  6. int type=0; //隐藏默认工具栏0 表显示

  7. CString filename="C:/123.mp3"; //要播放的文件文件名

  8. m_hwndMCI=MCIWndCreate(m_hWnd,AfxGetInstanceHandle(),type,filename);

  9. MCIWndPlay(m_hwndMCI);

 

五、利用Windows Media Player 控件

通过project--->add to project--->Components and Controls -->Registered ActiveX Controls--->Windows Media Player
Insert这个控件后,我们project中会自动添加17个类,这些都是Windows Media Player 控制相关的,同时我们的UI设计时的tools bar 中会多
出一个控件,那就 Windows Media Player ,拖到窗口上就能使用。
我们可以把这个控件关联成Control 类型的变量,这样,程序中就利用这个变量来设置WMPlayer。
如我们添加成变量名为:m_ctlWMPlayer,则利用,m_ctrWMPlayer.SetUrl("C:/123.mp3"),就可以播放我们c盘下的名为123.MP3的文件了
更深入的运用,有待更进一步的学习!

-

-------------------------------------------------------------------------------------------------------

2013-5-25 22:11::00 更新

六、播放蜂鸣

使用函数Beep 播放不同频率的蜂鸣


 
  1. BOOL WINAPI Beep(

  2. __in DWORD dwFreq, //频率

  3. __in DWORD dwDuration //持续时间

  4. );

如:

while(1)	Beep(5000,500);
<think>嗯,用户想在C++中实现播放声音的功能,需要示例代码。首先,我得回忆一下C++有哪些常用的音频播放方法。根据用户提供的引用,有几个不同的方法:PlaySound函数、SFML库、wxWidgets,以及更底层的waveOut函数和Core Audio APIs。 用户可能是一个刚开始学习C++的开发者,想要快速实现播放音频的功能,所以需要简单易懂的示例。PlaySound应该是最直接的方法,因为它属于Windows API,而且代码量少。不过,用户可能也需要跨平台的解决方案,这时候SFML或者wxWidgets可能更合适。但根据引用中的信息,SFML和wxWidgets的示例都是特定于库的,而用户的问题没有提到跨平台需求,可能优先考虑Windows环境下的实现。 用户提供的引用[1]和[4]都提到了PlaySound,但引用[1]的示例代码用了PlaySound,而引用[4]还提到了其他方法如waveOut和Core Audio,但指出后者可能有兼容性问题。所以对于初学者来说,PlaySound可能是最合适的选择,因为它简单,代码量少,容易理解。 另外,用户可能需要知道不同方法的优缺点。比如PlaySound只能播放WAV文件,而SFML支持更多格式,但需要额外安装库。wxWidgets也是一个选项,但可能更适合有GUI需求的用户。引用[3]中的wxWidgets示例需要创建按钮等,可能复杂度较高,如果用户只是需要播放声音,可能不需要GUI部分。 所以,回答应该首先推荐PlaySound方法,给出示例代码,并说明需要链接winmm库。然后,如果有跨平台需求,可以提到SFML,并给出示例。同时,要提醒用户不同方法的限制,比如文件格式支持和依赖库的安装。 用户的问题还提到“示例代码”,所以每个方法都需要提供代码片段。需要确保代码正确,比如引用[1]中的PlaySound示例是否正确,是否需要处理异步播放和停止。引用[4]中提到PlaySound是异步的,可能需要等待用户输入来停止播放,如示例中的cin.get()和PlaySound(NULL, NULL, 0)。 另外,需要注意用户是否了解如何配置项目,比如添加链接库。在PlaySound的例子中,需要链接winmm.lib,这在编译命令中可能需要加上-lwinmm或其他参数,具体取决于开发环境。 可能的问题,用户可能遇到无法播放的问题,比如文件路径错误,或者格式不支持。在代码示例中应该提醒检查文件路径是否正确,以及文件是否为WAV格式。 总结回答的结构:先介绍几种方法,按复杂度排序,先Windows API,再SFML,然后wxWidgets,最后提到其他底层方法。每个方法给出代码示例,并说明注意事项。最后生成相关问题,帮助用户进一步学习。</think>在C++中实现音频播放功能可根据需求选择不同方案,以下是三种典型方法的实现步骤和示例代码: ### 一、Windows API方案(最简单) ```cpp #include <windows.h> #include <mmsystem.h> #include <iostream> #pragma comment(lib, "winmm.lib") // 必须链接多媒体库 int main() { // 播放WAV音频文件(需绝对路径或项目路径下) if (PlaySound(TEXT("audio.wav"), NULL, SND_FILENAME | SND_ASYNC)) { std::cout << "音频播放中..." << std::endl; } else { std::cerr << "播放失败!错误代码:" << GetLastError() << std::endl; } // 保持程序运行 std::cout << "按回车键停止播放..." << std::endl; std::cin.get(); PlaySound(NULL, NULL, 0); // 停止播放 return 0; } ``` *特点*:仅支持WAV格式,需Windows平台,编译时添加`-lwinmm`链接参数[^1][^4] ### 二、SFML跨平台方案 ```cpp #include <SFML/Audio.hpp> int main() { sf::SoundBuffer buffer; if (!buffer.loadFromFile("sound.wav")) { std::cerr << "文件加载失败" << std::endl; return -1; } sf::Sound sound; sound.setBuffer(buffer); sound.play(); // 等待播放完成(非阻塞方式需单独线程) while (sound.getStatus() == sf::Sound::Playing) { sf::sleep(sf::milliseconds(100)); } return 0; } ``` *特点*:支持OGG/WAV/FLAC格式,需安装SFML库,编译命令示例:`g++ main.cpp -lsfml-audio -lsfml-system`[^2] ### 三、wxWidgets GUI集成方案 ```cpp #include <wx/wx.h> #include <wx/sound.h> class MyApp : public wxApp { public: virtual bool OnInit() { wxSound::Play("beep.wav", wxSOUND_ASYNC); return true; } }; wxIMPLEMENT_APP(MyApp); ``` *特点*:适合GUI应用程序,支持异步播放,需要配置wxWidgets开发环境[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值