以下是一个使用 (Visual) C++ 播放、暂停和停止 MP3 音频文件的代码示例:
#include
#include
#pragma comment(lib, "Winmm.lib")
// 全局变量
HWAVEOUT hWaveOut; // WaveOut 句柄
WAVEFORMATEX waveFormat; // 音频格式
HWAVEIN hWaveIn; // WaveIn 句柄
WAVEHDR waveHeader; // 音频缓冲区
// 声明函数
void PlayMP3(const char* filename);
void PauseMP3();
void StopMP3();
// 播放 MP3 文件
void PlayMP3(const char* filename)
{
// 打开文件
HMMIO hFile = mmioOpenA(const_cast(filename), nullptr, MMIO_READ);
if (hFile == nullptr) {
printf("无法打开文件\n");
return;
}
// 找到 RIFF 标识
MMRESULT result;
MMCKINFO ckInRiff;
ckInRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
result = mmioDescend(hFile, &ckInRiff, nullptr, MMIO_FINDRIFF);
if (result != MMSYSERR_NOERROR) {
printf("未找到 RIFF 标识\n");
mmioClose(hFile, 0);
return;
}
// 找到 fmt 标识
MMCKINFO ckIn;
ckIn.ckid = mmioFOURCC('f', 'm', 't', ' ');
result = mmioDescend(hFile, &ckIn, &ckInRiff, MMIO_FINDCHUNK);
if (result != MMSYSERR_NOERROR) {
printf("未找到 fmt 标识\n");
mmioClose(hFile, 0);
return;
}
// 读取音频格式
result = mmioRead(hFile, reinterpret_cast(&waveFormat), sizeof(waveFormat));
if (result != sizeof(waveFormat)) {
printf("无法读取音频格式\n");
mmioClose(hFile, 0);
return;
}
// 找到 data 标识
MMCKINFO ckInData;
ckInData.ckid = mmioFOURCC('d', 'a', 't', 'a');
result = mmioDescend(hFile, &ckInData, &ckInRiff, MMIO_FINDCHUNK);
if (result != MMSYSERR_NOERROR) {
printf("未找到 data 标识\n");
mmioClose(hFile, 0);
return;
}
// 分配音频缓冲区
waveHeader.lpData = reinterpret_cast(new char[ckInData.cksize]);
waveHeader.dwBufferLength = ckInData.cksize;
waveHeader.dwFlags = 0;
waveHeader.dwLoops = 0;
// 读取音频数据
result = mmioRead(hFile, waveHeader.lpData, waveHeader.dwBufferLength);
if (result != waveHeader.dwBufferLength) {
printf("无法读取音频数据\n");
delete[] waveHeader.lpData;
mmioClose(hFile, 0);
return;
}
// 关闭文件
mmioClose(hFile, 0);
// 打开 WaveOut 设备
result = waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveFormat, 0, 0, CALLBACK_NULL);
if (result != MMSYSERR_NOERROR) {
printf("无法打开 WaveOut 设备\n");
delete[] waveHeader.lpData;
return;
}
// 写入音频数据
result = waveOutPrepareHeader(hWaveOut, &waveHeader, sizeof(waveHeader));
if (result != MMSYSERR_NOERROR) {
printf("无法准备音频数据\n");
delete[] waveHeader.lpData;
waveOutClose(hWaveOut);
return;
}
// 播放音频
result = waveOutWrite(hWaveOut, &waveHeader, sizeof(waveHeader));
if (result != MMSYSERR_NOERROR) {
printf("无法播放音频\n");
上一篇:播放/停止按钮