声音 -- MPlayer -- Linux下的电影播放器

### 2.3.2 音频输出设备

#### 2.3.2.1 音频/视频同步

MPlayer的音频接口称为libao2。它目前包含这些驱动：

oss
  OSS(ioctl)驱动(支持硬件AC3输出)
sdl
  SDL驱动(支持ESD，ARTS之类的音频守护进程)
nas
  NAS(Network Audio System)驱动
alsa5
  本地的ALSA 0.5驱动
alsa9
  本地的ALSA 0.9驱动(支持硬件AC3输出)
sun
  BSD和Solaris8用户的SUN音频驱动(`/dev/audio`)
arts
  本地的ARTS驱动(主要针对KDE用户)
esd
  本地的ESD驱动(主要针对GNOME用户)

Linux下的声卡驱动有兼容问题。这是因为MPlayer使用一个正确编码的声卡驱动内建的特性来实现音频/视频同步。遗憾的是有些驱动的作者 不在乎这个功能，它在播放MP3和实现声音效果时并不需要。

别的媒体播放器比如aviplay或者xine可能在这些驱动上工作没有问题因为他们使用内部计时器的“简单”方法。 测试表明他们的方法没有MPlayer的方法有效率。

使用一个正确编制的音频驱动的时候MPlayer将永远不会产生音频相关的A/V不同步，除非你的文件制作的相当糟糕。(man page里面有解决的办法)。

如果你碰巧遇到一个不好的音频驱动，尝试使用`-autosync`选项，它应该可以解决你的问题。详细的信息参见man page。

一些提示：

- 如果你有OSS驱动，先尝试`-ao oss`(这是默认的)。如果你遇到毛刺，停止或者任何不正常的事情， 尝试`-ao sdl`(注意：你需要安装SDL库和头文件)。许多情况下SDL的音频驱动都会有帮助，也支持ESD(GNOME)，ARTS(KDE)。
- 如果你使用ALSA 0.5的版本，那么你几乎总是不得不使用`-ao alsa5`，因为ALSA 0.5的OSS仿真很buggy， 会导致MPlayer崩溃并出现这样的信息：
  `DEMUXER: Too many (945 in 8390980 bytes) video packets in the buffer!`
- 在Solaris上，用`-ao sun`选项选择使用SUN的音频驱动，否则视频音频都无法工作。
- 如果从CD-ROM上播放时声音跳跃，打开IRQ unmasking，也就是使用命令`hdparm -u1 /dev/cdrom`(`man hdparm`)。这 一般来说时有益的，进一步的描述在CD-ROM部分。

#### 2.3.2.2 声卡体验，推荐

Linux下的声卡驱动主要是自由版本的OSS。这些驱动在2.5的开发树中已经被ALSA(Advanced Linux Sound Architecture)取代，如果你的发行版中还没有使用ALSA，而你的声卡又有问题你可能应该试试。ALSA的驱动一般来说，在 兼容性，表现和特性方面都比OSS要好，但也有些声卡只有4Front Technologies的商业版本的 OSS驱动才支持，他们也支持一些非Linux系统。

