Puncte:3

Cum să redați un sunet dintr-un serviciu systemd pe Ubuntu?

drapel in

Încerc să redau un sunet de la un serviciu pe Ubuntu:

tim@timpc:~$ uname -a Linux timpc 5.4.0-91-generic #102-Ubuntu SMP Vin 5 noiembrie 16:31:28 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Iată definiția serviciului:

tim@timpc:~$ cat /etc/systemd/system/alarmd.service
# Datei /etc/systemd/system/alarmd.service
[Unitate]
Descriere=serviciu de alarmă
Vrea=sound.target
După=sunet.ţintă

[Serviciu]
Type=onehot
Environment="DISPLAY=:0"
Utilizator=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

[Instalare]
WantedBy=multi-user.target

Încep serviciul astfel:

sudo systemctl start alarmd.service

... și obțineți această ieșire:

tim@timpc:~$ journalctl -S astăzi -u alarmd.service
-- Jurnalele încep la miercuri 11.08.2021 09:41:59 CEST, se termină la 05.12.2021 16:28:06 CET. --
Dez 05 16:28:06 timpc systemd[1]: Se pornește serviciul alarmd...
Dez 05 16:28:06 timpc mplayer[13082]: MPlayer 1.3.0 (Debian), construit cu gcc-9 (C) 2000-2016 MPlayer Team
Dez 05 16:28:06 timpc mplayer[13082]: do_connect: nu s-a putut conecta la priză
Dez 05 16:28:06 timpc mplayer[13082]: connect: Nu există un astfel de fișier sau director
Dez 05 16:28:06 timpc mplayer[13082]: Nu s-a putut deschide suportul LIRC. Nu veți putea folosi telecomanda.
Dez 05 16:28:06 timpc mplayer[13082]: Tipul terminalului „necunoscut” nu este definit.
Dez 05 16:28:06 timpc mplayer[13082]: Redare /usr/local/share/alarmd/a.wav.
Dez 05 16:28:06 timpc mplayer[13082]: libavformat versiunea 58.29.100 (externă)
Dez 05 16:28:06 timpc mplayer[13082]: Format de fișier numai audio detectat.
Dez 05 16:28:06 timpc mplayer[13082]: Încarcă subtitrări în /usr/local/share/alarmd/
Dez 05 16:28:06 timpc mplayer[13082]: ====================================== ======================================
Dez 05 16:28:06 timpc mplayer[13082]: Deschidere decodor audio: [pcm] Decodor audio PCM necomprimat
Dez 05 16:28:06 timpc mplayer[13082]: AUDIO: 44100 Hz, 2 ch, s16le, 1411.2 kbit/100.00% (raport: 176400->176400)
Dez 05 16:28:06 timpc mplayer[13082]: Codec audio selectat: [pcm] afm: pcm (PCM necomprimat)
Dez 05 16:28:06 timpc mplayer[13082]: ====================================== ======================================
Dez 05 16:28:06 timpc mplayer[13082]: AO: [pulse] Init failed: Conexiune refuzată
Dez 05 16:28:06 timpc mplayer[13082]: Nu s-a putut inițializa driverul audio „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): Nu există un astfel de fișier sau director
Dez 05 16:28:06 timpc mplayer[13082]: [AO_ALSA] alsa-lib: pcm_dmix.c:1089:(snd_pcm_dmix_open) nu se poate deschide slave
Dez 05 16:28:06 timpc mplayer[13082]: [AO_ALSA] Eroare de deschidere redare: Nu există un astfel de fișier sau director
Dez 05 16:28:06 timpc mplayer[13082]: Nu s-a inițializat driverul audio „alsa”
Dez 05 16:28:06 timpc mplayer[13082]: [AO SDL] Samplerate: 44100Hz Canale: Stereo Format s16le
Dez 05 16:28:06 timpc mplayer[13082]: [AO SDL] utilizând driver audio aalib.
Dez 05 16:28:06 timpc mplayer[13082]: [AO SDL] Imposibil de deschis audio: Nu există dispozitiv audio disponibil
Dez 05 16:28:06 timpc mplayer[13082]: Nu s-a inițializat driverul audio „sdl:aalib”
Dez 05 16:28:06 timpc mplayer[13082]: Nu s-a putut deschide/inițializa dispozitivul audio -> fără sunet.
Dez 05 16:28:06 timpc mplayer[13082]: Audio: fără sunet
Dez 05 16:28:06 timpc mplayer[13082]: Video: nu video
Dez 05 16:28:06 timpc mplayer[13082]: Se iese... (Sfârșitul fișierului)
Dez 05 16:28:06 timpc systemd[1]: alarmd.service: Succeeded.
Dez 05 16:28:06 timpc systemd[1]: Serviciu de alarmd terminat.

