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

5

我有一个关于在C++中播放.wav文件的问题。我正在寻找一种可以在Linux和Windows上播放它的方法,并且我希望在函数结束时中断它,你知道一个示例吗?

谢谢任何回答 :)!

我来自德国,请不要介意我的语法或拼写:D。


使用网络搜索来查找某些东西。或者,从现有程序的源代码中获得灵感。 - Ulrich Eckhardt
2个回答

3
有几种方法可以实现这个。
最简单、最丑陋和最不专业的方法是直接写入到位于/dev/snd/的声音设备中。然而,这真的取决于您使用的Linux发行版,一些现代发行版不再允许您这样做。总的来说,直接读/写/dev/设备正在逐渐消失。关于这个问题,这里有一个回答
很长一段时间以来,“官方”的方法是使用alsa库,它使用C风格的接口。它通常非常棘手,充满了陷阱和“解决办法”,这取决于您的确切音频硬件。
我认为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设置,直到音频“听起来”正确,但仍然有用)

1

标题提到了Linux,但是在文章中提到了Windows和Linux。

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

    $ gst-launch filesrc location="文件位置" ! wavparse ! alsasink

来自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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接