声卡 | 驱动 | 最大kHz | 最大声道数 | 最大打开数[1]
--- | --- | --- | --- | ---
OSS/Free | ALSA | OSS/Pro | 其他
VIA板载芯片(via82cxxx)只能48kHz | via82cxxx_audio | snd-via82xx |  |  | 4-48 kHz或者只能使用48 kHz，取决于芯片 |  |
Aureal Vortex 2 | 没有 | 没有 | OK | Linux Aureal Drivers 缓冲大小增加到32k | 48 | 4.1 | 5+
SB Live! | 模拟方式OK，SP与DIF不能工作 | 都OK | 都OK | Creative的OSS驱动(支持SP/DIF) | 192 | 4.0/5.1 | 32
SB 128 PCI(es1371) | OK | ? |  |  | 48 | 立体声 | 2
SB AWE 64 | 最大44kHz | 48kHz听起来很糟 |  |  | 48 |  |
GUS PnP | 没有 | OK | OK |  | 48 |  |
Gravis UltraSound ACE | 不OK | OK |  |  | 44 |  |
Gravis UltraSound MAX | OK | OK (?) |  |  | 48 |  |
ESS 688 | OK | OK(?) |  |  | 48 |  |
C-Media声卡(哪一种？) | 不OK(有咝咝声)(?) | OK |  |  | ? |  |
Yamaha声卡(*ymf*) | 不OK(?)(可能应该用`-ao sdl`) | 只有使用ALSA 0.5的OSS模拟并使用`-ao sdl`(!)(?)时OK |  |  | ? |  |
使用envy24芯片的声卡(比如Terratec EWS88MT) | ? | ? | OK |  | ? |  |
PC扬声器或者DAC | OK | none |  | Linux PC扬声器的OSS驱动 | 驱动可以模拟到44.1，可能更高。 | 单声道 | 1

[1]：可以同时使用这个设备的程序个数。

对这个文件的反馈是受欢迎的。请告诉我们你的声卡是如何与MPlayer共同工作的。

#### 2.3.2.3 Audio filters

老的音频插件被新的音频滤镜层取代了。音频滤镜用来在声音到达声卡之前改变声音数据的属性。激活和关闭滤镜通常是自动的但也可以强制。 当音频数据的属性与声卡要求的不同时就会激活滤镜，不需要时就会关闭。`-af filter1,filter2,...`选项用来取代滤镜的默认行为 或者插入不能自动插入的滤镜。滤镜将按照它们在逗号分隔的列表中出现的顺序运行。

例如:
`mplayer -af resample,pan movie.avi`

声音将先通过resample滤镜然后通过pan滤镜。注意列表中不能包含任何空格，否则它将会失败。

滤镜通常有选项用来改变他们的行为。这些选项在下面的章节会详细的解释。当选项被省略是滤镜将执行默认的设置。这里是一个 使用带相应选项的滤镜的例子：

`mplayer -af resample=11025,pan=1:0.5:0.5 -channels 1 -srate 11025 media.avi`

将resample滤镜的输出频率设置为11025Hz并使用pan滤镜把音频混合到一个声道。

这个滤镜层的运行由`-af-adv`选项控制。这个选项有两个子选项：

`force`
  是一个比特域用来控制滤镜如何插入以及它们使用怎样的速度/精确度优化：
  `0`
    使用滤镜的自动插入并根据CPU的速度优化。
  `1`
    使用滤镜的自动插入并为最高速度优化。
    警告：音频插件的有些特性将会失效，声音质量将会下降。
  `2`
    使用自动插入并为质量优化。
  `3`
    不使用自动插入也不进行优化。
    警告：这个设置可能会导致MPlayer崩溃。
  `4`
    按照上面0选项自动插入滤镜，但尽可能的使用浮点处理。
  `5`
    按照上面1选项自动插入滤镜，但尽可能的使用浮点处理。
  `6`
    按照上面2选项自动插入滤镜，但尽可能的使用浮点处理。
  `7`
    按照上面3选项自动插入滤镜，但尽可能的使用浮点处理。
`list`
  是-af选项的别名。

滤镜层同样会影响下面的一般选项：

`-v`
  增加冗余级别使大部分滤镜显示处附加的状态信息。
`-channels`
  这个选项设置你想让你的声卡使用的输出声道数。它同样会影响从媒体解码处的声道数。如果媒体包含的声道数少于要求的声道数 channels插件(见下面)将自动插入。定向将使用channels滤镜的默认定向。
`-srate`
  这个选项选择你想让你的声卡使用的采样率，如果你的声卡的采样率与当前媒体不同，resample插件(见下面)将插入到音频滤镜层中 来补偿这个差别。
