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

VC 播放背景音樂/語音:PlaySound/sndPlaySound、SND_ASYNC/SND_MEMORY、WinMM 庫鏈接

     編輯:關於C語言

Windows 播放聲音的兩大 API

API頭文件庫特點
PlaySoundmmsystem.hwinmm.lib功能豐富,支持資源/內存/文件,異步/同步控制
sndPlaySoundmmsystem.hwinmm.lib較舊,僅支持文件/別名,功能受限

推薦使用 PlaySound。

核心調用示例

1. 異步播放文件 (不阻塞 UI)


#include 
#pragma comment(lib, "winmm.lib")

// 相對路徑或絕對路徑
PlaySound(_T("sound\\alert.wav"), NULL, SND_FILENAME | SND_ASYNC);

2. 同步播放 (阻塞直到播放完畢)


PlaySound(_T("sound\\click.wav"), NULL, SND_FILENAME | SND_SYNC);

3. 從內存播放 (資源嵌入 EXE)


// 1. 導入 WAV 為自定義資源 (資源類型 "WAVE", ID: IDR_WAVE1)
// 2. 代碼加載
HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_WAVE1), _T("WAVE"));
HGLOBAL hGlob = LoadResource(NULL, hRes);
LPVOID pData = LockResource(hGlob);
DWORD dwSize = SizeofResource(NULL, hRes);

PlaySound((LPCSTR)pData, NULL, SND_MEMORY | SND_ASYNC);

4. 停止當前播放


PlaySound(NULL, NULL, 0); // 停止所有異步播放

關鍵標誌位組合 (fuSound 參數)

標誌含義常用組合
SND_FILENAME第一參數為文件路徑默認行為
SND_RESOURCE第一參數為資源標識符 (需模塊句柄)PlaySound(MAKEINTRESOURCE(ID), hInst, SND_RESOURCE|SND_ASYNC)
SND_MEMORY第一參數為內存指針 (完整 WAV 數據)嵌入資源播放
SND_ASYNC異步播放,立即返回UI 不阻塞 必加
SND_SYNC同步播放,阻塞返回短提示音
SND_LOOP循環播放 (需配合 SND_ASYNC)背景音樂 SND_ASYNC|SND_LOOP
SND_NODEFAULT找不到聲音時不播放系統默認聲音靜默失敗
SND_NOSTOP不中斷正在播放的聲音疊加播放
SND_PURGE停止指定聲音的所有實例配合 SND_ASYNC 停止循環

完整背景音樂類封裝


class CBgmPlayer {
    bool m_playing;
public:
    CBgmPlayer() : m_playing(false) {}
    ~CBgmPlayer() { Stop(); }

    bool PlayFile(LPCTSTR pszFile, bool bLoop = true) {
        Stop();
        DWORD flags = SND_FILENAME | SND_ASYNC | (bLoop ? SND_LOOP : 0);
        if (PlaySound(pszFile, NULL, flags)) {
            m_playing = true;
            return true;
        }
        return false;
    }

    bool PlayResource(UINT nResID, bool bLoop = true) {
        Stop();
        DWORD flags = SND_RESOURCE | SND_ASYNC | (bLoop ? SND_LOOP : 0);
        if (PlaySound(MAKEINTRESOURCE(nResID), AfxGetInstanceHandle(), flags)) {
            m_playing = true;
            return true;
        }
        return false;
    }

    void Stop() {
        if (m_playing) {
            PlaySound(NULL, NULL, 0);
            m_playing = false;
        }
    }
};

項目配置檢查清單

  1. 頭文件:#include
  2. 庫鏈接:#pragma comment(lib, "winmm.lib") 或項目設置 → 鏈接器 → 輸入 → 附加依賴項添加 winmm.lib。
  3. 文件路徑:相對路徑基於工作目錄 (調試時通常為項目目錄),建議用絕對路徑或資源嵌入。
  4. 格式:必須為標準 PCM WAV 格式 (MP3 不支持,需 MCI/DirectShow/Media Foundation)。

避坑指南

  • ❌ 忘記 winmm.lib → 鏈接錯誤 unresolved external symbol _PlaySound。
  • ❌ 使用 MP3 文件 → 靜默失敗/播放噪音。轉換為 WAV。
  • ❌ 大文件用 SND_MEMORY → 內存壓力大。改用 SND_FILENAME 或 SND_RESOURCE。
  • ❌ 循環播放未提供停止機制 → 程序退出後聲音仍在播放。析構函數/退出處調用 PlaySound(NULL,0,0)。
  • ❌ 相對路徑部署後失效 → 用 GetModuleFileName 定位 EXE 目錄拼接路徑,或嵌入資源。

總結

VC 播放聲音首選 PlaySound + winmm.lib。關鍵掌握:SND_ASYNC 異步不阻塞 UI、SND_LOOP 循環背景音樂、SND_MEMORY/RESOURCE/FILENAME 三種來源、PlaySound(NULL,0,0) 停止。嵌入資源 (WAVE 類型) 實現零文件部署。複雜音頻控制 (音量、混音、MP3、3D) 需升級至 MCI/DirectSound/XAudio2/Media Foundation。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved