Nehmen Sie die Ausgabe eines Programms mit PulseAudio auf

49

Ich möchte eine Ausgabe eines Programms mit PulseAudio mit einem Befehlszeilen- / Bash-Skript aufzeichnen . Es ist wichtig, nicht alle Ausgaben aufzuzeichnen, sondern nur die Ausgaben eines bestimmten Programms.

Ich dachte, ich müsste eine neue Null-Senke erstellen und dann die Ausgabe des Programms auf diese neue Senke verschieben. Dann weisen Sie parec an, diesen speziellen Monitor für die Aufnahme zu verwenden.

Der erste Schritt wäre etwa so:

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

Aber wie kann man die Ausgabe des Programms jetzt auf diese Senke verschieben?
Und wie zeichnet man die spezifische Senke mit einem Bash-Skript auf?

user5950
quelle

Antworten:

52

Versuchen Sie so etwas:

In einem Terminal eingeben

pacmd

(das ist die CLI des PulseAudio-Servers) dann benutzen

list-sink-inputs

(wo Sie die Indizes der laufenden Eingaben erhalten) Suchen Sie nun den Index Ihrer Eingabe. Wird jetzt als $ INDEX bezeichnet

Der skriptfähige Teil ist:

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 -

Erklärungen:

  • Der erste Befehl fügt eine Null-Senke hinzu, wie Sie bereits wussten.
  • Der zweite Befehl verschiebt den Senken-Eingang von Ihrer Standard-Audio-Senke nach Steam
  • Der dritte Befehl zeichnet den Monitor des Geräts steam (-d) auf und setzt die Ausgabe (Raw-Wave-Stream) in oggenc, das diesen Wave-Stream in eine OGA-Datei codiert. (für mp3 benutze lame)
Waschtl
quelle
Genial, vielen Dank für diese großartige Antwort! :)
Kraft
2
Können Sie bitte erklären, wie Sie diesen Vorgang rückgängig machen können? Meine Null-Senken sind immer noch verschiedenen Anwendungen zugeordnet, und jetzt habe ich keinen Ton!
ixtmixilix
@ixtmixilix: Die einfachste Möglichkeit, alle Einstellungen auf die Standardeinstellungen zurückzusetzen, besteht darin, den pulseaudio-Server zu beenden und neu zu starten. Wenn Autospawn eingestellt ist (dies ist die Standardeinstellung), geben Sie einfach pulseaudio -kin einem Terminal aus.
Takkat
1
@ixtmixilix Wenn Sie ausführen list-sink-inputs, notieren Sie sich den sinkWert. Zum Zurücktauschen einfach laufen pactl move-sink-input $INDEX $SINK. So etwas wiepactl move-sink-input 4719 1
Ciaran
27

Verbessere die Waschtl-Antwort dieses Threads, damit du den App-Sound BEIDE HÖREN UND AUFZEICHNEN kannst :

Zuerst suchen wir nach unserer Standardausgabe und geben den Namen der Senke ein $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

Dann erstellen wir eine kombinierte Senke mit nur einem Slave: $ DEFAULT_OUTPUT . Der von der App (Quelle) erzeugte Ton wird an die Slave-Senke (dh an die reale Ausgabe) weitergeleitet, und wir zeichnen ihn auch auf. Es unterscheidet sich von einer Null-Senke, bei der der Quellensound nicht weitergeleitet wird.

$ pactl load-module module-combine-sink \
  sink_name=record-n-play slaves=$DEFAULT_OUTPUT \
  sink_properties=device.description="Record-and-Play"

sink_properties ist optional und kann Fehler verursachen, wenn Sie Leerzeichen im Beschreibungsnamen verwenden.

Dann könnten wir den pactl move-sink-input ...Befehl Waschtl-Antwort verwenden (mit Record-n-Play anstelle von Steam ), aber die GUI pavucontrolist einfacher (und ideal für die Überprüfung / Fehlerbehebung):

$ sudo apt-get install pavucontrol
$ pavucontrol &

Dann spielen wir einen Sound in der App, die wir aufnehmen möchten. In der pavucontrol PlaybackRegisterkarte wählen wir in der App-Dropdown-Liste: "Record-and-Play" .

Endlich ist es gut, gleichzeitig aufzunehmen und zu hören! ( lahm mp3 Beispiel im Vordergrund laufen)

$ parec --format=s16le -d record-n-play.monitor | \
  lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3"

Oder wir können im Hintergrund aufnehmen und jederzeit anhalten:

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

  • So nehmen Sie alle Messwerte zurück oder wiederholen den Vorgang: Löschen Sie die Senken oder setzen Sie sie zurück, indem Sie diese Antwort verwenden . pulseaudio -kFunktioniert hervorragend, um alle Einstellungen auf die Standardeinstellungen der Sitzung zurückzusetzen.
  • Wenn wir die Standardausgabe in den System-Sound-Einstellungen ändern, wird die Wiedergabeeinstellung der benutzerdefinierten App überschrieben und wir müssen in pavucontrol zurückkehren, um sie auf die kombinierte Benutzeroberfläche zurückzusetzen.
  • Um den Ton von mehreren "echten" Schnittstellen (z. B. Kopfhörer, HDMI-Ausgang usw.) wiedergeben zu können, sollten wir alle "echten" Ausgänge, die wir zum Hören verwenden können, als Slink-Slaves für Aufnahme und Wiedergabe einschließen , wie: pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2.

