如何在 Linux 上用 C++ 播放 .wav 文件?

Posted

技术标签:

【中文标题】如何在 Linux 上用 C++ 播放 .wav 文件?【英文标题】:How do I play .wav files in C++ on Linux? 【发布时间】:2016-06-24 04:26:22 【问题描述】:

我有一个关于在 C++ 中播放 .wav 文件的问题。我正在寻找一种在 Linux 和 Windows 上播放它的方法,我想在一个功能结束时分解它,你知道这个示例吗?

感谢您的任何回答:)!

我来自德国,请不要对我的语法或拼写生气:D。

【问题讨论】:

使用网络搜索查找内容。或者,从现有程序的源代码中获取灵感。 【参考方案1】:

有几种方法可以做到这一点。

最简单、最丑陋和最骇人听闻的方法是直接写入位于/dev/snd/ 的声音设备。但是,这实际上取决于您的 linux 发行版,而一些现代发行版不再允许您这样做。一般来说,对/dev/ 设备的直接读/写正在逐渐消失。 Here is a question answering this.

很长一段时间以来,“官方”的方式是使用使用 C 风格接口的 alsa 库。这通常非常棘手,充满陷阱和“变通方法”,具体取决于您的确切音频硬件。

我认为 alsa 正在逐渐被jack 取代,我希望它更易于使用。我没有这方面的经验。

我知道的最后一种方法是使用portaudio,顾名思义,它至少可以在windows、linux和osx之间移植。

所有这些库都可以让您控制您的音频硬件、初始化/设置/播放。 wav 文件的简单之处在于内容是原始 pcm,这通常是那些库使用的格式。 wav 格式通常是这样的:

[wav header] [audio data until the end of the file]

如果您可以在开始播放时管理几毫秒的垃圾,那么您也可以“安全地”发送标题以进行播放并避免对其进行解析。但是,您必须了解 PCM 格式,并且应该带来一些额外的阅读材料。

作为一个不直接涉及 C++ 的附加“技巧”,我强烈建议使用 Audacity。这是一个小程序,我看到它就像音频文件的记事本/vim。它体积小,加载速度快,允许您复制/粘贴音频片段并检测 pcm 格式。 (实际上,您只需更改 pcm 设置,直到音频“听起来”正确,但仍然有用)

【讨论】:

【参考方案2】:

标题提到了 Linux,但你在帖子中提到了 Windows 和 Linux。

对于 Linux,如果您坚持使用 C++,最好使用 gstreamer。查看 gst-launch 的 gstreamer 代码。它在 Linux 机器上运行如下。

$ gst-launch filesrc location="文件位置" !波形解析!阿尔萨斯克

发件人,http://sanchayanmaity.github.io/beagleboard-xm/linux/programming/software/2014/08/07/playing-wavmp3-file-using-gstreamer-in-code.html

对于 Windows,或者如果您想在 Windows 和 Linux 上使用与操作系统无关的代码,您可以使用 SDL,

http://lazyfoo.net/SDL_tutorials/lesson11/

另一种选择(跨平台、面向对象)是 SFML。查看音频 wav 文件播放示例,

http://www.sfml-dev.org/tutorials/2.0/audio-sounds.php

【讨论】:

以上是关于如何在 Linux 上用 C++ 播放 .wav 文件?的主要内容,如果未能解决你的问题,请参考以下文章

用于播放/录制音频(.wav、.ogg)的 C++ 多平台库

如何使用 PlaySound() 或任何基本函数/方法在 C++ 中同时播放 1 个以上的 .wav 声音?

同时使用 DirectShow 播放多个 wav 文件并记录它们 C++

C++ 中的 Playsound:.wav 文件的文件错误

用c或c++播放wav文件,怎么实现

将 .wav 加载到内存中,然后在 C++ 中播放