67 votes

Enregistrer la sortie d'un programme avec PulseAudio

Je voudrais enregistrer une sortie d'un programme avec PulseAudio en utilisant la ligne de commande/bash script. Il est important de ne pas enregistrer toute la sortie, mais seulement la sortie d'un programme spécifique.

Je pensais que je devais créer un nouveau puits nul et déplacer la sortie du programme vers ce nouveau puits. Puis dire parec d'utiliser ce moniteur spécifique pour enregistrer.

La première étape serait quelque chose comme ceci :

pactl load-module module-null-sink sink_name=steam

Mais comment déplacer la sortie du programme maintenant vers cet évier ?
Et comment enregistrer l'évier spécifique avec un bash script ?

72voto

havanki4j Points 908

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 indices des entrées en cours) Trouvez maintenant l'index de votre entrée. Il s'agit maintenant de $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 sink de votre standard-audio-sink vers steam
  • La troisième commande enregistre le moniteur de l'appareil steam (-d) et met la sortie (raw-wave-stream) dans oggenc, qui encode ce flux d'ondes dans un fichier oga. (pour une utilisation mp3 boiteuse)

44voto

KrisWebDev Points 1342

Amélioration de Réponse de Waschtl de ce fil pour que vous puissiez ÉCOUTER ET ENREGISTRER le son de l'application :

D'abord, nous cherchons notre sortie par défaut et mettons son nom de puits 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 évier combiné qui n'a qu'un seul esclave : $DEFAULT_OUTPUT . Le son généré par l'application (source) sera acheminé vers le récepteur esclave (c'est-à-dire la sortie réelle), et nous l'enregistrerons également. C'est différent d'un puits nul 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 boguer si vous utilisez des espaces dans le nom de la description.

Ensuite, nous pourrions utiliser pactl move-sink-input ... commande de Réponse de Waschtl (avec enregistrement et lecture au lieu de vapeur ) mais l'interface graphique pavucontrol est plus simple (et idéal pour la vérification et le dépannage) :

$ sudo apt-get install pavucontrol
$ pavucontrol &

Ensuite, nous jouons un son dans l'application que nous voulons enregistrer. Dans pavucontrol Playback nous sélectionnons dans la liste déroulante des applications : "Record-and-Play" .

Enfin, on est bon pour enregistrer et écouter en même temps ! ( boiteux exemple mp3, exécuté en avant-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 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 démêler ou réessayer la procédure : Supprimez ou réinitialisez les éviers 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 de son du système, le paramètre de lecture de l'application personnalisée sera écrasé et nous devrons retourner dans pavucontrol pour le régler à nouveau sur l'interface combinée.
  • Pour pouvoir écouter le son à partir de plusieurs interfaces "réelles" (par exemple un casque, une sortie HDMI, etc...), nous devons inclure toutes les sorties "réelles" que nous pouvons utiliser pour écouter, comme enregistrement et lecture des esclaves rampants, comme : pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2 .

EDIT : Attention, depuis Ubuntu 18 (peut-être 17 aussi), le puits combiné a tendance à 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 en utilisant l'icône du son dans la barre d'état système, cela a un impact sur le son de votre enregistrement. Solution : Après avoir créé le puits combiné, ouvrez pavucontrol dans l'onglet Sortie. Sélectionnez "View : Virtual Output Devices" et réinitialisez le volume sonore de l'évier combiné à 100%. Sélectionnez ensuite "View : Périphériques de sortie matériels" et cliquez sur l'icône verte "Définir comme alternative" sur le périphérique de sortie réel.

10voto

Jack O'Connor Points 799

La réponse de @Waschtl est fantastique. @ixtmixilix a posé une question sur la restauration de l'audio régulier après la fin de l'enregistrement. Voici le moyen le plus simple que je connaisse :

Installez et exécutez le pavucontrol GUI. Vous devriez voir votre application de sortie audio et son indicateur de volume sous la rubrique Playback onglet là-dedans. Il y aura un bouton à côté qui montrera qu'il est en train de jouer sur Sortie nulle . Cliquez dessus et changez-la pour votre sortie audio ordinaire, Audio intégré Stéréo analogique dans mon cas.

Voici une capture d'écran de ce que vous recherchez :

screenshot

Vous pouvez également utiliser cette approche pour paramétrer votre enregistrement à l'avenir, après avoir exécuté la commande load-module dans la réponse de @Waschtl pour créer l'évier.

7voto

Jonas Berlin Points 171

Amélioration de KrisWebDev Si vous voulez que l'enregistrement et la lecture soient toujours disponibles, trouvez d'abord la sortie par défaut :

pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+"

ce qui donnera 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 avec la sortie que vous avez obtenue de la pacmd commande. 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.

実行 pulseaudio -k pour tuer l'instance actuelle de pulseaudio afin d'en démarrer une nouvelle avec la nouvelle configuration.

Si, à tout moment, vous souhaitez annuler les modifications apportées ici, il suffit de supprimer l'option ~/.config/pulse/default.pa et exécutez pulseaudio -k .

Si vous voulez que le record-n-play soit le puits par défaut pour toutes les sorties, vous pouvez le faire en ajoutant encore une autre ligne à la fin du fichier ~/.config/pulse/default.pa :

set-default-sink record-n-play

Pour les programmes sur lesquels pulseaudio a déjà stocké des informations, il se souvient du dernier périphérique de sortie utilisé, vous devrez donc les reconfigurer manuellement en utilisant l'une des méthodes décrites dans la réponse de KrisWebDev.

6voto

Ramast Points 211

J'ai créé ce bash script basé sur les réponses fournies par les réponses de @Waschtl et @KrisWebDev.

Disponible ici : https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

Comment l'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 qui offre quelques améliorations par rapport à l'ancien. https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

Comment l'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 entrée, l'enregistrement commencera immédiatement. Si au moment où vous appuyez sur entrée, l'application était déjà arrêtée (c'est-à-dire que vous avez fermé mplayer par exemple) le script attendra que l'application apparaisse à nouveau et commencera l'enregistrement.

Le seul inconvénient de ce script (par rapport à l'original) est que si la liste contient deux entrées avec 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]

Edit : C'est un version améliorée du script par @anarcat

Utilisation :

Pour produire un enregistrement ogg

./pulse-recorder.py -i -o 'test.ogg'

Pour produire un enregistrement mp3

./pulse-recorder.py -i --encoder "lame -r -q 3 --lowpass 17 --abr 192 - '%s'" -o 'test.mp3'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X