由于历史的原因,在 Linux 环境下有多种API系统可用于声音编程。但没有合适的指引就难以找到合乎自己需要的体系。这里是一个指引,是由Lennart Poettering <mzoybt (at) 0pointer (dot) net>所写(参见:Homepage of Lennart ), 目的就是带你走出这个密林。
最简单的指引莫过于问自己:"我想(用 Linux Sound API)做些什么?"。下面就是答案: 我想写一个类似于媒体播放器的软件!
那就用 GStreamer。除非你只想基于KDE来编程,那么,你可以选择使用Phonon。
我想在自己的应用程序中加入事件声音!
使用 libcanberra,并根据XDG Sound Theming/Naming 规范安装声音文件。如果你只基于KDE,则可以使用KNotify,但它的着重点有所不同。
我想做专业的音频编程,包括硬盘录音、音乐合成、MIDI界面等!
使用 JACK 或者完整的ALSA 界面。
我想基础的PCM音频播放和捕捉!
使用 safe ALSA 子集。
我想在游戏中加入声音!
如果是全屏幕的大型游戏,使用SDL的声音API。如果是简单的游戏,只用到基础的用户界面例如Gtk+的,使用 libcanberra
我想写一个混音器/音量控制软件!
这要根据你想在哪一个层次提供直接的支持:如果你想支持增强的桌面软件混音器,使用 PulseAudio 音量控制 API。如果你想支持硬件混音器,使用ALSA混音器API。
我想写一个支持plumbing layer的软件!
使用 完整的 ALSA体系。
我想写一个嵌入式的音频软件!
从技术使用性角度而言safe ALSA子集是一个好的选择,但基于你实际的情况也可以使用其它API。
你想了解更多关于这些API的不同之处吗?
GStreamer 是一个Linux桌面媒体流系统的事实标准。它支持音视频流的编解码。可以基于该API实现从简单的音频文件播放到网络流媒体配置等大范围的应用。 GStreamer支持多种编解码器和音频后端。GStreamer显然不适用于基本的PCM音频播放或者低延时/实时应用场合。GStreamer是可 移植的,并不限于仅能在Linux上使用。它支持的音频后端包括ALSA、OSS、PulseAudio等。 [API Reference]
libcanberra 是一个抽象的事件声音API。它是XDG 声音主题和命名规范 的实现。虽然libcanberra是GNOME的一部分, ,因此可以用于其它桌 面环境。它除了提供简单的界面用于播放声音文件之外,还提供了缓冲机制(适用于基于网络的瘦客户机)和允许传递多种元数据到底层的声音系统进行控制从而增 强用户体验(比如定位事件声音)和改善易操作性。libcanberra支持多种后端,并且是可移植的。目前支持的后端包括ALSA、OSS、 PulseAudio、GStreamer等。 [API Reference]
JACK 是一个用于连接专业音频应用程序和硬件输入输出的声音系统。该系统专注于低延时和应用程序之间的互联接,因此,该系统对于普通的桌面应用或者嵌入式应用都 不适合。如果你想做的只是简单的PCM音频播放,这个系统也不是很有用。JACK支持多种后端,其中支持得最好的是ALSA。JACK也是可移植的。 [API Reference]
ALSA 是专门面向PCM音频播放和录音的Linux API。ALSA专注于硬件设备,但也支持其他一些后端。ALSA这个名字既表示了Linux内核的音频驱动程序,也表示了围绕着驱动程序而建立的用户空 间函数库。ALSA 函数库是全面且可移植的。完整的ALSA API可以是非常复杂和巨大的,但它能几乎能支持所有的音频设备。不过ALSA API的某些功能实际取决于Linux核心和对应的Linux驱动程序对硬件的支持。比如基于软件的声音服务器或者在用户空间实现的音频驱动程序(蓝牙和 火线音频支持)。
[API Reference]
在全部的ALSA API中,只有一个子集是可以在所有ALSA支持的后端上工作的。因此,如果编写使用了ALSA的软件,并且需要软件是可移植、向后兼容和与各种音频服务 器、蓝牙音频和火线音频都兼容的话,你应该只使用这个被称为Safe ALSA的安全API子集。该子集是基础的、可移植的PCM音频播放和录音功能的实现,而且除了支持ALSA核心本身所支持的设备之外,还支持OSS、 PulseAudio、JACK等。
Phonon 是高层次的媒体流系统的抽象实现,比如GStreamer便是一种。但Phonon比GStreamer更深入。KNotify是一个用于"提示"的系 统,支持的不仅仅是事件声音。但目前还不支持 XDG Sound Theming/Naming Specifications。而且并不支持缓冲或传递事件元数据到更下层的音频系统。KNotify支持多种音频后端来通过Phonon进行播放。这两 者的API都是仅面向KDE/Qt体系的,所以不能在该体系之外的应用程序中使用。 [Phonon API Reference ] [KNotify API Reference ]
SDL 是一种跨平台、可移植的API,主要用于全屏幕的游戏开发。SDL包括很多东西,其中的一部分是一个可移植的音频界面。SDL也支持OSS、 PulseAudio和ALSA作为后端。
[API Reference ]