写给追求音质的朋友,ALSA下的SRC(Sample Rate Conversion)问题

Totem,mplayer,sopcast,realplayer,bmp
anderson_yao
帖子: 27
注册时间: 2007-06-03 12:50

写给追求音质的朋友,ALSA下的SRC(Sample Rate Conversion)问题

#1

帖子 anderson_yao » 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看看是否有用。在

代码: 全选

/usr/share/alsa/cards/
下,我找到了ICE1712芯片声卡的预设文件ICE1712.conf,并注释掉了开头一段dmix相关的项目。随后我用aplay播放一段44.1KHz的WAV,声卡终于自动跳转到了正确的模式!当然作为代价,相应地我暂时失去了软件混音的功能。

代码: 全选

# 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" ]
		}
	}
}
结论很清楚,现在的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

代码: 全选

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
}
除此之外,有些声卡只有单晶振,无法直接支持两种频率,必须透过SRC,如此情况下,高品质的SRC至少可以降低失真。ALSA考虑到这种情况,允许通过插件调用外部高品质SRC库进行转换运算。为了使用外部SRC,你需要libasound2-plugins,libsamplerate0等软件包(源中均有)。安装完毕后,在~.asoundrc 中加入

代码: 全选

default.pcm.rate_converter "samplerate_best"
启用最佳SRC算法。

以上为最近的研究总结,写得比较仓促,供诸位Ubuntu音乐粉丝参考批评。
附件
test.flac.bz2
44.1KHz测试文件,对比SRC前后的变化
(183.24 KiB) 已下载 796 次
上次由 anderson_yao 在 2008-02-10 10:45,总共编辑 1 次。
anderson_yao
帖子: 27
注册时间: 2007-06-03 12:50

#2

帖子 anderson_yao » 2008-02-09 21:31

上面的附件里是一个常用的测试SRC品质的音频文件,FLAC格式,前景声是一个拨电话时电话里传来的的按键音,背景接近寂静,但在后半部分有一段十分纤细的类似远处传来警报的声音。如果你可以听见,恭喜这个至少是接近原声的。一般SRC之后,这个类似“唔~哇~唔~哇”的声音是完全听不到的,最多也只有一定的微弱噪声,这就是SRC带来的损失最直接的证明。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#3

帖子 eexpress » 2008-02-09 21:44

声卡驱动关系复杂。没一个图文解说的。那Lirc的声卡采样,曾经看晕。
● 鸣学
头像
syrano
帖子: 4313
注册时间: 2007-10-06 18:40

#4

帖子 syrano » 2008-02-09 22:57

thank you . :lol:
头像
zhuqin_83
帖子: 10606
注册时间: 2006-05-13 4:02
联系:

#5

帖子 zhuqin_83 » 2008-02-09 23:19

绝大多数还是集成声卡,目前的一般都是intel hda的那些,不像ac97普遍存在src。
lz还有没有48khz的测试音频?
HP Pavilion DV6-2064CA: AMD Turion II Ultra Dual-Core Mobile M640, HD4650, 2GBx2 DDR2-800, Seagate 500GB 7200RPM SATA, BD-ROM
DELL UltraSharp 2209WA
Arch64, Testing repo
头像
zhuqin_83
帖子: 10606
注册时间: 2006-05-13 4:02
联系:

#6

帖子 zhuqin_83 » 2008-02-09 23:52

我觉得lz的情况应该不是普遍的,不知道和声卡或者alsa版本是否有关。
我这里是alsa 1.0.15,AD 1986A芯片,也是双频率的,但并不存在默认开启48khz的情况。
如有src,那么用audacious播放应该听不到lz所说的呜哇声,而一旦用audacious开启src,那么确实是听不到的。

这里提醒一下,audacious居然默认开启src,还是96khz的,所以如果你觉得用audacious音质很差或者没有声音,那么应该就是这个原因了。毕竟不是所有的声卡都支持96khz。
HP Pavilion DV6-2064CA: AMD Turion II Ultra Dual-Core Mobile M640, HD4650, 2GBx2 DDR2-800, Seagate 500GB 7200RPM SATA, BD-ROM
DELL UltraSharp 2209WA
Arch64, Testing repo
anderson_yao
帖子: 27
注册时间: 2007-06-03 12:50

#7

帖子 anderson_yao » 2008-02-10 11:25

