当前位置:   article > 正文

使用C++播放声音的完整指南_c++新手学习]windows下如何使用c++播放mp3 原

c++新手学习]windows下如何使用c++播放mp3 原

1. 准备工作:


首先,我们需要选择一个合适的音频库。在C++中,常用的音频库有OpenAL、SDL和SFML等。这里我们选择使用SFML库,因为它易于使用且跨平台性好。

2. 安装SFML库:
在开始之前,请确保已经安装了SFML库。你可以从SFML的官方网站(https://www.sfml-dev.org/)下载并安装适合你的操作系统的版本。

3. 创建C++项目:
在你的C++项目中,包含SFML的头文件,并链接相应的库文件。如果你使用的是集成开发环境(IDE),请按照IDE的指导手册进行设置。如果你使用的是命令行编译,你需要添加相应的编译选项。

2. 播放声音:


下面的代码演示了如何使用SFML库来播放声音文件。

  1. #include <SFML/Audio.hpp>
  2. int main()
  3. {
  4.     sf::SoundBuffer buffer;
  5.     if (!buffer.loadFromFile("sound.wav"))
  6.     {
  7.         // 处理加载失败的情况
  8.         return -1;
  9.     }
  10.     sf::Sound sound;
  11.     sound.setBuffer(buffer);
  12.     sound.play();
  13.     // 运行一段时间,让声音播放
  14.     sf::sleep(sf::seconds(5));
  15.     return 0;
  16. }

在上面的代码中,我们首先创建了一个`sf::SoundBuffer`对象,并使用`loadFromFile`函数从文件中加载声音。然后,我们创建了一个`sf::Sound`对象,并将加载的声音缓冲设置给它。最后,我们调用`play`函数来播放声音。

5. 播放自己准备好的声音:
如果你想播放自己准备好的声音文件,只需将文件路径替换为你的声音文件的路径即可。确保声音文件位于当前工作目录或者指定了正确的相对路径。

  1. if (!buffer.loadFromFile("path_to_your_sound_file.wav"))
  2. {
  3.     // 处理加载失败的情况
  4.     return -1;
  5. }

请注意,在使用SFML库时,支持的音频格式包括.wav、.ogg和.flac等。

3.如何不用第三方库播放声音

可以使用Windows的Multimedia API来播放声音。具体步骤如下:

1.首先需要包含Windows.h头文件和Mmsystem.h头文件。

  1. #include <Windows.h>
  2. #include <Mmsystem.h>

2.定义一个回调函数,在这个函数中填充音频数据。

  1. void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
  2. {
  3.     // 填充音频数据
  4. }

3.使用waveOutOpen函数打开音频设备,并指定回调函数。

  1. WAVEFORMATEX wfx;
  2. wfx.wFormatTag = WAVE_FORMAT_PCM;  // 指定PCM格式
  3. wfx.nChannels = 1;                // 单声道
  4. wfx.nSamplesPerSec = 44100;       // 采样率
  5. wfx.wBitsPerSample = 16;          // 量化位数
  6. wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
  7. wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
  8. HWAVEOUT hwo;
  9. MMRESULT result = waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (DWORD_PTR)waveOutProc, NULL, CALLBACK_FUNCTION);

4.使用waveOutWrite函数向音频设备写入数据。

  1. WAVEHDR whdr;
  2. whdr.lpData = // 音频数据指针
  3. whdr.dwBufferLength = // 音频数据长度
  4. whdr.dwFlags = 0;
  5. result = waveOutWrite(hwo, &whdr, sizeof(WAVEHDR));

5.使用waveOutReset函数重置音频设备,停止播放。

result = waveOutReset(hwo);

完整的代码示例:

  1. #include <Windows.h>
  2. #include <Mmsystem.h>
  3. #pragma comment(lib, "Winmm.lib")
  4. void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
  5. {
  6.     // 填充音频数据
  7. }
  8. int main()
  9. {
  10.     WAVEFORMATEX wfx;
  11.     wfx.wFormatTag = WAVE_FORMAT_PCM;  // 指定PCM格式
  12.     wfx.nChannels = 1;                // 单声道
  13.     wfx.nSamplesPerSec = 44100;       // 采样率
  14.     wfx.wBitsPerSample = 16;          // 量化位数
  15.     wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
  16.     wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
  17.     HWAVEOUT hwo;
  18.     MMRESULT result = waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (DWORD_PTR)waveOutProc, NULL, CALLBACK_FUNCTION);
  19.     // 填充音频数据
  20.     const int bufferSize = 44100 * 2;
  21.     char buffer[bufferSize];
  22.     // ...
  23.     WAVEHDR whdr;
  24.     whdr.lpData = buffer;
  25.     whdr.dwBufferLength = bufferSize;
  26.     whdr.dwFlags = 0;
  27.     result = waveOutWrite(hwo, &whdr, sizeof(WAVEHDR));
  28.     Sleep(3000);  // 播放3秒
  29.     result = waveOutReset(hwo);
  30.     return 0;
  31. }

通过本文的指南,你应该能够轻松地在C++项目中播放声音了。记得合理处理错误和异常情况。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号