Audio-Aufnahme eines Programms
mit pulseaudio unter Debian bullseye
 

Mittels pulseaudio ist es ein leichtes das was man am Computer hört aufzunehmen. Zuerst muß man den Kanal des entsprechenden Programms herausfinden. Hinweis: Dazu muß die Soundwiedergabe im entsprechenden Programm laufen!
Mittels:
# pacmd list-sink-inputs
bekommt man dann eine Liste der Soundwiedergabe, hier z.B. für Firefox:

1 sink input(s) available.
    index: 9
        driver: <protocol-native.c>
        flags: START_CORKED 
        state: RUNNING
        sink: 1 <alsa_output.pci-0000_0b_00.4.analog-stereo>
        volume: front-left: 65536 / 100% / 0,00 dB,   front-right: 65536 / 100% / 0,00 dB
                balance 0,00
        muted: no
        current latency: 124,99 ms
        requested latency: 75,01 ms
        sample spec: float32le 2ch 44100Hz
        channel map: front-left,front-right
                     Stereo
        resample method: copy
        module: 9
        client: 16 <Firefox>
        properties:
                media.name = "Lerne eine Sprache"
                application.name = "Firefox"
                native-protocol.peer = "UNIX socket client"
                native-protocol.version = "34"
                application.process.id = "29649"
                application.process.user = "user"
                application.process.host = "pc"
                application.process.binary = "firefox-bin"
                application.language = "de_DE.UTF-8"
                window.x11.display = ":0"
                application.process.machine_id = "e5678eaa74d94b34acaa60565cfda131"
                application.process.session_id = "3"
                module-stream-restore.id = "sink-input-by-application-name:Firefox"

Anschließend kann mittels
# parec --verbose --monitor-stream=<Index> --file-format=wav recording.wav
die entsprechende Wiedergabe aufgenommen werden. Allerdings funktioniert das nur sehr schlecht bei kleinen Soundschnipseln in Firefox, da die Soundwiedergabe für die Aufnahme ja laufen muß. Noch dazu zählt Firefox jedesmal bei der Wiedergabe des Soundschnipsels einen Index höher. Eine andere Möglichkeit bietet ffmpeg:

Mittels
# pactl list short sources
gibt man eine Liste der verfügbaren Audio-Hardware aus, z.B.:
1  alsa_output.pci-0000_0b_00.4.analog-stereo.monitor      module-alsa-card.c  s16le 2ch 44100Hz  SUSPENDED
4  alsa_output.pci-0000_09_00.1.hdmi-stereo-extra2.monitor module-alsa-card.c  s16le 2ch 44100Hz  SUSPENDED

Um nun eine Aufnahme mittels ffmpeg zu machen, gibt man folgenden Befehl ein:
# ffmpeg -f pulse -i alsa_output.pci-0000_0b_00.4.analog-stereo.monitor -ac 2 recording.wav

Noch ein kleiner Tipp für das Aufnehmen von sehr kurzen Audio Schnipseln: Wie schon erwähnt muß für Aufnahmen mittels pulseaudio die Audio-Wiedergabe laufen, da sonst nichts vorhanden ist zum Aufnehmen und die Aufnahme mit einer Fehlermeldung abbricht. Bei sehr kurzen Audio Schnipseln kann es daher passieren, daß man den Anfang abschneidet oder im schlimmsten Fall gar nichts aufnimmt, weil die Zeit einfach zu kurz ist, bis man die Aufnahme starten kann. Ich habe das Problem so gelöst, daß ich eine leere Wave-Datei von 2 Stunden Länge mittels eines Audio-Editors erzeugt habe. Wenn ich diese zusätzlich im Hintergrund laufen lasse, wird ständig etwas ausgegeben und der Ausgabe-Kanal bleibt somit ständig aktiv. Damit kann ich die Aufnahme vorher abstarten und somit die volle Länge des Audio-Schnipsels aufnehmen.