Update: 这个问题只在部分声卡上会出现。以下的解决方案都是为了解决爆音这个“问题”,如果你没有遇到这个问题,也就自然不必解决,或者说,采取了这些措施后也不能提高音质。

很早就发现Ubuntu下的音量调节范围比Windows要大得多,刚开始还以为是Linux的音频驱动更NB而窃喜,然而后来发现这并非是什么好事——音量条左端10%和右端20%几乎是废的,前者声音小得根本听不见,而后者则大得出现了爆音。有意义的音量条长度变短直接导致了音量调节非常困难,而且,就算是中间音量也经常出现爆音。

作为一个GEEK,遇到问题怎么能这样被难倒?必须得认真研究解决之!

本文中提到的Ubuntu均指10.04及以后版本。UPDATE:该方法在较新的主流发行版中均可用。

0.预备知识

在使用Linux下各种音视频播放软件时,常常可以看到audio/video output device(音频/视频输出设备)选项,我们今天就先来看看音频输出——常见的有alsa、esd、oss、pulseaudio等等,让人眼花缭乱。他们之间到底有什么关系呢?Ubuntu中文论坛上的这篇教学贴很好地解答了这个问题。简而言之,alsa和oss都是类似“音频驱动”的底层内核模块,负责最终控制硬件发出声音;而pulseaudio和esd则是类似“图形服务器”X11一样的“声音服务器”,负责将软件发送的指令经过处理(主要是混音)后发送给驱动。完整的LINUX音频架构应该由两者共同组成。另外,alsa和pulseaudio分别都比oss和esd先进,正在逐渐取代后两者,目前Ubuntu等流行发行版下采用的默认组合就是alsa + pulseaudio(不过,他们四者还是可以共存的)。

前面提到了“混音”,那么,什么是混音呢?简单来说,我们经常能听到多个软件同时发出声音,而发给声卡的音频流只能有一个,解决方法就是将所有声音“混合”起来。如果没有混音器(mixer),那么就会出现“声卡独占”的情况,这在早年的LINUX下经常见到。这也就是pulseaudio这些声音服务器存在的目的了。同时,有了声音服务器的存在,你可以分别控制各个软件的音量(并非指在软件内部调节音量,试试看在Ubuntu中打开“声音首选项”的“应用程序”选项卡就知道了)。

那么,为什么播放器能直接输出给alsa呢?这是因为早年没有比较好的声音服务器,所以alsa自己也实现了一个很简陋的混音器(dmix)。

1.问题的出现

那么,爆音是怎么出现的呢?最常见的原因就是——增益过大,即“音量”放大太大,让声音失真。

那么,就打开Ubuntu的“声音首选项”,看看音量调节,回忆一下与Windows下的有何不同。对,只有一个音量条!正常情况下,应该能够分别调节主音量、扬声器、耳机、波形等等的音量,而Ubuntu下只看到了一个调节条,即“主音量”。因为此处是通过pulseaudio来调节音量,而pulseaudio貌似只提供给用户调节主音量的接口,至于具体怎么处理分配、调节其他音量,是由pulseaudio内部来处理的。

如何才能调节其他音量呢?对了,直接操作底层的alsa。在控制台打开alsamixer(注意,这不是上文提到的混音器,而是音量调节器),你就会看到熟悉的Windows音量调节的LINUX控制台版。让我们试试看把波形(即PCM)调小一些(调至红色区以下,比如75左右)。再听听看,是不是爆音消失了呢?其实,在Windows下,“波形”的最高音量其实只是81,Windows已经考虑到防止爆音这一点了,因而调节范围也比LINUX下小。

大功告成了?且慢,让我们用Ubuntu的音量调节器来调整一下音量,再进入alsamixer看一看——PCM又被调到了最高!pulseaudio在调节音量时蛮横地仅调节主音量,而直接将其他都调到了最高。怎么办?难道我们得抛弃方便的音量小工具,都靠alsamixer来过活了?

2.问题的解决

办法自然是有的,既然问题是由于pulseaudio的“暴力蛮横”的,那就让我们来试试看更改pulseaudio设置。

进入/usr/share/pulseaudio/alsa-mixer/paths/,ls一下,你会看到很多配置文件。再看一下“声音首选项”中的“输出”,最下方有一个“连接器”,里面的选项与这些文件十分相似。让我们来看看很多output文件都最终引用的“analog-output.conf.common”文件。在其中看到了PCM,其中有一个volume,默认是merge,根据上面的注释,可以知道这是让pulseaudio“智能”地根据主音量来调整PCM音量。试着将其改成ignore,保存退出,重新载入pulseaudio。试试看现在调节音量还会覆盖PCM音量么?

* SIMPLE HOWTO

快速HOWTO – 在终端中:

1
2
3
4
5
6
7
8
9
10
11
sudo gedit /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common

#在第98行,即[Element PCM]章节的volume选项,改为 volume = ignore,保存退出

sudo pkill pulseaudio

start-pulseaudio-x11

alsamixer

#按左右键移动至PCM条,按上下键调节至74,ESC推出