轻松播放 24 位 .wav 音频文件

Posted

技术标签:

【中文标题】轻松播放 24 位 .wav 音频文件【英文标题】:Easily play 24 bits .wav audio files 【发布时间】:2014-05-23 14:18:54 【问题描述】:

众所周知,Windows API PlaySound() 不允许播放 24 位 .wav 文件。

在 Windows 平台上以 C/C++ 播放 24 位 .wav 文件的最短方法是什么?

(如果可能,不需要第三方库)

【问题讨论】:

我会建议mciSendString,但这篇帖子***.com/questions/6032795/… 似乎表明这也可能存在问题。您是否看过使用 DirectShow:***.com/a/8121768/2718186? 感谢@MicroVirus。您能否提供一个小代码示例,以便我可以尝试使用 mciSendString ? (我用的是 Win7,所以我不介意它不能在 WinXP 上工作)。 【参考方案1】:

你也许可以使用mciSendString,但我不确定它是否可以播放 24 位 WAV 文件,是否可以播放平台要求。

MCI 使用 mciSendString 发送的简单字符串命令。打开一个文件并播放它(为简洁起见省略了错误检查):

mciSendString("open \"C:\\My Folder\\Sample.wav\" type waveaudio alias sampleSound", NULL, 0, NULL);
mciSendString("play sampleSound from 0", NULL, 0, NULL);

请注意,alias sampleSound 是您为打开的资源指定的自定义名称,因此您可以稍后参考。您可以使用字符串"close sampleSound" 关闭资源,还有更​​多的命令和选项可以控制播放。

如果这不起作用,那么最好的办法是使用 DirectShow,它可以利用系统上安装的所有 DirectShow 过滤器进行播放。这个 SO answer Use Windows built in MP3 decoder to play audio? 给出了示例代码。

【讨论】:

【参考方案2】:

仅供参考,我还将 MicroVirus 的答案改写成 Python 代码:

import ctypes

ctypes.windll.WINMM.mciSendStringW(u"open BASS.wav type waveaudio alias sample1", None, 0, None)
ctypes.windll.WINMM.mciSendStringW(u"play sample1 from 0",  None, 0, None)

raw_input()

适用于 24 位 .wav 文件!

【讨论】:

以上是关于轻松播放 24 位 .wav 音频文件的主要内容,如果未能解决你的问题,请参考以下文章

在 LInux 上播放 PCM 音频(wav)[关闭]

在 C++ 中使用 libsndfile 从 WAV 文件中提取原始音频数据

naudio 32bit ieee 浮动到 24bit

多浏览器播放wav格式的音频文件

.wav 音频文件无法播放 - Javascript

用 Qt 的 QAudioOutput 类播放 WAV 音频文件