`-format`
  这个选项设置声卡和音频滤镜层之间使用的采样格式，如果你的声卡要求的采样格式域当前媒体不同，一个format滤镜(见下面)将自动插入 来进行调整。

#### 2.3.2.3.1 升/降采样率

MPlayer完全支持使用`resample`插件进行声音的升/降采样率。当你使用固定采样率的声卡或者被只兼容 最大44.1kHz的老声卡郁闷时可以使用它。这个滤镜会在需要时自动开启，但它也可以用命令行显式的开启。他有三个选项：

`srate <8000-192000>`
  是一个整数用来设置输出的采样频率，以Hz为单位。有效范围从8kHz到192kHz。如果输入输出的采样频率相同或者这个选项 被省略滤镜降自动卸载。高的采样频率通常会提高声音的质量，特别是跟别的滤镜一起使用的时候。
`sloppy`
  是一个可选的二进制选项使输出频率可以与`srate`给定的频率稍有不同。这个选项用于开始播放的过程非常慢的情况。 它是默认打开的。
`type <0-2>`
  是可选的在`0`到`2`之间的整数用来决定使用那种重新采样的方式。`0`重新采样方式为 代表线性插值算法，`1`代表使用多相filter-bank和整数处理过程，`2`代表使用多相filter-bank和浮点处理 过程。线性插值非常的会，但是声音质量很差特别是在升高采样率时。质量最好的时`2`代表的重新采样方法，但CPU的 消耗最大。

示例:
`mplayer -af resample=44100:0:0`

将resample滤镜的输出频率设定为44100Hz使用精确的输出频率缩放和线性插值算法。

#### 2.3.2.3.2 改变声道数

`channels`滤镜用来添加和去除声道，它也可以用来实现声道的定向与复制。当音频滤镜层的输出与输入层不同 或者当别的滤镜需要它是它将自动开启。当不需要是这个滤镜会自行卸载。选项的数目是可变的：

`nch <1-6>`
  是`1`到`6`间的整数用来设定输出的声道数。这个选项的必须的，不设置会导致运行时错误。
`nr <1-6>`
  是`1`到`6`之间的整数用来指定定向的数量，这个选项是可选的，如果省略将使用默认的定向。
`from1:to1:from2:to2:from3:to3...`
  是`0`到`5`之间的一对数定义每个声道被定向到哪里。

如果只给定`nch`将使用默认的定向，它是这样工作的：如果输出声道的数量大于输入声道的数量就插入空 声道(除了把单声道混合为立体声，此时单声道会输出到两个输出声道)。如果输出声道的数量比输入声道的数量少，多余 的声道将被删去。

示例1:
`mplayer -af channels=4:4:0:1:1:0:2:2:3:3 media.avi`

将输出声道设为4，并设定4个定向，把0声道和1声道互换，2，3声道保持原状。注意如果播放只有两个声道的媒体 2，3声道将没有声音，但0，1声道仍然会互换。

示例2:
`mplayer -af channels=6:4:0:0:0:1:0:2:0:3 media.avi`

将把声道数设为6，并设置4个定向，把0声道复制到0到3声道，4，5声道仍然没有声音。

#### 2.3.2.3.3 采样格式转换

`format`滤镜在不同的采样格式之间转换，当声卡或其他滤镜需要是它会自动开启。

`bps <number>`
  可以是`1`, `2`或者`4`代表样本的字节数。这个选项是必须的，不设置会 导致运行时错误。
`f <format>`
  是描述样本格式的字符串。字符串应该是下面这些东西的组合：`alaw`, `mulaw`或者`imaadpcm`, `float`或者`int`, `unsigned`或者`signed`, `le`或者`be` (低位优先或高位优先)。这个选项是必须的，不设置会导致运行时错误。

示例：
`mplayer -af format=4:float media.avi`

将把输出格式设置为每个样本4字节的浮点数据。

