
Wie überwache ich den Mikrofoneingang in Linux?
Hinweis: Überwachen ist nicht dasselbe wie Aufzeichnen und Wiedergeben der Aufzeichnung.
Unter Windows kann ich mein eigenes Mikrofon auf folgende Arten abhören:
Mit einem Programm, das mein Mikrofon aufnimmt und es zur Wiedergabe an meine Soundkarte sendet. Zum Beispiel mit
ffplay
dem Befehlffplay -f dshow -i audio="Front panel mic (Realtek High Definition Audio)"
Es kommt zu einer erheblichen Verzögerung von bis zu mehreren Sekunden.
Mit der Option „Listen“ der Eingabegeräteeigenschaften
Es tritt eine geringere Verzögerung von bis zu einer Sekunde auf.
Mit Soundkarten-Widget
Es entsteht KEINE Verzögerung. Ich denke, dadurch wird der Eingangston zum Ausgang geleitet, ohne die Soundkarte zu verlassen, bin mir aber nicht sicher.
Ich brauche Option Nr. 2 in der Linux-Befehlszeile.
Antwort1
Sie sollten in der Lage sein, Ihr Mikrofon mit PulseAudios zu überwachen.Loopback-Modul. Das Modul sollte automatisch Loopback-Ausgänge für verfügbare Eingabegeräte erstellen. Um das Modul manuell zu laden
pactl load-module module-loopback
Um die Änderung dauerhaft zu machen, fügen Sie /etc/pulse/default.pa
Folgendes hinzu:
load-module module-loopback
Antwort2
Wenn Sie einen analogen Eingang und einen analogen Ausgang haben, empfehle ich, einfach pavucontrol
(PulseAudio Volume Control) zu verwenden, um den Eingangston zum Ausgang am Mischpult zu leiten. Wenn Sie jedoch z. B. ein USB-Mikrofon haben, kann der Ton nicht einfach gemischt werden, sondern es muss eine Software den Ton aufnehmen und ihn dann zum Ausgabestream wiedergeben. Und je nach Ihrer Hardware kann diese Aufnahme + Wiedergabe eine gewisse (oder sogar hohe) Latenz verursachen.
Sie könnten Folgendes versuchen:
Besorgen Sie sich zunächst die Namen der Ein- und Ausgänge, die Sie verwenden möchten:
$ pactl list short | egrep "alsa_(input|output)" | fgrep -v ".monitor"
bei mir sieht das Ergebnis so aus:
0 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
0 alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono module-alsa-card.c s16le 1ch 44100Hz SUSPENDED
Das bedeutet, dass mein Ausgabegerät bei heißt alsa_output.pci-0000_00_1b.0.analog-stereo
und meine USB-Webcam/mein USB-Mikrofon heißt alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono
.
Ich kann jetzt das USB-Mikrofon aufnehmen und es wie folgt am Audioausgang ausgeben:
$ pacat -r --latency-msec=1 -d alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono | pacat -p --latency-msec=2 -d alsa_output.pci-0000_00_1b.0.analog-stereo
Das heißt, ein pacat
Prozess liest vom Mikrofon und fordert den Audio-Stack an, um zu versuchen, die Latenz auf 1 ms oder 0,001 Sekunden zu bringen. Und ein anderer pacat
Prozess schreibt das Audio auf mein Ausgabegerät und versucht, die Latenz auf 2 ms oder 0,002 Sekunden zu bringen. Sie können auch versuchen, die Ausgabelatenz auf 1 ms zu reduzieren, aber zumindest bei meiner ziemlich alten Hardware kommt es in diesem Fall zu Audio-Clips etwas zu leicht.
Wenn ich diese Kombination aus Aufnahme- und Wiedergabeausgabe jedoch über längere Zeit laufen lasse, scheint die Latenz mit der Zeit langsam zuzunehmen. Ich vermute, dass mein USB-Mikrofontakt etwas schneller ist als mein Audioausgangstakt, wodurch der Puffer langsam anwächst. Ich kenne keine gute Möglichkeit, diesen Pactl-Prozessen zu erlauben, Audio zu überspringen, um die Ausgabe in Echtzeit zu halten. Ich schätze, ich müsste dafür eine benutzerdefinierte App schreiben.
Für die obige pacat ... | pacat
Pipeline scheint die beste Latenz für meine Hardware bei etwa 6 ms zu liegen, vom Zeitpunkt, an dem die Schallwellen auf das Mikrofon treffen, bis zu den Schallwellen, die aus den Ausgangslautsprechern ausgehen, wenn ich einen Linux-Kernel mit aktiviertem PREEMPT verwende (z. B. Ubuntu- linux-lowlatency
Kernel).