如何在 Ubuntu 上播放来自 systemd 服务的声音?

Posted

技术标签:

【中文标题】如何在 Ubuntu 上播放来自 systemd 服务的声音?【英文标题】:How to play a sound from a systemd service on Ubuntu? 【发布时间】:2021-12-05 15:33:53 【问题描述】:

我尝试从 Ubuntu 上的服务中播放声音:

tim@timpc:~$ uname -a Linux timpc 5.4.0-91-generic #102-Ubuntu SMP Fri 2021 年 11 月 5 日 16:31:28 UTC x86_64 x86_64 x86_64 GNU/Linux

这里是服务定义:

tim@timpc:~$ cat /etc/systemd/system/alarmd.service
# Datei /etc/systemd/system/alarmd.service
[Unit]
Description=alarmd service
Wants=sound.target
After=sound.target

[Service]
Type=oneshot
Environment="DISPLAY=:0"
User=tim
;ExecStart=/home/tim/Dokumente/super/alarmd/build/release/dist/alarmd --sound /usr/local/share/alarmd/a.wav
ExecStart=mplayer /usr/local/share/alarmd/a.wav

[Install]
WantedBy=multi-user.target

我这样启动服务:

sudo systemctl start alarmd.service

...得到这个输出:

tim@timpc:~$ journalctl -S today -u alarmd.service
-- Logs begin at Wed 2021-08-11 09:41:59 CEST, end at Sun 2021-12-05 16:28:06 CET. --
Dez 05 16:28:06 timpc systemd[1]: Starting alarmd service...
Dez 05 16:28:06 timpc mplayer[13082]: MPlayer 1.3.0 (Debian), built with gcc-9 (C) 2000-2016 MPlayer Team
Dez 05 16:28:06 timpc mplayer[13082]: do_connect: could not connect to socket
Dez 05 16:28:06 timpc mplayer[13082]: connect: No such file or directory
Dez 05 16:28:06 timpc mplayer[13082]: Failed to open LIRC support. You will not be able to use your remote control.
Dez 05 16:28:06 timpc mplayer[13082]: Terminal type `unknown' is not defined.
Dez 05 16:28:06 timpc mplayer[13082]: Playing /usr/local/share/alarmd/a.wav.
Dez 05 16:28:06 timpc mplayer[13082]: libavformat version 58.29.100 (external)
Dez 05 16:28:06 timpc mplayer[13082]: Audio only file format detected.
Dez 05 16:28:06 timpc mplayer[13082]: Load subtitles in /usr/local/share/alarmd/
Dez 05 16:28:06 timpc mplayer[13082]: ==========================================================================
Dez 05 16:28:06 timpc mplayer[13082]: Opening audio decoder: [pcm] Uncompressed PCM audio decoder
Dez 05 16:28:06 timpc mplayer[13082]: AUDIO: 44100 Hz, 2 ch, s16le, 1411.2 kbit/100.00% (ratio: 176400->176400)
Dez 05 16:28:06 timpc mplayer[13082]: Selected audio codec: [pcm] afm: pcm (Uncompressed PCM)
Dez 05 16:28:06 timpc mplayer[13082]: ==========================================================================
Dez 05 16:28:06 timpc mplayer[13082]: AO: [pulse] Init failed: Connection refused
Dez 05 16:28:06 timpc mplayer[13082]: Failed to initialize audio driver 'pulse'
Dez 05 16:28:06 timpc mplayer[13082]: [AO_ALSA] alsa-lib: pcm_hw.c:1715:(snd_pcm_hw_open) open '/dev/snd/pcmC0D0p' failed (-2): No such file or directory
Dez 05 16:28:06 timpc mplayer[13082]: [AO_ALSA] alsa-lib: pcm_dmix.c:1089:(snd_pcm_dmix_open) unable to open slave
Dez 05 16:28:06 timpc mplayer[13082]: [AO_ALSA] Playback open error: No such file or directory
Dez 05 16:28:06 timpc mplayer[13082]: Failed to initialize audio driver 'alsa'
Dez 05 16:28:06 timpc mplayer[13082]: [AO SDL] Samplerate: 44100Hz Channels: Stereo Format s16le
Dez 05 16:28:06 timpc mplayer[13082]: [AO SDL] using aalib audio driver.
Dez 05 16:28:06 timpc mplayer[13082]: [AO SDL] Unable to open audio: No available audio device
Dez 05 16:28:06 timpc mplayer[13082]: Failed to initialize audio driver 'sdl:aalib'
Dez 05 16:28:06 timpc mplayer[13082]: Could not open/initialize audio device -> no sound.
Dez 05 16:28:06 timpc mplayer[13082]: Audio: no sound
Dez 05 16:28:06 timpc mplayer[13082]: Video: no video
Dez 05 16:28:06 timpc mplayer[13082]: Exiting... (End of file)
Dez 05 16:28:06 timpc systemd[1]: alarmd.service: Succeeded.
Dez 05 16:28:06 timpc systemd[1]: Finished alarmd service.

我应该如何定义服务以播放声音?

命令本身有效:

tim@timpc:~$ mplayer /usr/local/share/alarmd/a.wav
MPlayer 1.3.0 (Debian), built with gcc-9 (C) 2000-2016 MPlayer Team
do_connect: could not connect to socket
connect: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.

Playing /usr/local/share/alarmd/a.wav.
libavformat version 58.29.100 (external)
Audio only file format detected.
Load subtitles in /usr/local/share/alarmd/
==========================================================================
Opening audio decoder: [pcm] Uncompressed PCM audio decoder
AUDIO: 44100 Hz, 2 ch, s16le, 1411.2 kbit/100.00% (ratio: 176400->176400)
Selected audio codec: [pcm] afm: pcm (Uncompressed PCM)
==========================================================================
AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A:   9.1 (09.1) of 233.0 (03:53.0)  0.0% 


MPlayer interrupted by signal 2 in module: play_audio
A:   9.2 (09.1) of 233.0 (03:53.0)  0.0% 

Exiting... (Quit)

【问题讨论】:

您能在[Install] 部分添加WantedBy=sound.target 吗? 'WantedBy=sound.target' 不幸的是没有帮助 您可能希望在您的帐户中将此作为用户 systemd 文件而不是系统级文件,以便在您的登录会话可用后启动。如果你想在没有用户登录的情况下播放声音,答案就不同了。 【参考方案1】:

在当前版本的 Ubuntu 中,声音通常由脉冲音频服务器处理。如果您从登录会话运行声音播放器,则播放器将通过环境变量XDG_RUNTIME_DIR 和/或PULSE_RUNTIME_PATH 找到服务器。为了使 systemd(或 cron)中的作业能够找到服务器,它需要这些值。

幸运的是,这些值可以通过用户名预测,如果是同一用户,则不应从一个登录更改为下一个登录。 (设置DISPLAY 是一个很好的尝试,但不是正确的会话变量。)

例如,如果用户 tim 是系统上的第一个用户,则用户的 uid 可能是 1000(检查 /etc/passwd 或键入 id 或检查当前值。) 将以下内容添加到您的 systemd 文件中:(不确定其中一个是否足够好,或者您是否需要两者,它可能取决于版本。)

Environment="XDG_RUNTIME_DIR=/run/user/1000"
Environment="PULSE_RUNTIME_PATH=/run/user/1000/pulse/"

由于这仅在您登录时才有效,因此 systemd 文件的替代方法是在作为 gnome-session 的一部分启动的脚本中启动您的服务。如果你这样做了,你根本不需要担心会话变量。

【讨论】:

非常感谢!【参考方案2】:

我会对此发表评论,但我没有足够的声望点,所以请原谅我在没有任何解释的情况下留下链接(即使这在发布指南中被描述为错误的答案)。

此链接可能会有所帮助。它解释了类似的东西,即如何使用 systemd 启动应用程序或进程。如果你能找到一个播放声音文件的命令并把它放到systemd中,你就能实现你想要的。

链接是here(上面的答案将提供向 systemd 添加命令所需的步骤)

请记住,如果操作不正确,编辑 systemd 可能会使您的计算机无法启动,因此不妨先在虚拟机中测试此解决方案。

编辑:您可以使用these 命令从 bash 播放声音文件。

【讨论】:

命令本身有效。请参阅我的问题中的输出。

以上是关于如何在 Ubuntu 上播放来自 systemd 服务的声音?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 ubuntu docker 容器上使用 systemd [关闭]

如何为播放应用程序创建systemd单元文件

如何在android jni中播放Spotify媒体

如何在 Python 3.5.3 上播放来自互联网广播的流式音频

Ubuntu对systemd的使用

如何在 Ubuntu 14.04 中使用 systemctl