Rediriger par programme la sortie audio d'un programme spécifique vers un fichier

8

Je voudrais rediriger la sortie audio d'un programme vers un fichier, sur la ligne de commande, comme dans

$ redirect-wrapper file.wav my-program

pour que

  • Je n'entends pas la sortie du programme, c'est-à-dire que la sortie ne doit aller qu'au fichier
  • Je n'enregistre rien d'autre que le programme, c'est-à-dire que seul ce programme spécifique est redirigé vers le fichier
  • le reste du système audio n'est pas perturbé, aucune option de configuration n'a été modifiée d'avant en arrière ou quelque chose comme ça

Y a-t-il un moyen de faire cela? Cette question connexe n'aide pas , j'ai besoin d'une solution en ligne de commande, pas de "cliquer là, puis là". Ceci est probablement également lié, mais repose également sur l'application graphique pavucontrol. J'ai trouvé une alternative terminale à pavucontrol, pacmd.

Mais cela ne permet toujours que le compromis suivant:

  1. Obtenez le récepteur par défaut et enregistrez ce qu'il était. Comment? Probablement à traverspacmd list-sinks
  2. Définissez le récepteur par défaut sur le récepteur snd-aloop avec pacmd set-default-sink.
  3. Enregistrez depuis cet évier.
  4. Lancer l'application
  5. Attendez que l'application ouvre son entrée réceptrice: pacmd list-sink-inputs | grep name-of-my-programsi cela trouve quelque chose, l'entrée est ouverte.
  6. Remplacez la valeur par défaut par ce qu'elle était pacmd set-default-sink.
  7. Arrêtez l'enregistrement une fois l'application fermée.

Mais cela modifie toujours le récepteur par défaut pendant une durée pouvant aller jusqu'à quelques minutes (l'entrée du récepteur n'est généralement pas ouverte jusqu'à ce que le programme joue réellement des sons qui n'ont pas besoin d'être juste après le lancement). J'ai mis en œuvre ce compromis; Github .

Toujours à la recherche de réponses non compromettantes.

Personne
la source
Cela pourrait aider: swview.org/node/213 Il change temporairement ~/.asoundrc. Vous pouvez peut-être éviter cela d'une manière ou d'une autre.
rudimeier
@rudimeier C'est la configuration globale du périphérique de sortie par défaut. Qu'il s'agisse de ~ / .asoundrc ou d'une autre manière, cela gâchera toujours le reste du système audio.
Personne
Aucune idée, mais je pense que vous êtes sur la bonne voie. La sortie de pacmd listmontre quelles sources et quels récepteurs sont attachés à des programmes particuliers, il peut donc y avoir un moyen de les changer. Essayez de demander sur la liste pulseaudio à lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss Les mainteneurs / développeurs sont là et sont très utiles.
Joe
@Joe Réaffecter les récepteurs est possible avec pacmd, oui, mais parce qu'ils ne sont alloués que lorsque l'audio commence réellement à jouer (au moins pour certains programmes; Firefox), cela signifie que je devrais les rechercher dans une boucle étroite et manquerait peut-être le environ 0,5 seconde environ de l'audio. Merci pour le conseil sur la liste de diffusion. :-)
Personne

Réponses:

2

Umm donc en regardant la documentation pulseaudio.

man pulseaudio

Nous avons les variables d'environnement suivantes

   $PULSE_SERVER: the server string specifying the server to connect to when a client asks for a sound server connection  and  doesn't  explicitly  ask  for  a  specific
   server.  The server string is a list of server addresses separated by whitespace which are tried in turn. A server address consists of an optional address type speci‐
   fier (unix:, tcp:, tcp4:, tcp6:), followed by a path or host address. A host address may include an optional port number. A server address may be prefixed by a string
   enclosed in {}. In this case the following server address is ignored unless the prefix string equals the local hostname or the machine id (/etc/machine-id).

   $PULSE_SINK: the symbolic name of the sink to connect to when a client creates a playback stream and doesn't explicitly ask for a specific sink.

J'espère que cela devrait vous permettre de remplacer complètement le récepteur pulseaudio, et si cela ne suffit pas, exécutez notre propre serveur pulseaudio à usage unique.

En se référant à cette page ( /ubuntu/60837/record-a-programs-output-with-pulseaudio ), nous découvrons la commande parec/ pacat(ce sont des alias) qui peut enregistrer et écrire dans des puits et les ruisseaux.

Pour mettre cela ensemble, nous avons l'encapsuleur suivant (que je n'ai pas réellement exécuté - bien que j'ai réussi à faire fonctionner cette méthode de manière ponctuelle)

sink_name="sink-$(date +%s)"
pacat $sink_name.monitor 
parec -d steam.monitor | oggenc -b 192 -o /tmp/steam.ogg --raw - &
pid=$!
PULSE_SINK=$sink_name "$@"
kill $pid
Att Righ
la source
Maintenant, je me sens stupide. Merci. ^^ Finalement, j'apprendrai d'abord à lire la documentation.
Personne