BEARBEITEN: Achtung, seit Ubuntu 18 (vielleicht auch 17) wird die kombinierte Senke eher zum Standard-Systemausgabegerät als zum echten Ausgabegerät. Wenn Sie also die Lautstärke mithilfe des Sound-Symbols in der Taskleiste ändern, wirkt sich dies auf Ihren Aufnahmeklang aus. Problemumgehung: Öffnen Sie nach dem Erstellen der kombinierten Senke die pavucontrolRegisterkarte Ausgabe. Wählen Sie "Ansicht: Virtuelle Ausgabegeräte" und setzen Sie die Lautstärke der kombinierten Senke auf 100% zurück. Wählen Sie dann "Ansicht: Hardware-Ausgabegeräte" und drücken Sie das grüne Symbol "Als Alternative definieren" auf dem realen Ausgabegerät.

KrisWebDev
quelle
9

@Waschtls Antwort ist fantastisch. @ixtmixilix fragte nach der Wiederherstellung des normalen Audios nach Abschluss der Aufnahme. Hier ist der einfachste Weg, den ich kenne:

Installieren Sie die pavucontrolGUI und führen Sie sie aus . Sie sollten Ihre Audioausgabeanwendung und deren Lautstärkeanzeige unter der PlaybackRegisterkarte dort sehen. Daneben befindet sich eine Schaltfläche, die anzeigt, dass die Wiedergabe auf Null Output erfolgt . Klicken Sie darauf und ändern Sie es in Ihren normalen Audioausgang, in meinem Fall " Built-in Audio Analog Stereo" .

Hier ist ein Screenshot von dem, wonach Sie suchen:

Bildschirmfoto

Sie können diesen Ansatz auch verwenden, um Ihre Aufzeichnung in Zukunft einzurichten, nachdem Sie den load-moduleBefehl in der Antwort von @ Waschtl ausgeführt haben, um die Spüle zu erstellen.

Jack O'Connor
quelle
Wenn Sie können, laden Sie einen Screenshot in Imgur hoch und verknüpfen Sie ihn mit Ihrer Antwort.
Lucio
Ich weiß nicht, ob es machbar ist, aber ich denke, der beste Weg ist, das Null-Ausgabemodul zu entladen, damit neue Wiedergaben es nicht standardmäßig aufnehmen
Jack
6

Wenn Sie die Antwort von KrisWebDev weiter verbessern möchten , müssen Sie zunächst die Standardausgabe ermitteln:

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

welches so etwas ausgibt wie:

alsa_output.pci-0000_00_1b.0.analog-stereo

Als nächstes erstellen Sie eine Datei ~/.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"

Bitte ersetzen Sie sie durch die alsa_output.pci-0000_00_1b.0.analog-stereoAusgabe, die Sie vom pacmdBefehl erhalten haben. Pulse liest die Standardkonfigurationsdatei nicht, wenn eine benutzerdefinierte Konfigurationsdatei vorhanden ist. Aus diesem Grund enthält die erste Zeile oben die Standardkonfigurationsdatei. Auf diese Weise lädt pulseaudio immer noch zuerst die Standardkonfiguration.

Führen Sie pulseaudio -kden Befehl aus, um die aktuelle pulseaudio-Instanz zu beenden, damit eine neue mit der neuen Konfiguration gestartet wird.

Wenn Sie die Änderungen hier jederzeit rückgängig machen möchten, entfernen Sie einfach die ~/.config/pulse/default.paDatei und führen Sie sie aus pulseaudio -k.

Wenn Sie möchten, dass Record-n-Play die Standardsenke für alle Ausgaben ist, können Sie dies tun, indem Sie eine weitere Zeile am Ende von ~/.config/pulse/default.pa:

set-default-sink record-n-play

Bei Programmen, auf denen pulseaudio bereits Informationen gespeichert hat, merkt es sich das zuletzt verwendete Ausgabegerät, sodass Sie diese manuell mit einer der in der Antwort von KrisWebDev beschriebenen Methoden neu konfigurieren müssen.

Jonas Berlin
quelle
2

Ich habe dieses Bash-Skript basierend auf den Antworten von @Waschtl und @KrisWebDev erstellt.

Verfügbar hier: https://gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

Wie benutzt man?

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

Neue Version

Ich habe ein Python-Skript erstellt, das einige Verbesserungen gegenüber dem alten bietet. https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

Wie benutzt man?

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

Wenn Sie die Eingabetaste drücken, wird die Aufnahme sofort gestartet. Wenn die Anwendung zu dem Zeitpunkt, zu dem Sie die Eingabetaste gedrückt haben, bereits gestoppt war (dh Sie haben mplayer beispielsweise geschlossen), wartet das Skript, bis die App erneut angezeigt wird, und startet die Aufzeichnung.

Der einzige Nachteil dieses Skripts (im Vergleich zum Original) besteht darin, dass sich das Skript nicht korrekt verhält, wenn die Liste zwei Einträge mit demselben Namen enthält. Zum Beispiel

$ ./pulse-recorder.py                                                                                                      

1 - ALSA plug-in [mplayer]
2 - ALSA plug-in [mplayer]
Ramast
quelle
Für den Fall, dass Sie mehrere Ausgänge haben (z. B. Lautsprecher, mehrere Headsets, Monitor-Audio), können Sie in Zeile 21 Folgendes eingeben: default_output = alsa_output.pci-0000_00_1b.0.analog-stereo -Senken
Smaudet