web-dev-qa-db-fra.com

Enregistrer la sortie d'un programme avec PulseAudio

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?

48
user5950

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 -

Explications:

  • La première commande ajoutera un null-sink comme vous le saviez déjà.
  • La deuxième commande déplace l’entrée du récepteur de votre récepteur audio standard vers Steam
  • La troisième commande enregistre le moniteur du périphérique Steam (-d) et place la sortie (flux-wave brut) dans oggenc, qui encode ce flux dans un fichier oga. (pour mp3 utiliser boiteux)
51
Waschtl

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 pavucontrolest 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 pavucontrolname__ 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:

  • Pour tout annuler ou recommencer la procédure: Supprimez ou réinitialisez les puits en utilisant cette réponse . pulseaudio -k fonctionne très bien pour tout réinitialiser aux valeurs par défaut de la session.
  • Si nous modifions la sortie par défaut dans les paramètres son du système, le paramètre de lecture de l'application personnalisée sera écrasé et nous devrons revenir dans pavucontrol pour le rétablir dans l'interface combinée.
  • Pour pouvoir écouter le son à partir de plusieurs interfaces "réelles" (par exemple, écouteurs, sortie HDMI, etc.), nous devons inclure toutes les sorties "réelles" que nous pouvons utiliser pour écouter, comme record-n-play esclaves slink, comme: 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 pavucontroldans 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.

26
KrisWebDev

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:

screenshot

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.

9
Jack O'Connor

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.

6
Jonas Berlin

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

Nouvelle version

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]
2
Ramast