Programmierte Audioausgabe eines bestimmten Programms programmgesteuert in eine Datei umleiten

8

Ich möchte die Audioausgabe eines Programms in die Datei über die Befehlszeile umleiten, wie in

$ redirect-wrapper file.wav my-program

damit

  • Ich höre die Ausgabe des Programms nicht, dh die Ausgabe sollte nur in die Datei gehen
  • Ich nehme nichts außer dem Programm auf, dh nur dieses spezielle Programm wird in die Datei umgeleitet
  • Der Rest des Audiosystems bleibt völlig ungestört, es werden keine Konfigurationsoptionen hin und her geändert oder ähnliches

Gibt es eine Möglichkeit, dies zu tun? Diese verwandte Frage hilft nicht , ich brauche eine Kommandozeilenlösung, kein "dort klicken, dann dort". Dies hängt wahrscheinlich auch damit zusammen, beruht aber auch auf der grafischen Anwendung pavucontrol. Ich fand eine Terminalalternative zu pavucontrol, pacmd.

Dies ermöglicht jedoch nur den folgenden Kompromiss:

  1. Holen Sie sich die Standardsenke und speichern Sie, was es war. Wie? Wahrscheinlich durchgreifenpacmd list-sinks
  2. Setzen Sie die Standardsenke auf die snd-aloop-Senke mit pacmd set-default-sink.
  3. Nehmen Sie von dieser Spüle auf.
  4. Programm starten
  5. Warten Sie, bis die Anwendung ihre Senkeneingabe geöffnet hat: pacmd list-sink-inputs | grep name-of-my-programWenn dies etwas findet, ist die Eingabe geöffnet.
  6. Ändern Sie die Standardeinstellung wieder auf die Standardeinstellung pacmd set-default-sink.
  7. Beenden Sie die Aufzeichnung, sobald die Anwendung geschlossen wird.

Dies ändert jedoch immer noch die Standardsenke für einen Zeitraum von bis zu ein paar Minuten (die Senkeneingabe wird normalerweise erst geöffnet, wenn das Programm tatsächlich Sounds wiedergibt, die nicht direkt nach dem Start sein müssen). Ich habe diesen Kompromiss umgesetzt. Github .

Immer noch auf der Suche nach kompromisslosen Antworten.

Niemand
quelle
Dies könnte helfen: swview.org/node/213 Er ändert sich vorübergehend ~/.asoundrc. Vielleicht kannst du das irgendwie vermeiden.
Rudimeier
@rudimeier Damit wird das Standardausgabegerät global festgelegt. Egal ob von ~ / .asoundrc oder auf andere Weise, es wird immer den Rest des Audiosystems durcheinander bringen.
Niemand
Keine Ahnung, aber ich denke, Sie sind auf dem richtigen Weg. Die Ausgabe von pacmd listzeigt an, welche Quellen und Senken an bestimmte Programme angehängt sind, sodass es eine Möglichkeit gibt, diese zu ändern. Fragen Sie in der pulseaudio-Liste unter lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss nach. Die Betreuer / Entwickler sind da und sehr hilfreich.
Joe
@Joe Das Neuzuweisen von Senken ist mit pacmd möglich, ja, aber da sie nur zugewiesen werden, wenn Audio tatsächlich abgespielt wird (zumindest für einige Programme; Firefox), bedeutet dies, dass ich sie in einer engen Schleife suchen müsste und möglicherweise die verpassen würde Die ersten 0,5 Sekunden des Audios. Danke für den Tipp zur Mailingliste. :-)
Niemand

Antworten:

2

Umm also schau dir die pulseaudio Dokumentation an.

man pulseaudio

Wir haben die folgenden Umgebungsvariablen

   $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.

Dies sollte es Ihnen hoffentlich ermöglichen, die pulseaudio-Senke vollständig auszutauschen. Wenn dies nicht ausreicht, führen Sie unseren eigenen pulseaudio-Einwegserver aus.

Unter Bezugnahme auf diese Seite ( /ubuntu/60837/record-a-programs-output-with-pulseaudio ) erfahren wir mehr über den Befehl parec/ pacat(es handelt sich um Aliase), der von Senken aufzeichnen und in Senken schreiben kann und Streams.

Zusammengenommen haben wir den folgenden Wrapper (den ich nicht ausgeführt habe - obwohl ich diese Methode erfolgreich auf Ad-hoc-Basis zum Laufen gebracht habe).

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
quelle
Jetzt fühle ich mich dumm. Vielen Dank. ^^ Irgendwann werde ich zuerst lernen, die Dokumentation zu lesen.
Niemand