最近、コンピューターをUbuntu 14.04にアップグレードしました。
アップグレード後、システムはcrontab経由で再生していた数曲を再生しなくなりました。
Crontab行は次のようになります。
0 9 * * 1-5 /usr/bin/mpg123 -q /home/user/Music/song.mp3
コマンドの実行時にcronからエラーが発生しません。 SSH経由でコマンドを手動で実行すると、曲は正常に再生されます。
Crontabのコマンドの先頭に「env」を付けて、cronがジョブを実行する環境を把握します。
0 9 * * 1-5 env; /usr/bin/mpg123 /home/user/Music/song.mp3
これにより、次の出力が生成されました。
HOME=/home/user
LOGNAME=user
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
Shell=/bin/sh
PWD=/home/user
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
version 1.16.0; written and copyright by Michael Hipp and others
free software (LGPL) without any warranty but with best wishes
Directory: /home/user/Music/
Playing MPEG stream 1 of 1: song.mp3 ...
MPEG 1.0 layer III, 320 kbit/s, 44100 Hz stereo
Comment: 00000000 00000210 00000AA0 000000000058C5D0 00000000 00506FD7 00000000 00000000 00000000 00000000 00000000 00000000
[2:11] Decoding of song.mp3 finished
私のssh接続の対話型シェルを1つのcronが実行されているようにするには、指定された環境変数以外のすべての設定を解除します。
for a in `env | awk -F= '{ print $1 }' | grep -v "HOME\|LOGNAME\|PATH\|LANG\|Shell\|PWD" | xargs`; do unset $a; done
そして、crontabからのコピーと貼り付けを変更すると、音が出なくなります。ただし、プログラムはファイルを再生するようです:
$ /usr/bin/mpg123 /home/user/Music/song.mp3
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
version 1.16.0; written and copyright by Michael Hipp and others
free software (LGPL) without any warranty but with best wishes
Directory: /home/user/Music/
Playing MPEG stream 1 of 1: song.mp3 ...
MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo
[2:51] Decoding of song.mp3 finished.
音が間違ったデバイスに出力されているだけだと信じさせられます。
次のaplayに切り替えると音が出ません。
$ aplay /usr/share/sounds/alsa/Front_Center.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
ただし、このデバイスを指定すると、意図したとおりにHDMIで再生されます。
$ aplay -D plughw:CARD=NVidia,DEV=3 /usr/share/sounds/alsa/Front_Center.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
そのデバイスをシステムのデフォルトとして設定するにはどうすればよいですか? (私がより豊かな環境を持っているときはいつでもそうです。)
または、mgp123に正しいデバイスを使用させるにはどうすればよいですか? ALSA-deviceplughw:CARD = NVidia、DEV = 3は/ devのデバイスと相関していますか?
mpg123では、次のように特定のデバイスを指定できます。
-a dev, --audiodevice dev
Specify the audio device to use. The default is system-dependent (usually /dev/audio or /dev/dsp). Use this option if you have multiple audio
devices and the default is not what you want.
Alsaのplughwデバイス:
$ aplay -L | grep plughw -A2
plughw:CARD=NVidia,DEV=0
HDA NVidia, ALC889A Analog
Hardware device with all software conversions
plughw:CARD=NVidia,DEV=1
HDA NVidia, ALC889A Digital
Hardware device with all software conversions
plughw:CARD=NVidia,DEV=3
HDA NVidia, HDMI 0
Hardware device with all software conversions
/ dev/sndのpcmC0D?p-devicesと一致するようです:
$ ls /dev/snd/ | egrep [013]p
pcmC0D0p
pcmC0D1p
pcmC0D3p
しかし、それを使用してもmpg123の助けにはならないようです:
$ /usr/bin/mpg123 -q -a /dev/snd/pcmC0D3p /home/user/Music/song.mp3
[oss.c:129] error: Can't reset audio!
[mpg123.c:690] error: ...in decoding next frame: Unable to set up output format! (code 1)
これに関してALSAやPulseAudioが何を意味するのか、私にはよくわかりません。
どちらも限られた環境では機能しないようです:
$ pactl list cards
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
$ alsamixer
Error opening terminal: unknown.
両方のコマンドは、「通常の」環境変数セットで機能します。
最初に「通常の」環境でalsa-info.shをダウンロードして実行しました。
http://www.alsa-project.org/db/?f=e2be8ceb9ef289ff9ef95557396dd82b88f337e
ほとんどの環境変数を設定せずに実行しようとすると、エラーが発生しました。
設定後:
export TERM=xterm
スクリプトを再度実行しました。ここの結果:
http://www.alsa-project.org/db/?f=67fdd80bd55c76cd6dd30c981bf02fe66ba3d9d6
編集:
環境変数の設定解除をさらに調査すると、再生を中断するにはXDG_RUNTIME_DIRの設定を解除するだけで済みます。
$ unset XDG_RUNTIME_DIR
EDIT2:
Cvlcのmgp123を放棄した場合、次のようにcrontabで再生すると音がします。
0 9 * * 1-5 /usr/bin/cvlc -q --alsa-audio-device="hw:0,3" --play-and-exit /home/user/Music/song.mp3 2> /dev/null
Ssh connectionを使用する際に、「audio」グループにユーザーを追加してみてください。Sudo usermod -aG audio username
再起動し、alsamixerが正常であることをテストして、ボリュームを設定できるようにします。おそらく、F6を押して3番目のデバイスを選択する必要があります。
次に、私の場合、XサーバーなしでリモートPCでsshで接続されたサウンドを読み取ることができます:
cvlc --alsa-audio-device="hw:0,3" /usr/share/sounds/alsa/Front_Center.wav
mpg123 -a hw:0,3 Musique/test.mp3
私の場合、pulseaudioはリモートPCで無効になっていることに注意してください(pulseaudioはXおよびlightdmセッションを介して開始されるため、無効にすることは有用ではありません)。 pulseaudioがオフで自動再スポーンではないことを確認するには、さまざまな時間を実行しますkillall -9 pulseaudio
そのため、環境変数XDG_RUNTIME_DIR
を作業中のシェルと同じように設定するだけで、動作します。このページを見つけたのは、同じ cronジョブから再生するサウンドを取得しようとしたときに問題が発生したためです-mpg123は、ファイルは正常に再生されると考えていますが、オーディオはありません。その変数を設定すると修正されました。