c-操作系统X/Linux音频播放与一个基于事件的接口



我正在为Linux/OSX开发一个流媒体音频播放器,它有一个奇怪的用例,让我确信现有的东西都不会起作用。对于第一部分,我只想接收MP3数据并播放它。我目前使用libmad进行解码,使用libao进行播放。我的问题在于力宝,我不相信这是我的最佳选择。

特别地,ao_play函数是阻塞的。直到传递给它的整个缓冲区都已播放完毕,它才会返回。这没有给足够的时间在调用ao_play之间解码块,因此解码必须完全提前或同时进行。由于这是为了流媒体,我拒绝提前解码。(可以想象,我可以发送一个多小时的音频数据——我不想使用那么多内存。)这就留下了并发性。但是,尽管pthreads在Linux和OSX中是标准的,但周围的许多库却不是。我真的不相信我想去并发,所以我正在重新考虑我对力宝的选择。

对于我的应用程序,我能想到的音频播放的最佳模式是获得一个文件描述符,我可以选择它来在它准备写入时得到通知,然后向其发出非阻塞写入。(这是由于用例的其余细节,这意味着我真的想要一个选择循环。)

有没有一个在Linux和OSX上都能工作的库可以这样工作?

尽管它非常令人讨厌,但PulseAudio基本上与您描述的一样工作(使用异步API,而不是简单的API)。

除非你想做的是低延迟或高级声音工作,在这种情况下,你可能想看看JACK音频连接套件。

PortAudio就是您的选择。它有一个简单的回调驱动的API。它是跨平台和低延迟的。如果你不需要任何花哨的功能(3D、音频图…),这是最好的解决方案。

相关内容

最新更新