azz*_*zid 5 sound cron pulseaudio alsa environment-variables
我最近将我的电脑升级到 Ubuntu 14.04。
升级后系统不再播放我通过 crontab 播放的几首歌曲。
crontab 行看起来像这样:
0 9 * * 1-5 /usr/bin/mpg123 -q /home/user/Music/song.mp3
Run Code Online (Sandbox Code Playgroud)
运行命令时,我没有从 cron 收到错误消息。如果我通过 SSH 手动运行该命令,歌曲将成功播放。
我在 crontab 中的命令前面加上了“env”,以便更好地掌握 cron 运行作业的环境:
0 9 * * 1-5 env; /usr/bin/mpg123 /home/user/Music/song.mp3
Run Code Online (Sandbox Code Playgroud)
这生成了以下输出:
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
Run Code Online (Sandbox Code Playgroud)
为了使我的 ssh 连接的交互式 shell 更像是在一个 cron 下运行,我取消了除指定环境变量之外的所有设置:
for a in `env | awk -F= '{ print $1 }' | grep -v "HOME\|LOGNAME\|PATH\|LANG\|SHELL\|PWD" | xargs`; do unset $a; done
Run Code Online (Sandbox Code Playgroud)
之后从 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.
Run Code Online (Sandbox Code Playgroud)
让我相信声音只是输出到错误的设备。
切换到 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
Run Code Online (Sandbox Code Playgroud)
但指定此设备确实按预期通过 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
Run Code Online (Sandbox Code Playgroud)
如何将该设备设置为系统默认值?(每当我拥有更丰富的环境时,似乎就是这样。)
或者,如何强制 mgp123 使用正确的设备?ALSA 设备plughw: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.
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
似乎与 /dev/snd 中的 pcmC0D?p-devices 匹配:
$ ls /dev/snd/ | egrep [013]p
pcmC0D0p
pcmC0D1p
pcmC0D3p
Run Code Online (Sandbox Code Playgroud)
但是使用它似乎对 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)
Run Code Online (Sandbox Code Playgroud)
我真的不明白 ALSA 和/或 PulseAudio 在这方面是什么。
两者似乎都不适用于有限的环境:
$ pactl list cards
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
$ alsamixer
Error opening terminal: unknown.
Run Code Online (Sandbox Code Playgroud)
这两个命令都使用“正常”环境变量集。
我下载并运行 alsa-info.sh,首先使用“正常”环境:
http://www.alsa-project.org/db/?f=e2be8ceb9ef289ff9ef95557396dd82b88f337e0
当我尝试在大多数环境变量未设置的情况下运行它时,出现错误。
设置后:
export TERM=xterm
Run Code Online (Sandbox Code Playgroud)
我让脚本再次运行。结果在这里:
http://www.alsa-project.org/db/?f=67fdd80bd55c76cd6dd30c981bf02fe66ba3d9d6
编辑:
对环境变量取消设置的进一步调查表明,我只需取消设置 XDG_RUNTIME_DIR 即可中断播放。
$ unset XDG_RUNTIME_DIR
Run Code Online (Sandbox Code Playgroud)
编辑2:
如果我放弃 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
Run Code Online (Sandbox Code Playgroud)
小智 7
所以,我只是将环境变量设置XDG_RUNTIME_DIR
为与我的工作 shell 相同,并且它可以工作。我找到了这个页面,因为我在尝试从 cron 作业中播放声音时遇到了同样的问题——mpg123 似乎认为它可以正常播放文件,但没有音频。设置该变量修复了它。
当您使用 ssh 连接时,尝试将您的用户添加到“音频”组中:
sudo usermod -aG audio username
重新启动并测试 alsamixer 是否正常,以便您可以设置音量:可能您必须按 F6 才能选择第三个设备。
然后,就我而言,我可以使用以下命令在远程电脑上读取通过 ssh 连接的声音,而无需使用 X 服务器:
cvlc --alsa-audio-device="hw:0,3" /usr/share/sounds/alsa/Front_Center.wav
mpg123 -a hw:0,3 Musique/test.mp3
请注意,在我的情况下,pulseaudio 在远程电脑上被禁用(不确定禁用是否有用,因为pulseaudio 是通过 X 和 lightdm session 启动的)。要验证pulseaudio是否已关闭且不会自动重生,请运行多次killall -9 pulseaudio
归档时间: |
|
查看次数: |
5573 次 |
最近记录: |