zhuqin_83 写了:我觉得lz的情况应该不是普遍的,不知道和声卡或者alsa版本是否有关。
我这里是alsa 1.0.15,AD 1986A芯片,也是双频率的,但并不存在默认开启48khz的情况。
如有src,那么用audacious播放应该听不到lz所说的呜哇声,而一旦用audacious开启src,那么确实是听不到的。

这里提醒一下,audacious居然默认开启src,还是96khz的,所以如果你觉得用audacious音质很差或者没有声音,那么应该就是这个原因了。毕竟不是所有的声卡都支持96khz。
这个ALSA下的问题,是纯粹的软件SRC。就是说如果启用了Dmix,那就会被(内置的低精度算法)强制转换到48KHz,这是从ALSA前几个版本开始的。最新的和自行编译的ALSA版本就说不清楚了。如果是支持硬件多音频流的声卡,不用DMix是不会有SRC问题的,去掉DMix就彻底摆脱了问题。支持硬件多音频流或者SRC并不代表音质的好坏,玩家也会要在收益和方便程度上作出一定权衡。

BTW,有些播放软件使用的插件可以不经过Dmix,这样如果播放器本身若没有开转换也不会有软件SRC的问题。
头像
syrano
帖子: 4313
注册时间: 2007-10-06 18:40

#8

帖子 syrano » 2008-02-10 12:07

第一种方法,成功。
第二中方法也成功但感觉和第一种一样,软件一样调节不了音量。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#9

帖子 BigSnake.NET » 2008-02-16 19:28

+ 精
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
syrano
帖子: 4313
注册时间: 2007-10-06 18:40

#10

帖子 syrano » 2008-07-13 22:44

8.04好像不用改了。
E=m c^2
头像
jarryson
帖子: 4002
注册时间: 2005-08-14 19:53

#11

帖子 jarryson » 2008-07-27 13:19

OSS驱动这些src效果都是可调的,还可以关闭。比特率也是可调的

使用audacious这个测试好于任何播放器,vlc可以听见,mplayer,gstreamer后端的,mpd全部都听不见。。

不过不知道audacious和vlc那个的声音比较正确。听起来audacious比较正常。。

这么明显!。。。。
头像
zhuqin_83
帖子: 10606
注册时间: 2006-05-13 4:02
联系:

#12

帖子 zhuqin_83 » 2008-07-27 21:23

gstreamer肯定可以听见。
HP Pavilion DV6-2064CA: AMD Turion II Ultra Dual-Core Mobile M640, HD4650, 2GBx2 DDR2-800, Seagate 500GB 7200RPM SATA, BD-ROM
DELL UltraSharp 2209WA
Arch64, Testing repo
demonsimon
帖子: 4
注册时间: 2009-02-18 18:20

Re: 写给追求音质的朋友,ALSA下的SRC(Sample Rate Conversion)问题

#13

帖子 demonsimon » 2009-08-06 9:21

很感谢楼主~~~

如果完成楼主所说的Dmix设置之后,再把pcm调到90%左右,ubuntu的音质很赞,没有噪音拉~~~ :em01
zl2970798
帖子: 51
注册时间: 2008-06-01 12:31

Re: 写给追求音质的朋友,ALSA下的SRC(Sample Rate Conversion)问题

#14

帖子 zl2970798 » 2009-11-15 0:28

我用mplayer放能听见远处传来的报警声,但是用banshee 就听不见了。
头像
byx01
帖子: 67
注册时间: 2008-08-26 4:31

Re: 写给追求音质的朋友,ALSA下的SRC(Sample Rate Conversion)问题

#15

帖子 byx01 » 2009-11-26 23:04

声卡音效芯片 cmi8787
Codec芯片 akm4396
DAC芯片 24bit 192kHz级别芯片
适用操作系统 Windows XP/XP x64/Vista/Vista x64
信号传输类别 数字式
声道系统 5.1声道
声卡采样率 44.1KHz
采样精度 24bit

德国坦克HiFier Serenade小夜曲功能参数

数字输出


支持音效 DirectSound/3D/A3D 1.0/EAX 1.0,EAX 2.0等
音频接口 一组立体声模拟输出(RCA接口)
一只耳机输出(6.3mm TRS接口)
两组数字输出(同轴及光纤各一个)
其它功能 集成耳机放大器电路
带有AIR技术改善音质
所有讯号来源均可单独控制输出音量

这块小夜曲是不是也一样能在8.04下用?????
回复