Cum ar trebui să definesc serviciul astfel încât sunetul să fie redat?

Comanda în sine funcționează:

tim@timpc:~$ mplayer /usr/local/share/alarmd/a.wav
MPlayer 1.3.0 (Debian), construit cu gcc-9 (C) 2000-2016 MPlayer Team
do_connect: nu s-a putut conecta la soclu
connect: Nu există un astfel de fișier sau director
Nu s-a putut deschide suportul LIRC. Nu veți putea folosi telecomanda.

Se joacă /usr/local/share/alarmd/a.wav.
libavformat versiunea 58.29.100 (externă)
Format de fișier numai audio detectat.
Încarcă subtitrări în /usr/local/share/alarmd/
==================================================== =========================
Deschidere decodor audio: [pcm] Decodor audio PCM necomprimat
AUDIO: 44100 Hz, 2 canale, s16le, 1411,2 kbit/100,00% (raport: 176400->176400)
Codec audio selectat: [pcm] afm: pcm (PCM necomprimat)
==================================================== =========================
AO: [puls] 44100Hz 2ch s16le (2 octeți per probă)
Video: fără video
Se începe redarea...
A: 9,1 (09,1) din 233,0 (03:53,0) 0,0% 


MPlayer întrerupt de semnalul 2 în modul: play_audio
A: 9,2 (09,1) din 233,0 (03:53,0) 0,0% 

Se ies... (Ieșire)
Marc Vanhoomissen avatar
drapel in
Ați putea adăuga `WantedBy=sound.target` în secțiunea `[Instalare]`?
drapel in
„WantedBy=sound.target” nu ajută, din păcate
user10489 avatar
drapel in
Poate doriți să faceți din acesta un fișier systemd utilizator în contul dvs. în loc de un fișier la nivel de sistem, astfel încât să înceapă după ce sesiunea dvs. de conectare este disponibilă. Dacă doriți să redați sunet când niciun utilizator nu este conectat, răspunsul este diferit.
Puncte:3
drapel in

În versiunile actuale de Ubuntu, de obicei sunetul este gestionat de serverul audio cu impulsuri. Dacă rulați playere de sunet din sesiunea dvs. conectată, atunci playerul va găsi serverul prin variabilele de mediu XDG_RUNTIME_DIR și/sau PULSE_RUNTIME_PATH. Pentru ca un job în systemd (sau cron) să poată găsi serverul, va avea nevoie de aceste valori.

Din fericire, aceste valori sunt previzibile prin intermediul numelui de utilizator și nu ar trebui să se schimbe de la o conectare la alta dacă este același utilizator. (Setare AFIŞA a fost o încercare bună, dar nu variabila de sesiune potrivită.)

De exemplu, dacă user tim este primul utilizator de pe sistem, uid-ul utilizatorului este probabil 1000 (verificați /etc/passwd sau tastați id sau verificați valorile curente.) Adăugați la fișierul systemd următoarele: (Nu sunt sigur dacă unul dintre acestea este suficient de bun sau dacă aveți nevoie de ambele, poate depinde de versiune.)

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

Deoarece acest lucru funcționează oricum numai atunci când sunteți conectat, o alternativă la un fișier systemd ar fi să vă porniți serviciul într-un script care este pornit ca parte a sesiunii dvs. gnome. Dacă ați face acest lucru, nu ar trebui să vă faceți griji cu privire la variabilele de sesiune.

drapel in
Mulțumesc foarte mult!
Puncte:0
drapel cn

Aș comenta acest lucru, dar nu am suficiente puncte de reputație, așa că vă rog să mă scuzați că am lăsat un link fără un fel de explicație (chiar dacă acest lucru este descris ca un răspuns prost în ghidul de postare).

Acest link poate ajuta. Acesta explică ceva similar, care este modul în care puteți porni o aplicație sau un proces folosind systemd. dacă puteți găsi o comandă pentru redarea unui fișier de sunet și îl plasați systemd, veți putea obține ceea ce doriți.

link-ul este Aici (răspunsul de sus va oferi pașii necesari pentru a adăuga o comandă la systemd)

Rețineți că editarea systemd ar putea face computerul să nu poată porni dacă este făcută incorect, așa că poate testați această soluție mai întâi într-o mașină virtuală.

EDITARE: Puteți reda fișiere de sunet din bash folosind aceste comenzi.

drapel in
comanda în sine funcționează. Vedeți rezultatul din întrebarea mea.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.