首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 播放聲音完全指南:從簡單 API 到資源內嵌與底層波形控制

     編輯:VC 教學

方法一:直接播放 WAV 檔案(最簡單)

// 非同步播放,找不到檔案時播放系統預設聲音
sndPlaySound(_T("C:\\Sound\\music.wav"), SND_ASYNC);

// 非同步播放,找不到檔案時靜默(不播放預設聲音)
PlaySound(_T("C:\\Sound\\music.wav"), NULL, SND_ASYNC | SND_NODEFAULT);

參數說明:SND_ASYNC 非同步、SND_NODEFAULT 不用預設聲音、SND_LOOP 循環播放。

方法二:將聲音內嵌為專案資源

步驟 1:匯入資源

資源檢視 → 右鍵「匯入」→ 選取 .wav 檔 → 類型輸入 WAVE → 資源 ID 如 IDR_WAVE1。

步驟 2:直接播放資源

PlaySound(MAKEINTRESOURCE(IDR_WAVE1), AfxGetResourceHandle(),
          SND_ASYNC | SND_RESOURCE | SND_NODEFAULT | SND_LOOP);

步驟 3:讀入記憶體後播放(可進一步處理資料)

HMODULE hMod = AfxGetResourceHandle();
HRSRC hRes = FindResource(hMod, MAKEINTRESOURCE(IDR_WAVE1), _T("WAVE"));
HGLOBAL hGlob = LoadResource(hMod, hRes);
LPCTSTR pData = (LPCTSTR)LockResource(hGlob);
sndPlaySound(pData, SND_MEMORY | SND_ASYNC);
FreeResource(hGlob);

方法三:底層波形音訊 API(完全控制)

適用於需混音、特效、串流等進階場景。核心流程:

  1. mmioOpen 開啟 RIFF/WAVE 檔
  2. 解析 fmt 區塊取得 WAVEFORMATEX 格式
  3. 定位 data 區塊讀取原始 PCM 資料
  4. waveOutOpen 開啟輸出裝置
  5. waveOutPrepareHeader/waveOutWrite 送出緩衝區
  6. 播放結束後 waveOutReset/waveOutClose 釋放

關鍵結構體

  • WAVEFORMATEX:採樣率、位深、聲道數等格式描述
  • WAVEHDR:緩衝區指標、長度、旗標
  • MMCKINFO:RIFF 區塊資訊

精簡代碼骨架

HMMIO hmmio = mmioOpen(szFile, NULL, MMIO_READ | MMIO_ALLOCBUF);
// ... 尋找 fmt chunk -> 讀取 WAVEFORMATEX ...
// ... 尋找 data chunk -> 讀取波形資料到 lpData ...
HWAVEOUT hWaveOut;
waveOutOpen(&hWaveOut, WAVE_MAPPER, lpFormat, 0, 0, CALLBACK_NULL);
WAVEHDR hdr = { (LPSTR)lpData, dwDataSize, 0, 0, 0, 0, 0, 0 };
waveOutPrepareHeader(hWaveOut, &hdr, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, &hdr, sizeof(WAVEHDR));
// 等待播放完成(可用事件或輪詢 WHDR_DONE)
waveOutUnprepareHeader(hWaveOut, &hdr, sizeof(WAVEHDR));
waveOutClose(hWaveOut);

專案設定提醒

  • 包含 #include <mmsystem.h>
  • 連結庫加入 winmm.lib(專案屬性 → 連結器 → 輸入 → 附加相依性)

選擇建議

場景推薦方法
簡單提示音、按鍵音方法一
隨程式發布、無外部檔案方法二
音訊編輯、視覺化、多聲道混音方法三
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved