LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 7452|回复: 20

[原创][多音频流完整解决方案]让你在Skype的时候看电影,听歌,看flash.......

[复制链接]
发表于 2005-3-25 16:18:06 | 显示全部楼层 |阅读模式
作者:张乐, a.k.a  zhllg
本文试阐述在alsa环境下多个进程共享声卡的问题以及具体如何通过alsa让skype和其他程序同时使用声卡。本文可以看作是笔者的个人经验介绍。同时有些信息翻译自一些英文资料。笔者的声卡是AC'97(intel8x0),系统是gentoo,
内核2.6.11-nitro0, KDE3.4(split ebuild,arts-3.4.0),alsa-driver, alsa-utils, alsa-oss均为1.0.8,skype是www.skype.com上下载的static binary with Qt 3.2 compiled in(因为非static的版本在笔者的系统中总是segfault。这个稍微大一点,只有Qt的共享库是静态编译的),mplayer是1.0pre6-3.4.3-20050110,gaim是1.2.0, realplayer是10.0.2.608(Gold),xmms是1.2.10,stardict 2.4.4(安装了WyabdcRealPeopleTTS),flash plugin 版本7.0.25.0。注意本文不涉及如何安装alsa驱动的问题,请参阅其他资料。实现多音频还可以使用http://www.opensound.com/的商业驱动。不过是close-sourced,以前还是要收钱的。现在虽然个人使用已经免费(free)了,但总归是不自由(free)的。好了,闲话少叙,我们来切入正题。

先来看一看一些背景知识

首先要了解Linux有两种不同的声音系统
    *  OSS (Open Sound System) 旧的.对于44100 Hz, 立体声(stereo), 16-bit 音频与一般的声卡及要求它可以工作的很好. 但不足以胜任专业级的音频处理工作。 很多旧的软件都只能使用OSS。 OSS系统中通常有下列设备文件/dev/audio  /dev/dsp  /dev/midi    /dev/mixer   /dev/music /dev/sequencer等等

    * ALSA (Advanced Linux Sound Architecture)新的。对于很多旧的声卡支持的不是很好,但是支持很多新的声卡以及很多高级的专业的功能,而且具备很强扩展性。可参见http://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html。现在已经是2.6内核的一部分。ALSA音频系统的设备文件在/dev/snd下。如果装了ALSA oss模拟层,也会有/dev/dsp等文件。

人们往往希望多个进程能同时使用声卡。这就需要将多个进程的声音输入混入一个音频流的能力,即multiplexing。如果希望使用alsa来达到这个要求,针对几种不同情况需要使用不同的技巧。区分的标准主要在于声卡/芯片是否支持硬件混音,程序通过alsa库直接访问声卡,还是通过声音服务器(即artsd之类), 还是通过OSS模拟。
如果硬件支持,alsa驱动支持共享声卡。在硬件不支持的情况下,alsa库也支持共享,只不过需要一些配置。对于使用OSS的程序,aoss能够让它们使用alsa。最后使用声音服务器(arts, esound)的程序,大多数声音服务器能作软件混音并支持alsa输出。所有的情况总结如下:
    * 声卡支持硬件混音
    * 声卡不支持硬件但是程序使用alsa库来访问声卡
    * 程序使用声音服务器访问声卡
    * 程序使用OSS API访问声卡

如果声卡支持硬件混音,那么声卡的共享应该不是个问题。

如果声卡不支持硬件混音但程序使用alsa库来访问声卡,那么可以创建一个允许软件混音的.asoundrc,放在用户的宿主目录下。通过使用dmix(允许多个进程使用一个声卡输出),dsnoop(允许多个进程从一个设备录音),asym(将前两者合并成)来实现。这三者都是alsa的插件。下面有具体的例子。这样的程序有aplay, arecord,alsaplayer。很多程序通过配置都可以直接使用alsa库来访问声卡,比如mplayer, xmms。这是最理想的情况。开发比较活跃的自由软件往往都可以做到。