#### 2.3.2.3.4 延迟

`delay`滤镜延迟声音到达扬声器的时间使得不同的声道能同时到达听众的位置。这个功能只当你有两个以上的扬声器 才有用，这个滤镜的选项的数目是可变的：

`d1:d2:d3...`
  代表添加给不同声道的延迟时间的浮点数，以ms为单位。最小延迟是0ms，最大是1000ms。

计算不同声道需要的延迟的方法如下：

1. 测量扬声器到你听的位置的距离，以米为单位，设那些距离为s1到s5(对于5.1系统)。没有补偿副低音的必要(你怎么也听不出 差别的)。
2. 用最大的距离依次减去s1到s5的距离，就是
   s[i] = max(s) - s[i]; i = 1...5
3. 按下面计算需要的延迟时间
   d[i] = 1000*s[i]/342; i = 1...5

示例:
`mplayer -af delay=10.5:10.5:0:0:7:0 media.avi`

将左前和右前声道延迟10.5ms, 两个后声道和副声道不延迟，中间声道延迟7ms。

#### 2.3.2.3.5 软件音量控制

软件音量控制通过`volume`音频滤镜实现，小心使用这个滤镜因为他会降低声音的信噪比。在大多数情况下最好是 把PCM音量开到最大，不使用这个滤镜而是通过混音器的主音量控制来控制你的扬声器的输出级别。如果你的声卡使用数字PCM混音器而不是 模拟的，而你又听到有扭曲现象，就改用主混音器。如果你的电脑连有外部放大器。(这几乎是普遍现象)，可以通过调节主音量和放大器 上的音量旋钮直到背景的咝咝声消失来使噪音级别达到最小。这个滤镜有两个选项：

`v <-200 - +60>`
  在`-200`到`+60`之间的浮点数，代表音量大小，以分贝为单位，默认值是0分贝。
`c`
  二进制控制项用来打开和关闭软修饰。软修饰可以在使用很高音量的时候使声音变得更加平滑。如果扬声器的动态区域很低 可以打开这个选项。但你必须明白这个特性会造成扭曲而且应该使作为最终手段。

示例：
`mplayer -af volume=10.1:0 media.avi`

将音量增加10.1分贝并在音量太高的时候进行硬修饰。

这个滤镜还有另一个特性：它检测总的最大音量并且会在MPlayer退出的时候显示出来。这个音量估计可以用来设定MEncoder 中的音量以利用最大的动态范围。

#### 2.3.2.3.6 均衡器

`equalizer`滤镜描述一个有10个倍频带的图形均衡器，通过使用10个IIR通频带滤镜实现。这表示不管播放什么 样的音频它都会工作。10个带的中央频率分别为：

频带号 | 中央频率
0 | 31.25 Hz
1 | 62.50 Hz
2 | 125.0 Hz
3 | 250.0 Hz
4 | 500.0 Hz
5 | 1.000 kHz
6 | 2.000 kHz
7 | 4.000 kHz
8 | 8.000 kHz
9 | 16.00 kHz

如果播放的样本的频率比一个频带的中心频率低，那个带就被禁用。这个滤镜的一个已知的bug是当样本频率接近 最高频带的中心频率的时候，最高频带的特性不是对称的。这个问题可以通过使用resample滤镜在声音到达本滤镜之前 升高样本频率来解决。

这个滤镜有10个选项：

`g1:g2:g3...g10`
  是`-12` and `+12`之间的浮点数表示每个频带音量的改变，以分贝为单位。

Example:
`mplayer -af equalizer=11:11:10:5:0:-12:0:5:12:12 media.avi`

将升高高频和低频区域的声音而几乎完全消去1kHz附近的声音。

#### 2.3.2.3.7 摇动滤镜

使用`pan`滤镜可以把声道任意混合。它基本上是volunme滤镜和channels滤镜的组合。这个滤镜主要有 两个用途：

