Enregistrer la sortie d'un programme avec PulseAudio

49

Je voudrais enregistrer une 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 collecteur nul et déplacer la sortie du programme vers ce nouveau collecteur. Que tell PAREC d'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?

utilisateur5950
la source

Réponses:

52

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 la vapeur
  • La troisième commande enregistre le moniteur de la vapeur de périphérique (-d) et place la sortie (flux-wave brut) dans oggenc, qui encode ce flux dans un fichier oga. (pour mp3 utiliser boiteux)
Waschtl
la source
Génial, merci beaucoup pour cette excellente réponse! :)
Force
2
pouvez-vous s'il vous plaît expliquer comment annuler cette opération? mes puits nuls sont toujours mappés vers diverses applications et, maintenant, je n'ai plus de son!
ixtmixilix
@ixtmixilix: le moyen le plus simple de restaurer tous les paramètres par défaut consiste simplement à supprimer et à redémarrer le serveur pulseaudio. Si cette option est définie sur la création automatique (par défaut), vous émettez simplement pulseaudio -kdans un terminal.
Takkat
1
@ixtmixilix Lorsque vous exécutez, list-sink-inputsnotez la sinkvaleur. Pour revenir en arrière, lancez pactl move-sink-input $INDEX $SINK. Quelque chose commepactl move-sink-input 4719 1
Ciaran
27

L' amélioration de la réponse Waschtl de ce fil afin que vous puissiez LES DEUX ET ECOUTER RECORD l'application de son:

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 récepteur 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 d'un collecteur nul dans lequel 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 provoquer des bogues si vous utilisez des espaces dans le nom de la description.

Ensuite, nous pourrions utiliser la pactl move-sink-input ...commande de réponse Waschtl (avec record-n-play au lieu de steam ) mais l'interface graphique pavucontrolest plus simple (et très pratique pour la vérification / dépannage):

$ sudo apt-get install pavucontrol
$ pavucontrol &

Ensuite, nous jouons du son dans l'application que nous voulons enregistrer. Dans l' pavucontrol Playbackonglet, 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! ( exemple mp3 boiteux , 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 -kfonctionne 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, les paramètres de lecture de l'application personnalisée seront écrasés 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, casque, sortie HDMI, etc.), vous devez inclure toutes les sorties "réelles" que nous pouvons utiliser pour écouter, en tant qu'esclaves slink record-n-play , 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: après avoir créé le récepteur combiné, ouvrez-le pavucontroldans l'onglet Sortie. 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.

KrisWebDev
la source
9

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' pavucontrolinterface graphique. Vous devriez voir votre application de sortie audio et son compteur de volume sous l' Playbackonglet. 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, Audio intégré Stéréo analogique dans mon cas.

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

capture d'écran

Vous pouvez également utiliser cette approche pour configurer votre enregistrement ultérieurement, après avoir exécuté la load-modulecommande dans la réponse de @ Waschtl pour créer le récepteur.

Jack O'Connor
la source
Si vous le pouvez, téléchargez une capture d'écran dans Imgur et associez -la à votre réponse.
Lucio
Je ne sais pas si c'est faisable, mais je pense que le meilleur moyen est de décharger le module de sortie NULL, afin que les nouvelles lectures ne le récupèrent pas par défaut
Jack
6

Pour améliorer 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-stereopar tout ce que vous avez obtenu de la pacmdcommande. 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.

Run pulseaudio -kpour tuer l'instance actuelle de pulseaudio afin qu'une nouvelle soit démarrée avec la nouvelle configuration.

Si à tout moment vous souhaitez annuler les modifications ici, supprimez simplement le ~/.config/pulse/default.pafichier et exécutez-le 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.

Jonas Berlin
la source
2

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

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]
Ramast
la source
Dans le cas où vous avez plusieurs sorties (par exemple, haut-parleurs, plusieurs casques, audio du moniteur), vous pouvez remplacer sur la ligne 21 par exemple: default_output = alsa_output.pci-0000_00_1b.0.analog-stereo à l'endroit de la sortie de la liste pacmd -sinks
smaudet