写给追求音质的朋友,ALSA下的SRC(Sample Rate Conversion)问题
发表于 : 2008-02-09 19:55
这里不涉及基本音质问题,所以如果你有爆音的问题请参考论坛里如何设置PCM音量以避免增益带来的削波失真的文章;或者你有背景噪声,请尝试关闭声卡的录音和与你所需输出声道无关的接口。此外数字输出和外置解码器不在讨论范围。如果你有一片过得去的声卡,音质在感觉上已经不错了,那么你可以看看下面。当然如果你只是疑惑Linux是否真有音质问题,或者是怎么发生的,也可以参考。
最近在使用一块Terratec DMX 6Fire LT(音频I/O控制器是 Ice1712[Envy24])的时候,我发现envy24control这个功能强大的控制软件面板总是显示这片声卡正在使用48KHz的模式,我的音源库基本是从CD转换的FLAC和WAV,采样率都是44.1KHz。DMX 6Fire是一片双晶振的声卡,板上有24.576MHz和22.5792MHz两颗晶体,可以直接支持44.1KHz和48KHz等模式而无需转换。我尝试直接播放一片普通CD,依然自动跳到了48Khz上,真是奇怪。于是我松开了自动Reset频率的选项,手动锁定到44.1KHz,然后播放,没想到声音出来像是慢放的效果,肯定有什么地方不对了。
我使用Amarok管理音乐库,因此想到是否是Xine后端做了自动升频处理,改用ALSA命令行工具aplay播放一段44.1KHz的WAV后,问题依旧。排除了Xine,下面就是ALSA(我使用Xine的ALSA输出插件)本身了,最底层的驱动模块应该没有问题,因为可以手动锁定到任何改卡规格上支持的模式,只是播放效果不正常。逐渐地我想到了一个问题,Evny24是一个音频I/O芯片,并没有CS46xx一类DSP的计算处理能力,应该不支持硬件混音。表现到计算机上,就是多个音频流无法同时开启,你不能在播放音乐的同时再去开一个电影播放器,甚至IM软件的消息通知音都无法播放。但是在我的系统下同时开出一打的音频程序确实又没有问题,最终我把目光放到了ALSA的软件混音插件DMix上。
由于从前我的声卡使用CS4630芯片或者EMU10K,dsp具有硬件多音频流和SRC功能,因此我不太使用DMix。但现在我决定还是去掉DMix看看是否有用。在下,我找到了ICE1712芯片声卡的预设文件ICE1712.conf,并注释掉了开头一段dmix相关的项目。随后我用aplay播放一段44.1KHz的WAV,声卡终于自动跳转到了正确的模式!当然作为代价,相应地我暂时失去了软件混音的功能。
结论很清楚,现在的ALSA默认已经为不具备硬件多音频流混音功能的声卡开启了DMix。由于DMix需要把多个可能是不同取样率的音频流混合输出,需要一个较高的常用取值。ALSA默认会为DMix采用48KHz的Sample Rate,若是低于此频率,则升频到48KHz。接下去的问题是,DMix在SRC之后,是否影响听感?在我看来,有一定影响,比如小提琴的高音延展会不足,而较为纤细的泛音被DMix做SRC之后也会被削弱或模糊(请抓取后面的附件音频试听)。因此如果你有双晶振声卡但没有硬件混音,并对44.1KHz回放的音质有所不满(例如结像较虚),那么你可以考虑在欣赏音乐的时候关闭DMix,这样可以完全发挥双晶振应有的实力。当然如果你只重视44.1KHz音源例如从CD抓轨的APE/FLAC/WAV,而对DVD或者其他视频相对来说无所谓一些,同时不想失去软件多音频流支持,那么你也可以只把DMix设定到默认44.1KHz,享受音乐,迁就视频(毕竟看视频时,我们关注画面多过声音)。
将DMix的默认输出频率设定到44.1KHz,请参考以下~/.asoundrc
除此之外,有些声卡只有单晶振,无法直接支持两种频率,必须透过SRC,如此情况下,高品质的SRC至少可以降低失真。ALSA考虑到这种情况,允许通过插件调用外部高品质SRC库进行转换运算。为了使用外部SRC,你需要libasound2-plugins,libsamplerate0等软件包(源中均有)。安装完毕后,在~.asoundrc 中加入启用最佳SRC算法。
以上为最近的研究总结,写得比较仓促,供诸位Ubuntu音乐粉丝参考批评。
最近在使用一块Terratec DMX 6Fire LT(音频I/O控制器是 Ice1712[Envy24])的时候,我发现envy24control这个功能强大的控制软件面板总是显示这片声卡正在使用48KHz的模式,我的音源库基本是从CD转换的FLAC和WAV,采样率都是44.1KHz。DMX 6Fire是一片双晶振的声卡,板上有24.576MHz和22.5792MHz两颗晶体,可以直接支持44.1KHz和48KHz等模式而无需转换。我尝试直接播放一片普通CD,依然自动跳到了48Khz上,真是奇怪。于是我松开了自动Reset频率的选项,手动锁定到44.1KHz,然后播放,没想到声音出来像是慢放的效果,肯定有什么地方不对了。
我使用Amarok管理音乐库,因此想到是否是Xine后端做了自动升频处理,改用ALSA命令行工具aplay播放一段44.1KHz的WAV后,问题依旧。排除了Xine,下面就是ALSA(我使用Xine的ALSA输出插件)本身了,最底层的驱动模块应该没有问题,因为可以手动锁定到任何改卡规格上支持的模式,只是播放效果不正常。逐渐地我想到了一个问题,Evny24是一个音频I/O芯片,并没有CS46xx一类DSP的计算处理能力,应该不支持硬件混音。表现到计算机上,就是多个音频流无法同时开启,你不能在播放音乐的同时再去开一个电影播放器,甚至IM软件的消息通知音都无法播放。但是在我的系统下同时开出一打的音频程序确实又没有问题,最终我把目光放到了ALSA的软件混音插件DMix上。
由于从前我的声卡使用CS4630芯片或者EMU10K,dsp具有硬件多音频流和SRC功能,因此我不太使用DMix。但现在我决定还是去掉DMix看看是否有用。在
代码: 全选
/usr/share/alsa/cards/
代码: 全选
# default with dmix & dsnoop
ICE1712.pcm.default {
@args [ CARD ]
@args.CARD {
type string
}
type asym
playback.pcm {
type plug
slave.pcm {
@func concat
strings [ "dmix:" $CARD ",FORMAT=S32_LE" ]
}
}
capture.pcm {
type plug
slave.pcm {
@func concat
strings [ "dsnoop:" $CARD ",FORMAT=S32_LE" ]
}
}
}
将DMix的默认输出频率设定到44.1KHz,请参考以下~/.asoundrc
代码: 全选
pcm.!default {
type plug
slave.pcm "dmixer"
}
pcm.dsp0 {
type plug
slave.pcm "dmixer"
}
pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm "hw:0,0"
period_time 0
period_size 1024
buffer_size 8192
rate 44100
}
bindings {
0 0
1 1
}
}
ctl.mixer0 {
type hw
card 0
}
代码: 全选
default.pcm.rate_converter "samplerate_best"
以上为最近的研究总结,写得比较仓促,供诸位Ubuntu音乐粉丝参考批评。