Je voudrais enregistrer la sortie d'un programme avec PulseAudio en utilisant le script en ligne de commande/bash. Il est important de ne pas enregistrer tous les résultats, mais uniquement ceux d'un programme spécifique.
Je pensais que je devrais créer un nouveau null-sink et ensuite déplacer la sortie du programme vers ce nouvel évier. Than tell parec utiliser ce moniteur spécifique pour enregistrer.
La première étape ressemblerait à ceci:
pactl load-module module-null-sink sink_name=Steam
Mais comment déplacer maintenant la sortie du programme vers cet évier?
Et comment enregistrer le puits spécifique avec un script bash?
Essayez quelque chose comme ça:
Dans un terminal entrez
pacmd
(c’est le CLI du serveur PulseAudio) puis utilisez
list-sink-inputs
(où vous obtenez les index des entrées en cours) Maintenant, trouvez l'index de votre entrée. Désormais appelé $ INDEX
la partie scriptable est:
pactl load-module module-null-sink sink_name=Steam
pactl move-sink-input $INDEX Steam
parec -d Steam.monitor | oggenc -b 192 -o Steam.ogg --raw -
Améliorer réponse Waschtl de ce fil afin que vous puissiez ÉCOUTER ET ENREGISTRER le son de l'application:
Premièrement, nous recherchons notre sortie par défaut et mettons son nom de récepteur dans $DEFAULT_OUTPUT
:
$ pacmd list-sinks | grep -A1 "* index"
* index: 1
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
$ DEFAULT_OUTPUT=$(pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+")
$ echo $DEFAULT_OUTPUT
alsa_output.pci-0000_00_1b.0.analog-stereo
Ensuite, nous créons un puits combiné qui n'a qu'un seul esclave: $ DEFAULT_OUTPUT . Le son généré par l'application (source) sera transmis au récepteur esclave (c.-à-d. Une sortie réelle), et nous l'enregistrerons également. Il diffère de null null où le son source n'est pas transmis.
$ pactl load-module module-combine-sink \
sink_name=record-n-play slaves=$DEFAULT_OUTPUT \
sink_properties=device.description="Record-and-Play"
sink_properties
est facultatif et peut générer des problèmes si vous utilisez des espaces dans le nom de la description.
Ensuite, nous pourrions utiliser la commande pactl move-sink-input ...
de réponse Waschtl (avec record-n-play au lieu de Steam ) mais l'interface utilisateur graphique pavucontrol
est plus simple (et idéale pour la vérification/le dépannage):
$ Sudo apt-get install pavucontrol
$ pavucontrol &
Ensuite, nous jouons du son dans l'application que nous voulons enregistrer. Dans pavucontrol
name__ Playback onglet, nous sélectionnons dans la liste déroulante des applications: "Record-and-Play" .
Enfin, nous sommes bien pour enregistrer et écouter en même temps! ( lame exemple mp3, exécuté au premier plan)
$ parec --format=s16le -d record-n-play.monitor | \
lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3"
Ou nous pouvons enregistrer en arrière-plan et nous arrêter à tout moment:
$ parec --format=s16le -d record-n-play.monitor | \
lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3" \
> /dev/null &1>/dev/null
$ killall -q parec lame
NB:
pulseaudio -k
fonctionne très bien pour tout réinitialiser aux valeurs par défaut de la session.pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2
.EDIT: Attention, puisque Ubuntu 18 (peut-être 17 aussi), le récepteur combiné tend à devenir le périphérique de sortie système par défaut, au lieu du périphérique de sortie réel. Ainsi, lorsque vous modifiez le volume à l'aide de l'icône de son de la barre d'état système, cela a un impact sur le son que vous enregistrez. Solution de contournement: après avoir créé le récepteur combiné, ouvrez pavucontrol
dans l'onglet Output. Sélectionnez "View: Virtual Output Devices" (Afficher: périphériques de sortie virtuels) et réinitialisez le volume sonore du récepteur combiné à 100%. Puis sélectionnez "Affichage: Périphériques de sortie matérielle" et appuyez sur l'icône verte "Définir comme alternative" sur le périphérique de sortie réel.
La réponse de @ Waschtl est fantastique. @ixtmixilix a demandé à propos de la restauration audio normale une fois l'enregistrement terminé. Voici le moyen le plus simple que je connaisse:
Installez et exécutez l'interface graphique pavucontrol
. Vous devriez voir votre application de sortie audio et son compteur de volume sous le Playback onglet là-bas. Il y aura un bouton à côté de lui indiquant qu'il joue sur Null Output. Cliquez dessus et changez-le en votre sortie audio ordinaire, Stéréo analogique audio intégré dans mon cas.
Voici une capture d'écran de ce que vous recherchez:
Vous pouvez également utiliser cette approche pour configurer votre enregistrement ultérieurement, après avoir exécuté la commande load-module
dans la réponse de @ Waschtl pour créer le récepteur.
Améliorant encore la réponse de KrisWebDev , si vous voulez que record-n-play soit toujours disponible, commencez par trouver le résultat par défaut:
pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+"
qui produira quelque chose comme:
alsa_output.pci-0000_00_1b.0.analog-stereo
Ensuite, créez un fichier ~/.config/Pulse/default.pa
:
.include /etc/Pulse/default.pa
load-module module-combine-sink sink_name=record-n-play slaves=alsa_output.pci-0000_00_1b.0.analog-stereo sink_properties=device.description="Record-and-Play"
Veuillez remplacer alsa_output.pci-0000_00_1b.0.analog-stereo
par le résultat obtenu avec la commande pacmd
. Pulse ne lit pas le fichier de configuration par défaut lorsqu'un fichier de configuration personnalisé existe. C'est pourquoi la première ligne ci-dessus inclut le fichier de configuration par défaut. De cette façon, pulseaudio charge toujours la configuration par défaut en premier.
Exécutez pulseaudio -k
pour supprimer l'instance actuelle de pulseaudio afin qu'une nouvelle soit démarrée avec la nouvelle configuration.
Si à un moment quelconque vous souhaitez annuler les modifications, supprimez simplement le fichier ~/.config/Pulse/default.pa
et exécutez pulseaudio -k
.
Si vous voulez que record-n-play soit le puits par défaut pour toutes les sorties, vous pouvez le faire en ajoutant une autre ligne à la fin de ~/.config/Pulse/default.pa
:
set-default-sink record-n-play
Pour les programmes sur lesquels pulseaudio possède déjà des informations stockées, il mémorise le dernier périphérique de sortie utilisé. Vous devrez donc reconfigurer manuellement ceux-ci en utilisant l'une des méthodes décrites dans la réponse de KrisWebDev.
J'ai créé ce script bash à partir des réponses fournies par les réponses @Waschtl et @KrisWebDev.
Disponible ici: https://Gist.github.com/ramast/4be3314bc73f28f55e3604497188b007
Comment utiliser?
$ ./Pulse-recorder.bash
index: 225
application.name = "ALSA plug-in [mplayer]"
module-stream-restore.id = "sink-input-by-application-name:ALSA plug-in [mplayer]"
Choose recording index: 225
temp.mp3 file already exist, replace (y/n)? y
J'ai créé un script python proposant des améliorations par rapport à l'ancien. https://Gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f
Comment utiliser?
$ ./Pulse-recorder.py
1 - ALSA plug-in [mplayer]
2 - AudioIPC Server
Please enter a number: 1
Your selection was: ALSA plug-in [mplayer]
Please press enter when you are ready to start
Lorsque vous appuyez sur enter, l'enregistrement commence immédiatement. si au moment où vous appuyez sur enter, l'application était déjà arrêtée (c'est-à-dire que vous avez fermé mplayer par exemple), le script attendra que l'application réapparaisse et commence à enregistrer.
Le seul inconvénient de ce script (par rapport à celui d'origine) est que si la liste contient deux entrées portant le même nom, le script ne se comportera pas correctement. Par exemple
$ ./Pulse-recorder.py
1 - ALSA plug-in [mplayer]
2 - ALSA plug-in [mplayer]