Linux ALSA音频框架分析二:linux音频子系统介绍

来源:互联网 发布:3d扫描仪 知乎 编辑:程序博客网 时间:2024/05/17 06:36

linux音频子系统介绍

   Linux音频系统比较复杂,各层间有很多交叉,可能是最无序的子系统,并且它有两套音频驱动框架: OSS (Open Sound System)ALSA (Advanced Linux Sound Architechture),所以底层驱动有OSSALSA两套API。ALSA经过多年的发展,基本统一了Linux声卡硬件驱动层的借口,OSS日渐退出,但是在ALSA之上的各个应用层,方案和软件繁多复杂,ESD,PulseAudio, JACK,GStreamer, 这些系统组件各个为战,实现了不同的功能。

        下图简要的描述了Linux音频系统各部分调用关系:


下面简要介绍各部分。

1、ALSA和OSS

  ALSA 是 Advanced Linux Sound Architecture 的缩写,即高级 Linux声音架构,在 Linux 操作系统上提供了对音频和 MIDI(Musical InstrumentDigital Interface,音乐设备数字化接口)的支持。在 Linux2.6 版本内核以后,ALSA 已经成为默认的声音子系统,用来替换 2.4 版本内核中的OSS(Open Sound System,开放声音系统)。

   ALSA 是一个完全开放源码的音频驱动程序集,是由志愿者维护的开源项目,而 OSS 则是由公司提供的商业产品。ALSA 系统包括驱动包alsa-driver(集成在内核源码),开发包 alsa-libs,开发包插件 alsalibplugins,设置管理工具包 alsa-utils,其他声音相关处理小程序包alsa-tools,特殊音频固件支持包 alsa-firmware,OSS 接口兼容模拟层工具 alsa-oss 共 7 个子项目,其中只有 alsa-driver 是必须的。 

2、FFADO

   很多专业音乐设备都是通过“火线”连接到pc的。FFADO项目旨在通过提供一个通用的火线上,支持基于Linux平台的开源音频设备解决方案。FFADO项目是的FreeBOB项目的继任者。FFADO在志愿者为基础的社区的努力下,试图提供Linux至少是存在于其他操作系统功能相同的水平,并且希望支持的火线音频设备的范围非常广泛:从混合音频控制设备到DSP算法设备的纯音频接口。然而,能够支持的是设备供应商的合作。优先考虑提供信息和测试设备的制造商。

   FFADO另一个特性是整合了dsp芯片的混音驱动,你可以通过图形界面设置输入输出,以及音效等。不同于alsa的软混音,你可以真正的对硬件进 行控制,做到真正的0延时,这对现场录音等需求大大有助。和alsa等其他架构不同,jack仅仅对其支持的硬件进行处理,没有对alsa或者pulse提供接口,除非你用alsa替代jack,否则你无 法使用jack正常的进行音频播放。但是很多专业设备对jack支持良好,所以jack是你的最优选择。

3、PulseAudio

   PulseAudio是内置POSIX的操作系统是一个完善的机制,它是声音的应用程序代理。它允许应用程序和硬件之间传递声音数据上的高级操作。诸如将音频传输到不同的机器、改变采样格式或通道计数以及将多个声音混合成一个,这些都很容易使用声音服务器实现。内置专为Linux系统。它也被移植到Solaris、FreeBSD,NetBSD,MacOS X的测试,Windows 2000和Windows XP。内置是所有有关linux系统的一个组成部分,用于由多个供应商的各种移动设备。

4、GStreamer

   GStreamer是一个开源的多媒体框架库。利用它,可以构建一系列的媒体处理模块,包括从简单的ogg播放功能到复杂的音频(混音)和视频(非线性编辑)的处理。应用程序可以透明的利用解码和过滤技术。开发者可以使用简洁通用的接口来编写一个简单的插件来添加新的解码器或滤镜。
5、JACK
   Jack(JACK Audio Connection Kit 的递归缩写)是一个专业级的声音服务(守护进程),它为声音和MIDI数据提供实时的、低延时的连接,有关的程序使用JACK的API。
   JACK能使用ALSA、PortAudio、CoreAudio、FFADO和OSS作为硬件层的后端。此外, 还有一个虚拟的驱动(当不需要声音输出时是很有用的,例如离线渲染)和一个通过UDP协议的音频驱动(Audio-over-UDP driver)。它可以运行在Linux、Mac OS X、Solaris、Windows、FreeBSD、OpenBSD和NetBSD上。JACK的API被标准化,并且存在两种可融合的实现:jack1,由简单的C实现并且已经维护了一段时间;至于jack2(原来的jackdmp),由Stéphane Letz领导的用C++重写的实现,jack2在积极开发中,目标是支持多处理器和对其它非Linux操作系统。
6、Xine
   如果说linux音频发展像地球史,那xine就处在白垩纪。它就像个遗老,你仍能从很多播放器中发现它的身影,所以很多linux发行版仍然捆绑 着xine。
   xine创立之初,设计分为前端和后端,前端用于和用户交互,后端处理多媒体。得益于封装的解码库,它可以播放包括AVI、Matroska和 Ogg以及它们 包含的数十种格式,例如AAC、Flack、MP3、Vorbis和WMA。
   因为它依赖于库实现,所以xine被开发成一个多媒体框架,库的开发,使得xine在法律允许范围内对多媒体文件提供最好的支持。xine可以和 alsa,pulse通信,很多程序也可以调用xine,例如totme-xine。同时xine也是kde的Phonon默认后端,所以不论是 Amarok 还是 Kaffeine,都能看到他的踪迹。
7、Phonon
   Phonon是KDE 4的多媒体API 。Phonon提供一个稳定的API允许KDE 4独立于任何一个声音系统服务器如xine。Phonon让各种后端提供界面给开发者所谓的"引擎";每个引擎运作在一个具体的后端。每个后端都可让Phonon控制基本功能,如播放、暂停和搜寻。Phonon也支持更高层次的功能,如让音轨转化之间变微弱。 使用Solid,Phonon将给予用户更多配件的控制能力如耳机、扬声器、麦克风。一个例子是,因为你可能只有一个VoIP会话使用您的耳机,但所有其他的声音通过扬声器出来。支援 Unix-like 系统下的后端xine、VLC、MPlayer。支援 Windows 下的后端 DirectShow、VLC和MPlayer.支持 Mac OS X下的后端QuickTime。QT4.4和之后版本使用了Phonon,作为跨平台的音频/视频播放。

8、其他
  其他有一些很多小众的音频技术,例如ESD、SDL和 PortAudio。

ESD是声音启发守护进程(Enlightenment Sound Daemon),它在曾经很长的一段时间里曾是Gnome桌面的默认声音服务。后来,Gnome开始使用libcanberra(它本身可以和ALSA、 GStreamer、OSS和PulseAudio通信),ESD在2009年4月被彻底放弃支持。在kde上esd也是杯具。因为大部分人都是使用 kde4,所以phonon替代了esd。

SDL依然欣欣向荣的发展着。因为已经是用他开发了上百款跨平台游戏, 所以SDL库的音频输出组件依然支持良好,具有大量新的特性,并且成熟而稳定。

PortAudio也是一个跨平台音频库,它把 SGI、Unix和Beos加入到可能的终端混音器中。使用PortAudio的最知名的应用程序就是Audacity音频编辑器了,因为使用了 portaudio,使得它音频输出遇到了问题,jack支持也遇到了bug。

声明:本文部分内容引用了博文《Linux 音频系统简析》,网址:http://blog.csdn.net/meizum10/article/details/17437959 。






原创粉丝点击