如果程序使用声音服务器,那么可以将声音服务器的输出选择为alsa,然后就可以了。对于本来不使用声音服务器的软件(这样的软件实际上只剩下了使用OSS来访问声卡的,直接使用alsa的不必多此一举)也可以令它们使用声音器。以arts为例,执行时前面加artsdsp就可以做到这一点。Skype在笔者这里正是这样处理的。

如果程序使用OSS API来访问声卡,可以在执行时前面加上aoss来令它们使用alsa。

小结:上面Linux的程序不能截然分成上面三类,因为很多程序都可以选择输出插件,比如xmms。还有,程序能否共享声卡,跟程序本身有很大关系,要看它采用什么样的手段输出。最好的程序就是可以直接使用alsa的了。

下面来看具体该怎么样做
首先要有一个合理配置的.asoundrc,这个是笔者的
  1. pcm.!dmix {
  2.     type dmix
  3.         ipc_key 5678293
  4.         ipc_key_add_uid yes
  5.         slave {
  6.             pcm "hw:0,0"
  7.                 period_time 0
  8.                 period_size 2048
  9.                 buffer_size 16384
  10.                 format S16_LE
  11.                 rate 48000
  12.         }
  13. }
  14. pcm.!dsnoop {
  15.     type dsnoop
  16.         ipc_key 5778293
  17.         ipc_key_add_uid yes
  18.         slave {
  19.             pcm "hw:0,0"
  20.                 period_time 0
  21.                 period_size 2048
  22.                 buffer_size 16384
  23.                 format S16_LE
  24.                 rate 48000
  25.         }
  26. }

  27. pcm.asymed {
  28.     type asym
  29.         playback.pcm "dmix"
  30.         capture.pcm "dsnoop"
  31. }

  32. pcm.!default {
  33.     type plug
  34.         slave.pcm "asymed"
  35. }

  36. pcm.dsp0 {
  37.         type plug
  38.                 slave.pcm "asymed"
  39. }

  40. ctl.mixer0 {
  41.         type hw
  42.                 card 0
  43. }
复制代码

pcm.!dmix, pcm.!dsnoop, pcm.!default是分别重新定义dmix,dsnoop插件,以及default设备,目的是为了使skype更好的工作。
下面的pcm.dsp0, ctl.mixer0是为了使用aoss的程序。

先讲讲怎么样使一些常见的程序都能够使用alsa的dmix混音
mplayer: 在/etc/mplayer.conf中修改ao
ao="alsa:device=dmix"

xmms: options->preferences->output plugin选择alsa output plugin,并配置,audio device填入dmix

gaim: preferences->interface->sounds->sounds method, Method选择command, sound command填入“aplay -D plug:dmix %s”

这些都是比较alsa friendly的,下面看其他的一些

realplay: 使用aoss, 写个脚本把真正的realplay包起来,将脚本mv为/usr/bin/realplay
  1. #!/bin/sh
  2. aoss /opt/RealPlayer/realplay "$@"
复制代码

注:gentoo里二进制包的软件,都放在/opt里,不是所有的系统都这么处理。所以不要照抄这一段

firefox(flash plugin): 与上面类似,脚本内容为,存为/usr/bin/firefox
  1. #!/bin/sh
  2. aoss /usr/libexec/firefox "$@"
复制代码

注:这只是为了flash插件,mplayer插件上面设置完就可以使用dmix了

stardict:稍微麻烦一点,他使用esound(esd)。所以如果读者使用gentoo的话要先USE=“alsa" emerge media-sound/esound,然后rc-update add esound default
然后修改/etc/esd/esd.conf,在spawn_options最后加上-d default
  1. [esd]
  2. auto_spawn=1
  3. spawn_options=-terminate -nobeeps -as 2 -d default
  4. spawn_wait_ms=100
复制代码

注:stardict在刚开机的时候不行,关掉stardict再开己可以了,只需要一次。

