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 ?

6voto

SnowboardBruin Points 215

Si un seul programme produit du son, vous pouvez utiliser cette ligne unique de bash :

parec --monitor-stream  $(pacmd list-sink-inputs|tac|perl -E'undef$/;$_=<>;/RUNNING.*?index: (\d+)\n/s;say $1') --format=s16le --channels=2 --file-format=aiff newrecording.aiff

La production semble être d'environ 10MB par minute, et ne coupez pas le son du programme !

Je pense que c'est une bonne solution car je ne télécharge pas un nouveau script, et je n'ai pas à créer un nouveau null sink dans pulseaudio. Cela devrait donner des résultats bizarres si le programme n'a pas de sortie audio lorsque le one-liner démarre, ou si plusieurs programmes sortent de l'audio lorsque la commande démarre.

parec doit arrêter d'enregistrer lorsque vous avez terminé l'application qui diffuse le son. Certaines applications d'édition peuvent avoir des problèmes avec un fichier aiff de 600 minutes, si elles essaient de le charger deux fois dans la RAM.

C'est également une mauvaise solution si l'application s'arrête et recommence à émettre de l'audio.

3voto

Nicolas AGIUS Points 31

Toutes ces réponses sont étonnantes et démontrent la puissance de PulseAudio ! En creusant pour essayer de les comprendre, j'ai trouvé une solution plus simple (c'est peut-être une nouvelle fonctionnalité) : on peut se brancher directement sur le moniteur de la sortie par défaut.

DEFAULT_OUTPUT=$(pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+")  # From previous answer
ffmpeg -f pulse -ac 2 -i $DEFAULT_OUTPUT.monitor output.mp3

Fonctionne très bien si vous souhaitez également capturer des vidéos.

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