Ubuntu 14.04 和从 cron 播放歌曲

Ubuntu 14.04 和从 cron 播放歌曲

我最近将我的电脑升级到 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 连接的交互式 shell 更像 cron 所运行的 shell,我取消了除指定的环境变量之外的所有设置:

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 设备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.

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 设备匹配:

$ 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=e2be8ceb9ef289ff9ef95557396dd82b88f337e0

当我尝试在大多数环境变量未设置的情况下运行它时,出现了错误。

设置后:

export TERM=xterm

我再次运行脚本。结果如下:

http://www.alsa-project.org/db/?f=67fdd80bd55c76cd6dd30c981bf02fe66ba3d9d6

编辑:

对环境变量取消设置的进一步调查表明,我只需要取消设置 XDG_RUNTIME_DIR 即可中断播放。

$ unset XDG_RUNTIME_DIR

编辑2:

如果我放弃 mgp123 而选择 cvlc,那么通过 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

答案1

因此,我只需将环境变量设置XDG_RUNTIME_DIR为与工作 shell 中相同的值,它就可以正常工作。我找到这个页面是因为我有这个相同的尝试通过 cron 作业播放声音时出现问题 - mpg123 似乎认为它可以正常播放文件,但没有音频。设置该变量可以修复此问题。

答案2

尽管使用了这种导出:

# paplay needs environment variable exported:
export XDG_RUNTIME_DIR="/run/user/1000"

它不起作用。

经过数月的研究,仍未找到解决方案。

无奈之下,尝试了以下方法,并且成功了:

在 contab 中输入以下内容

# Terminal command: crontab -e
# Detect the name of the display in use
display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
user=$(who | grep '('$display')' | awk '{print $1}') # the user of the display 
uid=$(id -u $user) #Detect the id of the user

XDG_RUNTIME_DIR=/run/user/${uid}

*/5 * * * * sh /root/.play_sound.sh

接下来创建.play_sound.sh

/root/.play_sound.sh

display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
user=$(who | grep '('$display')' | awk '{print $1}') # the user of the display 
uid=$(id -u $user) #Detect the id of the user

su - $user -c "paplay /usr/share/sounds/freedesktop/stereo/complete.oga"

希望这可以帮助。

答案3

当您使用 ssh 连接时,尝试将您的用户添加到“音频”组中:
sudo usermod -aG audio username
重新启动并测试 alsamixer 是否正常,这样您就可以设置音量:可能您必须按 F6 来选择第 3 个设备。

然后,就我而言,我可以在不使用 X 服务器的情况下,在远程 PC 上读取通过 ssh 连接的声音,方法如下:

  • cvlc(随 vlc-nox 包提供):
    cvlc --alsa-audio-device="hw:0,3" /usr/share/sounds/alsa/Front_Center.wav
    如果不行,请将 hw:0,3 更改为 hw:0,0 或 hw:0,1
    在我的情况下,它也可以通过 crontab 工作。
  • mpg123:这个作品也通过ssh启动:
    mpg123 -a hw:0,3 Musique/test.mp3

请注意,在我的情况下,pulseaudio 在远程电脑上被禁用(不确定禁用是否有用,因为 pulseaudio 是通过 X 和 lightdm 会话启动的)。要验证 pulseaudio 是否已关闭且未自动重生,请运行多次killall -9 pulseaudio

相关内容