Startseite
» LINUX
»
Wie konfiguriert man ein PipeWire-Skript zum Umschalten der Audioausgabe unter Debian?
Wie konfiguriert man ein PipeWire-Skript zum Umschalten der Audioausgabe unter Debian?
Die einfachste und zuverlässigste Methode, PipeWire-Ausgänge per Skript unter Debian umzuschalten, ist die Verwendung wpctldes Kommandozeilentools `WirePlumber`: Identifizieren Sie die beiden gewünschten Sink-Knoten, prüfen Sie den aktuell standardmäßigen Sink und rufen Sie wpctl set-default IDden anderen auf. Dies ist der Verwendung einer fest codierten numerischen Knoten-ID vorzuziehen, da sich PipeWire-Objekt-IDs ändern können, wenn Geräte die Verbindung trennen, wiederherstellen oder die Sitzung neu gestartet wird.
Diese Anleitung verwendet einen Zwei-Geräte-Schalter – beispielsweise Laptop-Lautsprecher und Bluetooth-Kopfhörer – und achtet bewusst darauf, dass die Logik sowohl mit Debian 13 (Trixie) als auch mit Debian 12 (Bookworm) kompatibel ist. Stand Oktober 2026 listet die Debian-Paketseite WirePlumber 0.5.8 in Debian 13 und 0.4.13 in Debian 12 auf. Neuere WirePlumber-Versionen bieten zusätzliche Funktionen zur Auflistung, aber wpctl status -ndie wpctl inspecthier wpctl set-defaultbenötigten Funktionen sind die grundlegenden.
Wenn diese Methode gut passt
Verwenden Sie diese Methode, wenn PipeWire bereits die Desktop-Audioausgabe übernimmt und Sie eine Tastenkombination, einen Launcher, einen Shell-Alias oder einen Hotkey zum Umschalten zwischen zwei Ausgängen benötigen. Sie eignet sich gut für einen integrierten analogen Ausgang in Kombination mit einem USB-DAC, einem HDMI-Monitor, einem Bluetooth-Headset oder einem anderen Gerät, das im Abschnitt „Sinks“wpctl status angezeigt wird .
Es ist nicht für jedes Routing-Problem das richtige Werkzeug. wpctl set-defaultEs ändert das Standardziel für Streams, die eine automatische Verbindung benötigen. Es garantiert nicht, dass jede bereits laufende Anwendung einen bestehenden Stream sofort migriert. Einige Anwendungen folgen dem neuen Standard automatisch; bei anderen muss der Stream möglicherweise separat verschoben oder die Anwendung neu gestartet werden.
Bevor Sie das Drehbuch schreiben
Stellen Sie sicher, dass die PipeWire- und WirePlumber-Sitzung auf Benutzerebene fehlerfrei funktioniert. Die offizielle WirePlumber-Dokumentation empfiehlt, den Daemon mit `git check` zu überprüfen systemctl --user status wireplumber. Debian empfiehlt außerdem das pipewire-audioMetapaket unter Debian 12 und neueren Versionen für die Einrichtung eines vollständigen PipeWire-Audio-Stacks.
systemctl --user status wireplumber
systemctl --user status pipewire pipewire-pulse
Falls wpctles fehlt, installieren Sie WirePlumber und die normalen PipeWire-Audiokomponenten, anstatt zu versuchen, ein nicht zugehöriges Mixer-Dienstprogramm zu verwenden:
Führen Sie den Befehl nicht wpctlmit aus sudo. PipeWire und WirePlumber arbeiten normalerweise in der Sitzung Ihres Desktop-Benutzers, daher sollte der Befehl eine Verbindung zum Mediengraphen dieses Benutzers herstellen.
Schritt 1: Ermitteln Sie die Namen der Ausgabesenken
Laufen:
wpctl status -n
Diese -nOption ermöglicht wpctldie Anzeige von Objektnamen anstelle von benutzerfreundlichen Beschreibungen. Unter „Audio → Ausgänge“ finden Sie die Namen der beiden Ausgänge, die Sie umschalten möchten. Ein Gerät könnte beispielsweise einen integrierten Ausgang mit der Bezeichnung „Audio“ alsa_output.pci-0000_00_1f.3.analog-stereound einen Bluetooth-Ausgang mit der Bezeichnung „Bluetooth“ anzeigen bluez_output..
Eine repräsentative Terminalansicht von wpctl status -n: Stabile Namensfragmente werden im Abschnitt „Sinks“ identifiziert, anstatt numerische IDs in das Skript zu kopieren.
Wählen Sie ein Fragment, das eindeutig genug ist, um nur dem gewünschten Ausgang zugeordnet zu werden. Bei einer integrierten Soundkarte alsa_output...ist der vollständige Knotenname in der Regel sinnvoll. Bei einem Bluetooth-Gerät bluez_output.ist ein kürzeres Fragment nur dann praktikabel, wenn normalerweise nur ein Bluetooth-Audioausgang angeschlossen ist. Wenn Sie häufig mehrere Bluetooth-Ausgänge verbinden, verwenden Sie ein längeres Fragment, das eindeutig dem jeweiligen Gerät zugeordnet ist.
Schritt 2: Überprüfen Sie eine Senke mit wpctl inspect
Bevor Sie den Schalter per Skript programmieren, überprüfen Sie eine der angezeigten IDs wpctl status -n:
wpctl inspect 45
Ersetzen Sie 45<System-ID> durch die aktuelle ID Ihres Systems. Suchen Sie nach Eigenschaften wie <Eigenschaft1> node.nameund <Eigenschaft2> media.class. Bei einer Wiedergabeausgabe media.classsollte <Eigenschaft1> ein Audio-Senke identifizieren. Die numerische ID ist für die Überprüfung und den direkten set-defaultBefehl nützlich, das unten stehende Skript ermittelt jedoch bei jeder Ausführung eine neue ID.
Die Überprüfung eines Senkenobjekts bestätigt den Knotennamen, mit dem das Skript übereinstimmt, und hilft dabei, eine Wiedergabesenke von einer Quelle oder einem nicht zugehörigen PipeWire-Objekt zu unterscheiden.
Sie können WirePlumber auch fragen, welches Waschbecken aktuell als Standard eingestellt ist, ohne dessen numerische ID zu kennen:
wpctl inspect @DEFAULT_AUDIO_SINK@
Der spezielle Bezeichner @DEFAULT_AUDIO_SINK@ist in WirePlumber dokumentiert und wird zur Laufzeit auf den aktuellen Standard-Wiedergabeknoten aufgelöst.
Schritt 3: Erstellen Sie ein Skript zum Umschalten zweier Ausgänge.
Erstellen Sie gegebenenfalls ein persönliches ausführbares Verzeichnis und öffnen Sie dann das Skript:
Fügen Sie den folgenden Code ein und ersetzen Sie SINK_A<code> SINK_B<code></ wpctl status -n...
#!/usr/bin/env bash
set -euo pipefail
# Replace these with distinctive fragments from `wpctl status -n`.
SINK_A="alsa_output.pci-0000_00_1f.3.analog-stereo"
SINK_B="bluez_output."
find_sink_id() {
local needle="$1"
wpctl status -n | awk -v n="$needle" '
/Sinks:/ { in_sinks=1; next }
/Sources:/ { in_sinks=0 }
in_sinks && index($0, n) {
for (i=1; i<=NF; i++) {
if ($i ~ /^[0-9]+\.$/) {
gsub(/\./, "", $i)
print $i
exit
}
}
}'
}
current_name="$(
wpctl inspect @DEFAULT_AUDIO_SINK@ |
awk -F'= ' '/node.name/ {
gsub(/"/, "", $2)
print $2
exit
}'
)"
if [[ "$current_name" == *"$SINK_A"* ]]; then
target_pattern="$SINK_B"
elif [[ "$current_name" == *"$SINK_B"* ]]; then
target_pattern="$SINK_A"
else
# If the current default is neither target, switch to A first.
target_pattern="$SINK_A"
fi
target_id="$(find_sink_id "$target_pattern")"
if [[ -z "$target_id" ]]; then
printf 'No available sink matched: %s\n' "$target_pattern" >&2
exit 1
fi
wpctl set-default "$target_id"
printf 'Default audio sink changed to ID %s\n' "$target_id"
Das Umschaltskript sollte die Senkennamen dynamisch abgleichen, den aktuellen Standardwert ermitteln und die aktuelle Objekt-ID des Ziels auflösen, bevor es aufgerufen wird wpctl set-default.
Warum löst das Skript jedes Mal IDs auf?
PipeWire-Objekt-IDs sind Sitzungsobjekte, daher 45ist die Verwendung einer ID als permanente Geräte-ID problematisch. Das Skript speichert stattdessen erkennbare Knotennamenfragmente, analysiert den aktuellen Abschnitt „Sinks“ und extrahiert die numerische ID erst beim Umschalten.
Warum es wpctl inspect für den aktuellen Standard verwendet
Das Skript fragt @DEFAULT_AUDIO_SINK@nach dessen node.name. Dadurch wird vermieden, dass die visuelle Position eines Sternchens in wpctl statusder Auswahl des aktuell ausgewählten Senkenbereichs ausschlaggebend ist. Anschließend vergleicht es diesen Namen mit SINK_Aund SINK_B.
Schritt 4: Machen Sie das Skript ausführbar und testen Sie es.
Speichern Sie die Datei und führen Sie sie anschließend aus:
chmod +x ~/.local/bin/toggle-audio-output
~/.local/bin/toggle-audio-output
wpctl status -n
Wenn die Zielsenke verfügbar ist, sollte das Skript die ausgewählte ID ausgeben. Führen Sie es erneut aus; es sollte nun die andere konfigurierte Senke auswählen. Überprüfen Sie das Ergebnis mit wpctl status -noder durch Inspektion @DEFAULT_AUDIO_SINK@.
Nach Ausführung des Skripts wpctl status -nsollte überprüft werden, ob das gewünschte Ziel nun als Standard festgelegt ist.
WirePlumber dokumentiert wpctl set-default IDdas Festlegen einer Senke oder Quelle als Standardziel. In der aktuellen Version von WirePlumber wird diese Benutzerauswahl gespeichert und kann die automatische, prioritätsbasierte Auswahl überschreiben. Wenn Sie später wieder die automatische Standardauswahl verwenden möchten, gehen Sie wie folgt vor:
wpctl clear-default
Füge das Skript einer Tastenkombination hinzu
Sobald der Terminaltest zuverlässig ist, binden Sie ihn /home/YOUR_USER/.local/bin/toggle-audio-outputan eine Desktop-Tastenkombination. Verwenden Sie den absoluten Pfad, da ~manche Shortcut-Programme Shell-Kurzbefehle nicht auflösen. Die genaue Darstellung der Tastenkombination hängt von der Desktop-Umgebung ab. Daher ist es wichtig, dass das Skript zunächst in einem normalen Benutzerterminal korrekt funktioniert.
Wenn eine Verknüpfung ausgeführt wird, aber wpctlmeldet, dass keine Verbindung hergestellt werden kann, übernimmt der Launcher möglicherweise nicht die erwartete Benutzersitzungsumgebung. Überprüfen Sie denselben Befehl in einem Terminal innerhalb der grafischen Sitzung und prüfen Sie anschließend die Ausführungsregeln für Verknüpfungen der Desktop-Umgebung. Beheben Sie dieses Problem nicht, indem Sie dem Skript ein Präfix voranstellen sudo.
Behebung häufiger Fehler
„Kein passendes Spülbecken verfügbar“
Das Ziel ist wahrscheinlich nicht verbunden, sein Knotenname hat sich geändert oder Ihr Muster ist zu spezifisch. Führen Sie den Vorgang wpctl status -nerneut aus und aktualisieren Sie den entsprechenden SINK_AWert SINK_B. Stellen Sie bei Bluetooth-Verbindungen sicher, dass das Headset angeschlossen ist und ein Audiosignal freigegeben hat, bevor Sie das Skript aufrufen.
Das Skript ändert die Standardeinstellung, aber die vorhandene Audiowiedergabe wird an anderer Stelle fortgesetzt.
Dies kann normal sein. Die Dokumentation des Upstream-Projekts beschreibt set-defaultdie Auswahl des Ziels für neue Streams, die eine automatische Verbindung erfordern. Falls der bestehende Stream einer Anwendung weiterhin auf dem alten Zielsystem verbleibt, stoppen Sie die Wiedergabe und starten Sie sie neu oder öffnen Sie die Anwendung erneut. Wenn Sie bestehende Streams migrieren müssen, behandeln Sie dies als separate Routing-Aufgabe und gehen Sie nicht davon aus, dass set-defaultdies automatisch erfolgt.
Das falsche Bluetooth-Gerät wurde ausgewählt
Präzisieren Sie SINK_BIhre Angaben. Ein allgemeines Muster wie beispielsweise bluez_output.ist nur dann geeignet, wenn ein passendes Bluetooth-Gerät vorhanden ist. Verwenden Sie den vollständigen Knotennamen oder ein eindeutiges mittleres Fragment, wenn mehrere drahtlose Ausgänge gleichzeitig verbunden werden können.
WirePlumber ist nicht aktiv.
Überprüfen:
systemctl --user status wireplumber
journalctl --user -u wireplumber
Die Dokumentation des Entwicklers gibt Empfehlungen für systemctl --user --now enable wireplumberden Fall, dass der Daemon installiert, aber nicht aktiviert ist. Auf einem bereits konfigurierten Debian-Desktop sollte untersucht werden, warum der Benutzerdienst beendet wurde, bevor der gesamte Audio-Stack wiederholt neu gestartet wird.
Debian 12 versus Debian 13: Was ändert sich?
Debian-Version
WirePlumber-Paket
Praktische Auswirkungen für dieses Skript
Debian 12 (Bookworm)
Version 0.4.13 im Standard-Repository
Nutzen Sie den hier gezeigten kompatiblen wpctl status -n, inspect, und set-defaultWorkflow.
Debian 13 (Trixie)
0.5.8 im Standard-Repository
Das gleiche Skript funktioniert; neuere WirePlumber-Versionen bieten außerdem eine erweiterte CLI und ein JSON-basiertes Konfigurationsverhalten.
Kopieren Sie die Konfigurationsbeispiele von WirePlumber 0.5 nicht einfach in eine ältere 0.4-Installation. WirePlumber 0.5 hat sein Konfigurationssystem geändert; dieses Tutorial umgeht diese Versionsgrenze, indem es Befehlszeilenoperationen anstelle von persistenten Richtliniendateien verwendet.
Checkliste zur schnellen Überprüfung
systemctl --user status wireplumberzeigt an, dass der Sitzungsmanager läuft.
wpctl status -nUnter „Sinks“ werden beide beabsichtigten Ausgänge aufgelistet.
wpctl inspect @DEFAULT_AUDIO_SINK@Gibt einen gültigen aktuellen Wiedergabeknoten zurück.
Die beiden Skriptmuster identifizieren die beabsichtigten Senken eindeutig.
Durch zweimaliges Ausführen des Skripts wird die Standardeinstellung zwischen den beiden Ausgaben gewechselt.
Wenn eine bestehende Anwendung nicht migriert wird, ist Ihnen bewusst, dass die Standardauswahl und die Active-Stream-Migration unterschiedliche Verhaltensweisen darstellen.