playsound 是 windows 上 c++ 播放 wav 文件最简单快捷的方式,适合提示音等短音频,但限制较多。

Windows 上用 PlaySound 播放 WAV 文件最简单但限制多
直接调用 PlaySound 是 C++ 里最快能出声的方式,适合播提示音、短 WAV(
- 必须传入完整路径或资源 ID,相对路径容易失败——建议用
GetModuleFileName拼绝对路径 - 第三个参数写
SND_FILENAME | SND_ASYNC才不卡主线程;只写SND_FILENAME会同步阻塞,播完才继续执行 - 如果返回 FALSE,立刻查
GetLastError():常见是MMSYSERR_BADDEVICEID(没默认音频设备)或MMSYSERR_NODRIVER(系统没加载波形音频驱动) - 不能控制音量、声道、采样率;WAV 若含非 PCM 格式(如 ADPCM),会静音且不报错
跨平台选 miniaudio 而不是 PortAudio 或 SDL2
miniaudio 是纯 C 的单头文件库,编译零依赖,C++ 项目里加一个 #include "miniaudio.h" 就能用。比 PortAudio 编译链简单,比 SDL2 更轻量(不用拉整个多媒体框架)。
- 初始化只需两步:
ma_device_config配置通道数/采样率,ma_device_init启动设备 - 回调函数里填 PCM 数据——注意格式必须匹配:比如设了
ma_format_f32,就别传int16_t数据,否则爆音 - Windows 默认用 WASAPI,macOS 用 Core Audio,Linux 用 ALSA/PulseAudio,自动降级,不用手动切后端
- 别在回调里做文件 IO 或 malloc——卡顿或崩溃;数据得提前准备好,回调只负责 memcpy
读 MP3 并解码成 PCM 必须用 dr_mp3 + miniaudio 组合
C++ 标准库不处理音频编码,MP3/WAV/FLAC 都得靠解码库。用 dr_mp3(单头文件、无 malloc、只解码不封装)配 miniaudio 是目前最稳的轻量组合。
-
drmp3_init_file失败大概率是文件路径错或 MP3 损坏;用drmp3_init_memory可先读文件到内存再解码,方便调试 - 解码时指定
DRMP3_PCM_FORMAT_F32,和miniaudio的ma_format_f32对齐,避免重采样开销 - MP3 帧头损坏会导致
drmp3_read_pcm_frames_f32返回 0——需检查返回值,不能假设每次都能读满缓冲区 - 别试图边解码边播放:先解完全部 PCM 到内存,再喂给音频设备;实时流式播放要自己管理环形缓冲区
Linux 下权限和 PulseAudio 状态比代码更常导致无声
代码跑通但没声音?90% 是环境问题。C++ 音频程序在 Linux 不像 Windows 那样有默认设备兜底。
立即学习“C++免费学习笔记(深入)”;
- 运行前先终端敲
pactl list short sinks:没输出说明 PulseAudio 没起来,systemd --user 服务可能被禁用 - 普通用户不能直写
/dev/snd/*,硬要用 ALSA 需加audio用户组并重新登录 - 用
miniaudio时设ma_device_config的deviceType为ma_device_type_playback,别误设成ma_device_type_duplex(需要录音权限) - Wayland 下某些 compositor 会拦截音频请求,换 X11 环境测试能快速定位是不是显示服务器的问题