1. 把许多声道混合到较少的声道，比如把立体声变为单声道。
2. 在一个环绕音效系统中改变中央扬声器的“宽度”。

这个滤镜很难使用，而且在获得想要的效果之前需要动些脑筋。这个滤镜的选项数取决于输出的声道数：

`nch <1-6>`
  是`1`到`6`之间的整数，用来设置输出的声道数。这个选项是必须的，如果省略将导致 运行时错误。
`l00:l01:l02:..l10:l11:l12:...ln0:ln1:ln2:...`
  是`0`到`1`之间的浮点数。`l[i][j]`决定把输入声道j的多少成分混合到输出声道i。

示例1：
`mplayer -af pan=1:0.5:0.5 -channels 1 media.avi`

把立体声混合成单声道。

示例2：
`mplayer -af pan=3:1:0:1:0.5:0.5 -channels 3 media.avi`

将输出3个声道，0声道和1声道保持不变，再把0声道和1声道混合输出到2声道(然后可以把这个声道输出到副低音)。

#### 2.3.2.3.8 副低音

`sub`插件给音频增加一个副低音声道。用来产生副低音声道的数据是0声道和1声道音频数据的平均混合。 混合后的声音进过4阶Butterworth滤波器低通过滤，默认去掉60Hz以上的声音，然后添加到音频流的一个单独声道中。 警告：当你播放5.1杜比数字音效的DVD时禁用这个滤镜，否则它使副低音的声音发生混乱。这个滤镜有两个选项：

`fc <20-300>`
  是可选的浮点数用来设定滤波器剪除声音的频率，以Hz为单位。有效值从20Hz到300Hz。想获得最好的结果应该尝试 设置剪除频率越低越好。这样会改进立体声或者环绕音效的体验。默认的剪除频率是60Hz。
`ch <0-5>`
  是可选的在`0`到`5`之间的整数，决定插入副声道的声道编号，默认的声道号是`5`。 注意如果需要总的声道数会自动增加到`ch`个。

示例：
`mplayer -af sub=100:4 -channels 5 media.avi`

将增加一个剪除频率为100Hz的副低音声道到输出声道4。

#### 2.3.2.3.9 环绕音效解码

矩阵编码的环绕音效可以通过`surround`滤镜解码。杜比环绕就是矩阵编码格式的一个例子。很多两声道的音频 实际上包含了矩阵编码。为了使用这个特性你需要一个至少支持4声道的声卡。这个滤镜有1个选项：

`d <0-1000>`
  可选的`0`到`1000`之间的浮点数用来设定后部扬声器的延迟时间，以ms为单位。这个延迟应该 这样设定：如果d1是从听众位置到前扬声器的距离而d2是从听众位置到后扬声器的距离，如果d1 <= d2，那么延迟`d` 应该设置为15ms，如果d1 > d2，那么设置为15 + 5*(d1-d2)，`d`的默认值是20ms。

示例:
`mplayer -af surround=15 -channels 4 media.avi`

将使用环绕音效解码并给后部扬声器增加15ms的延迟。

## 注意：音频插件已经被音频滤镜取代，很快会被删去。

#### 2.3.2.4 音频滤镜(已过时)

MPlayer支持音频插件。音频插件s用于在声音到达声卡之前改变音频数据的属性。他们用`-aop`选项加上 `list=插件1,插件2,...`选项打开。必须有`list`选项用来确定应该使用哪些插件，以及他们执行的顺序。例如：

`mplayer media.avi -aop list=resample,format`

将让声音先通过resample插件然后再经过format插件。

插件也有改变他们行为的选项。这些选项在下面将详细地解释。如果选项被省略，插件将按照默认设置运行。 这是一个关于如何组合使用指定选项的插件的例子：

`mplayer media.avi -aop list=resample,format:fout=44100:format=0x8`

这将会将resample插件的输出频率设为44100Hz，format插件的输出格式设置为AFMT-U8。