最后来看看skype
首先我们来通过KDE控制中心来配置一下arts
Sound System
General:  选择enable the sound system, run with the highest possible priority(realtime priority)
Sound buffer调节到92 miliseconds(8 fragments with 2048 bytes)
Hardware: 音频设备:Advanced Linux Sound Architecture
选择full duplex , using custom sampling rate: 48000 , Quality: 16 bits

好了,再看skype
gentoo中skype装在/opt/skype下
笔者写个了个脚本叫skype放在了/usr/bin/下

  1. #!/bin/sh
  2. artsdsp -m /opt/skype/skype
复制代码


这样基本上就大功告成了。只是以后使用skype的时候要确保先启动artsd
先这样吧,如果有问题以后再补充

最后推荐个好网站
http://alsa.opensrc.org
还有一些连接
http://gentoo-wiki.com/HOWTO_ALSA_sound_mixer_aka_dmix
http://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html
发表于 2005-5-27 09:50:48 | 显示全部楼层
写得太好了。
加精,加精!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-27 11:09:51 | 显示全部楼层
呵呵
谢谢捧场
终于有人说句话了

不过为了论坛着想,为了论坛更加清洁,减少资源浪费
请版主把这贴删了吧

gentoo版有最新版本,updated
回复 支持 反对

使用道具 举报

发表于 2005-5-27 11:16:23 | 显示全部楼层
Post by zhllg
呵呵
谢谢捧场
终于有人说句话了

不过为了论坛着想,为了论坛更加清洁,减少资源浪费
请版主把这贴删了吧

gentoo版有最新版本,updated


何必删呢?
挺好的
我补一下

对于debian
apt-get install alsa-utils alsa-base alsa-oss

如果用gnome的话
apt-get install gstreamer0.8-alsa
这样在gsteamer-properties 时就会出现alsa的选项。(当然要选上了)

另外skype 的启动脚本最好是 (假设已经用kcontrol配置过了)
#!/bin/sh
m=$(ps -A|grep artsd)
if [ -z "$m" ];then
        artsd -d &
fi
artsdsp -m skype &
回复 支持 反对

使用道具 举报

发表于 2005-5-27 11:17:12 | 显示全部楼层
Post by zhllg
呵呵
谢谢捧场
终于有人说句话了

不过为了论坛着想,为了论坛更加清洁,减少资源浪费
请版主把这贴删了吧

gentoo版有最新版本,updated


何必删呢?
挺好的
我补一下

对于debian
apt-get install alsa-utils alsa-base alsa-oss

如果用gnome的话
t-get install gstreamer0.8-alsa
这样在gsteamer-properties 时就会出现alsa的选项。(当然要选上了)

另外skype 的启动脚本最好是 (假设已经用kcontrol配置过了)
#!/bin/sh
m=$(ps -A|grep artsd)
if [ -z "$m" ];then
        artsd -d &
fi
artsdsp -m skype &
回复 支持 反对

使用道具 举报

发表于 2005-5-27 13:57:14 | 显示全部楼层
我也补充:对有硬件混音的声卡,默认安装(OSS)也是多音频流的.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-28 00:52:47 | 显示全部楼层
Post by jetair
我也补充:对有硬件混音的声卡,默认安装(OSS)也是多音频流的.

of course,hehe
回复 支持 反对

使用道具 举报

发表于 2005-12-9 19:50:38 | 显示全部楼层
虽然来得晚了些,但楼主这个真是好贴,解决了我一直的音频问题,谢谢!但我系统比较奇怪,xmms如果选alsa的情况下就会把kde的音频占用了,只有选esound时才能使用所有程序同时使用音频,我的系统是suse9.2.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-9 21:49:47 | 显示全部楼层
kde的声音插件选的是alsa?

这篇文章写的早
现在如果只是为了实现多程序同时放音,不再需要.asoundrc了
而且我现在的stardict是直接用alsa的了
我曾写过一个补丁,如果需要可以搜索我发过的贴
回复 支持 反对

使用道具 举报

发表于 2005-12-10 10:43:56 | 显示全部楼层
写的不错
赞一个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表