November 27, 2005
[Linux] dmix
複数のアプリケーションから同時に音を鳴らすために,今まで私は aRts や EsounD を用いていました.
Linux のサウンド出力に alsa を使っている場合は dmix がサウンドのミキシングを行ってくれると聞き,試してみました.
HOWTO ALSA sound mixer aka dmix - Gentoo Linux Wiki によると,This device can be dmix, which doesn't need to be configured as it exists by default.
とあるので,とりあえず何もせずにそのまま試してみることにします.
サウンドデーモンを一通り kill した後,alsaplayer を 2 個起動して両方から音を鳴らすテストをしてみました.
$ alsaplayer -o alsa -d default hoge.mp3 & (hoge.mp3 が鳴り始めるまで待つ) $ alsaplayer -o alsa -d default hoge.mp3 &
ちゃんと 2 個同時に再生されました.出力先が default でも問題ないようです.
次に alsaplayer を停止し,MPlayer から音を鳴らしてみます.
$ mplayer -ao alsa hoge.avi MPlayer 1.0pre7try2-3.3.6 (C) 2000-2005 MPlayer Team (中略) alsa-init: 1 soundcard found, using: default alsa: 44100 Hz/2 channels/4 bpf/60208 bytes buffer/Signed 16 bit Little Endian AO: [alsa] 44100Hz 2ch s16le (2 bps) Building audio filter chain for 44100Hz/2ch/s16le -> 44100Hz/2ch/s16le... (中略) [mpeg4 @ 0x863b0e0]frame skip 8t: 0.000 1/ 1 ??% ??% ??,?% 0 0 78% [mpeg4 @ 0x863b0e0]frame skip 8t: -0.003 2/ 2 ??% ??% ??,?% 0 0 78% alsa-space: xrun of at least 0.106 msecs. resetting stream?,?% 0 0 99% alsa-space: xrun of at least 0.068 msecs. resetting stream?,?% 2 0 99% alsa-space: xrun of at least 0.106 msecs. resetting stream0.5% 3 0 99% alsa-space: xrun of at least 0.062 msecs. resetting stream0.5% 5 0 99% alsa-space: xrun of at least 0.058 msecs. resetting stream0.5% 6 0 99% ...
フレームレートがもの凄く低下して再生されます.何故でしょう.とりあえず出力先を default から dmix に切り替えてみます.
$ mplayer -ao alsa:device=dmix hoge.avi MPlayer 1.0pre7try2-3.3.6 (C) 2000-2005 MPlayer Team (中略) AUDIO: 22050 Hz, 1 ch, s16le, 352.8 kbit/100.00% (ratio: 44100->44100) (中略) Checking audio filter chain for 22050Hz/1ch/s16le -> 22050Hz/2ch/s16le... AF_pre: 22050Hz/1ch/s16le alsa-init: 1 soundcard found, using: dmix alsa: 48000 Hz/2 channels/4 bpf/65536 bytes buffer/Signed 16 bit Little Endian AO: [alsa] 48000Hz 2ch s16le (2 bps) Building audio filter chain for 22050Hz/1ch/s16le -> 48000Hz/2ch/s16le... (中略) A: 21.4 V: 42.4 A-V:-21.014 ct: -4.129 1272/1272 6% 0% 0.1% 34 0 48%
一番下の強調箇所を観ると明らかですが,音声と映像がズレています.映像の方が速く再生されています.
これを解決するべく,HOWTO ALSA sound mixer aka dmix - Gentoo Linux Wikiにあるように 44,100kHz にリサンプリングしてから再生してみました.ここではコマンドラインからリサンプラの使用を指示しました.
$ mplayer -ao alsa:device=dmix -af resample=44100 hoge.avi MPlayer 1.0pre7try2-3.3.6 (C) 2000-2005 MPlayer Team (中略) AUDIO: 22050 Hz, 1 ch, s16le, 352.8 kbit/100.00% (ratio: 44100->44100) (中略) Checking audio filter chain for 22050Hz/1ch/s16le -> 22050Hz/2ch/s16le... AF_pre: 44100Hz/1ch/s16le alsa-init: 1 soundcard found, using: dmix alsa: 48000 Hz/2 channels/4 bpf/65536 bytes buffer/Signed 16 bit Little Endian AO: [alsa] 48000Hz 2ch s16le (2 bps) Building audio filter chain for 22050Hz/1ch/s16le -> 48000Hz/2ch/s16le... (中略) A: 363.7 V: 363.7 A-V: -0.027 ct: -9.155 10912/10912 7% 0% 0.6% 8 0 45%
音と映像のズレがなくなりました.めでたしめでたし.
とりあえず全てのアプリケーションの音声出力を dmix に切り替えるように設定しました.これでサウンドデーモンが不要になりました.
なお,~/.asoundrc は作っていません.しばらく dmix を使ってみます.