目前音频插件不能用于MEncoder。

#### 2.3.2.4.1 升/降采样率

MPlayer完全支持对声音升/降采样率。如果你使用固定采样率的声卡或者如果你被只兼容 最大44.1kHz的老声卡郁闷时可以使用这个插件。是否使用这个插件是自动检测的 这个插件有一个选项：`fout`用于设置期望的输出的采样率。单位是<Hz>，默认是48kHz。

用法：
`mplayer media.avi -aop list=resample:fout=<required frequency in Hz, like 44100>`

注意输出频率不能从默认值升高。因为升高会导致音频和视频流播放缓慢而且音频也会扭曲。

#### 2.3.2.4.2 环绕音效解码

MPlayer有一个能解码矩阵编码的环绕音效的音频插件。杜比环绕是矩阵编码格式的一个例子。 大多数2通道音频的文件实际上包含了矩阵编码的环绕音效。为使用这个特性你需要至少支持4个声道的声卡。

用法：
`mplayer media.avi -aop list=surround`

#### 2.3.2.4.3 采样格式转换

如果你的声卡驱动不支持带符号的16位`int`数据类型，这个插件能被用来把它转换为一个你的 声卡能理解的格式。它有一个选项，`format`，可以设置为你在`libao2/afmt.h`中找到的数字。 这个插件几乎很少会用到而且是面向高级用户的。记住这个插件仅仅改变采样格式而不改变采样频率或者声道数。

用法：
`mplayer media.avi -aop list=format:format=<required output format>`

#### 2.3.2.4.4 延迟

这个插件将声音延迟，被计划当做如何开发新的插件的例子。它不能用于任何以用户观点来说有用的东西， 在这里被提到只是为了完整的缘故。不要使用这个插件除非你是开发者。

如果你有一个文件总是A/V同步失败，使用`+/-`实时调整就可以，建议使用OSD，调节更加方便。

#### 2.3.2.4.5 软件音量控制

这个插件是音量控制功能的软件替代，用于哪些使用蹩脚的混音设备的机器。如果你想要改变MPlayer的输 出音量而不改变混音器中PCM音量的设置也可以使用这个插件。它有一个`volume`选项设置初始的音量水平。 初始音量水平能取0到255之间的值，默认值是101相当于放大0分贝。谨慎使用这个插件因为它会降低声音的信噪比。 在大多数情况下最好是把PCM音量设为最大值，放弃这个插件并且通过混音器的主音量控制来控制你的扬声器输出水平。如果你的声卡使用 数字PCM混音器而不是模拟的，而你又听到有扭曲现象，就改用主混音器。如果有连接到计算机的外部功放(这几乎是普遍情况)，噪音水平 能通过调整在主音量级别和功放上的旋钮而最大限度的减少，直到去除嘶嘶的背景噪音。

用法:
`mplayer media.avi -aop list=volume:volume=<0-255>`

这插件也有压缩器或称为“软修饰”的功能。 压缩用于声音的动态范围十分高或者如果扬声器的动态范围十分低的的情况。注意这个特性将造成扭曲并且应该 是最后一种被考虑的手段。

Usage:
`mplayer media.avi -aop list=volume:softclip`

#### 2.3.2.4.6 加强立体声

这个插件(线性地)增加左右声道的差别(像XMMS的extrastereo插件一样)使回放产生某种“现场”效果。

用法:
`mplayer media.avi -aop list=extrastereo`
`mplayer media.avi -aop list=extrastereo:mul=3.45`

默认选项(`mul`)是默认值为2.5的浮点数。如果你把它设置到0.0，你将获得单声道(两个声道的平均值)。 如果你把它设置到1.0，声音不变，如果你把它设置为-1.0，左右声道将被交换。

#### 2.3.2.4.7 音量正则化

这个插件能没有变形的最大化音量。

用法：
`mplayer media.avi -aop list=volnorm`