【问题标题】:OS X/Linux audio playback with an event-based interface?带有基于事件的界面的 OS X/Linux 音频播放?
【发布时间】:2012-04-02 19:41:52
【问题描述】:

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

特别是,ao_play 函数是阻塞的。在传递给它的整个缓冲区播放完之前,它不会返回。这没有足够的时间在对 ao_play 的调用之间解码块,因此必须完全提前或同时进行解码。由于这是为了流式传输,我拒绝提前解码。 (可以想象,我可以发送超过一个小时的音频数据——我不想使用那么多内存。)这就留下了并发性。但是,虽然 pthreads 在 Linux 和 OS X 中是标准的,但周围的许多库都不是。我不太确定我想去并发 - 所以我正在重新考虑我对 libao 的选择。

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

是否有一个在 Linux 和 OS X 上都能以这种方式工作的库?

【问题讨论】:

    标签: c linux macos audio


    【解决方案1】:

    虽然很讨厌,PulseAudio 基本上就像你描述的那样工作(使用异步 API,而不是简单的 API)。

    除非你想做低延迟或高级声音工作,在这种情况下你可能想看看JACK Audio Connection Kit

    【讨论】:

    • 令人讨厌的理由很充分。特别是当 OS X 是我的目标平台之一时。但是这个答案是信息丰富的,如果没有任何我更乐意看到的信息,我会接受它。 :)
    • @Carl:同意...如果您愿意放弃文件描述符模型并转而使用回调,请查看 libsdl - SDL_OpenAudio 采用回调函数,该函数称为每次声音设备需要您填充其缓冲区时。还要考虑 GStreamer... 看看 SMPEG 对 SDL 所做的事情,它可能与您想要实现的目标相似。
    【解决方案2】:

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

    【讨论】:

    • 这可能是我想要的,但这并不是我真正想要的。它需要一些轮询来做我想做的事,但这不会很糟糕。
    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    相关资源
    最近更新 更多