发布新日志

  • Linux/ALSA下SRC(Sample Rate Convertion)引起的音质问题和解决方案

    2008-02-09 20:13:06

        这里不涉及基本音质问题,所以如果你有爆音的问题请参考论坛里如何设置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需要混音,也就是把多个可能是不同取样率的音频流混合输出,因此它需要一个较高的常用取值作为基准。默认会采用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算法。
  • FLAC音频在xine后端播放器上的进度定位

    2007-12-31 21:40:49

        FLAC作为自由的lossless音频格式,被广为采用(国内可能不及APE)。近日有个朋友抱怨用Amarok管理FLAC库后,很多FLAC文件播放时拖动进度标条,却一下子没了声音,要许久许久才能恢复,而且往往还是定位错误了的,而在其他一些播放器上却没有这个问题。

        Amarok目前使用的后端是xine,所以先实验了其他xine做后端的播放器,如出一辙。随即搜索了一下maillist,发觉很多人都在抱怨同样的问题,却没有搜到能解决问题的patch。思索之余,觉得如果不能改变播放器,不如从文件本身入手:flac本身可以写入元数据信息(metadata),其中包括了定位点(seek points)索引表,可能有一些文件并没有包含这部分信息。从播放器来看,只要支持索引表跳转,就能定位(xine应该是可以的,因为有些flac还是可以跳转的)。

        有了思路,下面的问题就好办了,只要安装了flac这个软件包,就可以找到metaflac这个元数据修改工具(CLI tool)。metaflac的功能强大,具体用法可看手册。加入定位点信息的参数为--add-seekpoint,为了取得较为精确平滑的定位效果,我们可以采取比较激进的参数,精确到1秒。切换到专辑文件目录下,用以下命令为当前目录下所有的flac文件写入定位索引表信息:

    metaflac --add-seekpoint=1s *.flac

        然后启动Amarok播放,效果良好,完全可以达成精确快速的定位。
  • 惠普廉价系激光打印机在Ubuntu上的即插即用

    2007-12-03 23:56:28

    在Ubuntu 7.04或者7.10下,由于CUPS项目以及foo2zjs的帮助,惠普Laserjet 1xxx这类打印机是可以很好地即插即用的。但是,你会发现当关闭打印机电源后重开的时候也许情况不是那么好了,用户会发现打印队列里的东西永远也到不了打印机。

    为什么会这样呢?因为Laserjet 1000需要加载驱动程序附带的firmware才能初始化,在windows下,这是自动的。Ubuntu从Feisty(7.04)起已经修正了自动加载(bug#65618),但由于版权原因系统没有带改firmware。用户可以通过foo2zjs自带的程序抓取之。

    执 行 $getweb 1000 后,将会自动从internet下载sihp1000.img,然后再执行 $sudo arm2hpdl sihp1000.img > /usr/share/foo2zjs/firmware/sihp1000.dl 则将该文件放置到foozjs指定目录下,这样一来每次插入Laserjet1000时,系统会自动从该处加载这个firmware,相当于自动执行了 cat /usr/share/foo2zjs/firmware/sihp1000.dl /dev/lp*。

    完成后可关闭并重新启动打印机,滚轮将会转动两次,并且信号灯跳越后停在绿灯上表示工作就绪,此时即可直接打印了。

    updated: 另外,在KUbuntu7.10下,默认可能无法找到foo2zjs驱动(ppd)的打印机,它们不在列表里(如HPLaserJet 1000),这时可以手动选择到/usr/share/foo2zjs/ppd中的压缩后ppd驱动文件(.ppd.gz)。
  • 在Ubuntu上使用MAYA8的常见问题备忘

    2007-12-03 23:47:32

    受朋友之托,看看MAYA 8.0 for Linux在Ubuntu上安装和运行中有一些什么问题。在实验了几次之后,确实发现了一些问题,搜索和尝试解决之后,总结如下:


    1. 安装CSH,Maya的脚本是csh的,而Ubuntu默认没有安装。

    2. 必须安装的三个包为:awcommon awcommon-server和maya8

    3. RPM- for linux的安装包是为RPM格式的,最好用alien转换成deb安装。转换时强烈推荐用"--scrīpts"参数(alien --scrpits xxx.rpm)。

    4. 转换完安装之前先在根目录下做一名为aw的个符号链接: ln -s /usr/aw /aw,没有相应目录则开一个空的(否则安装的时候可能会有错误)。

    5. dpkg 安装所有三个转换后的deb打包。

    6. 在/usr下建立tmp目录,给予写权限,否则mentalray渲染器在render时可能会出错。

    7. 如果Maya默认启动后会有使用右键鼠标光标跳回X窗口系统原始默认的大叉形状而不是窗口管理器指定的光标。这个可以修改maya的启动脚本文件加以解决, 方法是在/usr/aw/maya8.0/bin/maya中加入环境变量MAYA_MMSET_DEFAULT_XCURSOR。一定要用 "setenv MAYA_MMSET_DEFAULT_XCURSOR 1" 而不是"export MAYA_MMSET_DEFAULT_XCURSOR 1",因为export是bash的语法,而Maya写的是csh脚本所以不吃bash那套。

    8. 修改默认的界面使用的字体和UI调色盘可以通过修改/usr/aw/maya8.0/app-defaults/MayaScheme来实现,在这里配置自己喜欢的字体族和颜色方案。

    附带Cobra在chinaVFX上post的深色UI及字体调教后的MayaScheme内容(Thx buddy!):

    *extraLargeBoldLabelFont: -*-helvetica-bold-r-normal-*-17-*-*-*-*-*-iso8859-1

    *largeBoldLabelFont: -*-helvetica-bold-r-normal-*-14-*-*-*-*-*-iso8859-1

    *boldLabelFont: -*-clearbold-medium-r-*-*-12-*-*-*-*-*-*-*

    !!*boldLabelFont: -*-helvetica-bold-r-normal-*-12-*-*-*-*-*-iso8859-1

    !!*smallBoldLabelFont: -*-helvetica-medium-r-normal-*-12-*-*-*-*-*-iso8859-1

    *smallBoldLabelFont: -*-clearbit-bold-r-normal-*-12-*-*-*-*-*-iso8859-1

    *tinyBoldLabelFont: -*-helvetica-bold-r-normal-*-10-*-*-*-*-*-iso8859-1

    !!*plainLabelFont: -*-helvetica-medium-r-normal-*-12-*-*-*-*-*-iso8859-1

    *plainLabelFont: -*-clearbit-medium-r-normal-*-12-*-*-*-*-*-iso8859-1

    *smallPlainLabelFont: -*-lucida-medium-r-normal-*-10-*-*-*-*-*-iso8859-1

    *obliqueLabelFont: -*-helvetica-bold-o-normal-*-12-*-*-*-*-*-iso8859-1

    *smallObliqueLabelFont: -*-helvetica-bold-o-normal-*-10-*-*-*-*-*-iso8859-1

    *fixedWidthFont: -*-fixed-medium-r-normal--13-*-*-*-*-*-iso8859-1

    *smallFixedWidthFont: -*-lucida-medium-r-*-*-12-*-*-*-*-*-*-*

    *XmLabel.fontList: -*-lucida-medium-r-*-*-10-*-*-*-*-*-*-*



    *bottomShadowColor: #303030

    *topShadowColor: #585858

    *basicForeground: #e0e0e0

    *basicBackground: #404040



    *Maya*background: #404040

    *Maya.background: #808080

    *XmForm*background: #404040

    *XmLabel*background: #404040

    *ApplicationShell*background: #404040

    *XmRowColumn*background: #404040

    *XmMainWindow*background: #404040

    *XmCascadeButton*background: #404040

    *XmButton*background: #404040

    *XmDrawingArea*background: #404040

    *XmFrame*background: #404040

    *XmTextField.background: #404040

    *Maya*foreground: #e0e0e0

    *Maya.foreground: #f0f0f0



    !!same effect

    *Maya.outlinerPanel1.outlinerPanel1.TearOffPane.TopLevelPanelLayout.outlinerForm.outlinerPane.outlinerPanel1.hScroll.height: 20

    *Maya*ApplicationShell*XmMainWindow*XmForm*XmMainWindow*XmForm*XmForm*XmForm*XmScrollBar*height: 20

    *Maya*ApplicationShell*XmMainWindow*XmForm*XmMainWindow*XmForm*XmForm*outlinerPanel1.hScroll.height: 20

    *Maya.MainWindow.MainWindow.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFrameLayout.topShadowColor:#303030

    *Maya.MainWindow.MainWindow.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFrameLayout.bottomShadowColor:#585858

    *Maya.MainWindow.MainWindow.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFrameLayout.topShadowColor:#303030

    *Maya.MainWindow.MainWindow.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFormLayout.ELFdefaultFrameLayout.bottomShadowColor:#585858



    *Maya*XmText*topShadowColor: #303030

    *Maya*XmText*bottomShadowColor: #585858



    !!*Maya*XmForm*XmScrollBar*background: #939181

    !!*Maya*XmForm*XmPushButton*background: #f4f2e4

    !!*Maya*TransientShell*XmRowColumn*background: #e7dff1



    *textForeground: #c0c0c0

    *textFieldBackground: #6d566d

    *readOnlyBackground: #464f44

    *buttonBackground: #b7bbae

    *scrollBarTroughColor: #b7bbae

    *scrollBarControlBackground: #b7bbae

    *indicatorBackground: #cbcbcb

    *radioColor: #726c5b

    *checkColor: #ff0000

    *blueSelectBackgroundColor1: #3d5366

    *blueSelectBackgroundColor2: #849dae

    *drawingAreaBackground: #5d647c

    *drawingAreaContrastColor1: #b04b4b

    *drawingAreaContrastColor2: #4e3aa4

    *drawingAreaContrastColor3: #008700

    *drawingAreaContrastColor4: #7d3ca5

    *scrolledListBackground: #6d6d6d

    *textBackground: #585858

    *highlightColor1: #ff0000

    *highlightColor2: #0000ff

    *highlightColor3: #00ff00

    *highlightColor4: #a01ef0

    *highlightColor5: #ffa500

    *highlightColor6: #00ffff

    *highlightColor7: #ff00ff

    *HighlightColor8: #ffff00

    *wMBackground: #aaaaaa

    *wMForeground: #000000

    *wMActiveBackground: #c6c1aa

    *wMActiveForeground: #000000

    *textSelectedBackground: #909070

    *textSelectedForeground: #201020

    *indicatorLightColor: #ffff00

    *selectFillColor: #ffff00

    *redColor: #ef001c

    *orangeColor: #e46800

    *yellowColor: #d9b000

    *greenColor: #169612

    *blueColor: #3063a2

    *brownColor: #924c39

    *purpleColor: #924f95

    *errorColor: #c60000

    *warningColor: #0067a8

    *informationColor: #00ff00

    *alternateBackground1: #c1adad

    *alternateBackground2: #a7b7a7

    *alternateBackground3: #bbbbcd

    *alternateBackground4: #9fbfbf

    *alternateBackground5: #87aaca

    *alternateBackground6: #d1d1c9

    *disabledTextForeground: #aaaaaa

    *layerAdjustmentTextForeground: #e56929

    *lightRadioFillColor: #9e9edc

    *disabledCheckColor: #dc9e9e

  • 修复因安装不友好的deb导致包管理系统瘫痪的思路

    2007-12-03 23:45:43

    有一些不怎么友好的deb软件包可能由于某种原因(比如转换不完全成功)安装到一半失败,而想卸载却又卸不掉。无论用什么apt或者dpkg的命令都无法起作用时,用 户可能会很着慌,以至于要备份并重新安装整个系统。这时先不要急,因为一般性的情况下,并不是整个包管理系统真的损坏了,而只是因为一些情况在包管理系统 的意料之外而拒绝读取索引。只要手动从dpkg的索引文件和相关目录删除这些软件的信息/文件即可让包管理系统恢复正常。

    对于deb系统而言,其实安装软件包不外乎把软件解压缩到指定的目录下去,然后运行设定脚本去读取一些环境变量来生成 一些配置文件。完了之后dpkg会把安装结果和软件包状态的变化记录到索引文件中去(apt也一样,因为它在安装软件包时其实是调用了dpkg)。所以我 们手动删除这些信息之后就和没安装过他们一模一样。要手动删除一个软件包,要做的就是:

    1.找出软件包安装的文件的列表,一一删除之。

    2.在索引文件中找到这些软件包的信息并删除之。

    3.重建索软件包集合信息。


    如果要求不高,只希望包关系系统恢复工作的话,只需要2和3就够了。用不着的文件暂时放一放也无妨(前提是不会对系统安全性产生威胁)。对应的信息获取地点和操作地点:

    1.软件包的文件列表,在包内,只要deb还在(一般通过apt缓存的包放在/var/cache/apt/archives),用dpkg -c XXX.deb就可以得到。

    2.索引信息,一般在/var/lib/dpkg/status,文本文件,结构简单清楚;另外/var/lib/dpkg/info下有每个安装过的包的信息文件信息(和MD5校验),一组3-4个文件,以软件包命名,后缀为list、md5等等,酌情删除。

    3.apt-get update

    上 面3条不能保证100%删除所有软件包残留信息,只是能够尽快让apt/dpkg恢复工作。一些注册信息比如向gconf注册schema需要额外步骤来 注销,也许比较省力的方法就是设法找一个更新后或者版本兼容的deb替代安装,如此就能覆盖掉以前的信息,再删除就清除了所有的残留。

我的栏目

数据统计

  • 访问量: 1414
  • 日志数: 6
  • 建立时间: 2007-11-18
  • 更新时间: 2008-02-09

RSS订阅

Open Toolbar