วิธีที่ง่ายและน่าเชื่อถือที่สุดในการสลับเอาต์พุตของ PipeWire จากสคริปต์บน Debian คือการใช้wpctlเครื่องมือบรรทัดคำสั่ง WirePlumber: ระบุโหนด sink สองโหนดที่คุณต้องการ ตรวจสอบ sink เริ่มต้นปัจจุบัน และเรียกwpctl set-default IDใช้ sink อีกโหนดหนึ่ง วิธีนี้ดีกว่าการกำหนด ID โหนดเป็นตัวเลขแบบตายตัว เพราะ ID ของอ็อบเจ็กต์ PipeWire อาจเปลี่ยนแปลงได้เมื่ออุปกรณ์ตัดการเชื่อมต่อ เชื่อมต่อใหม่ หรือเซสชันเริ่มต้นใหม่
คู่มือนี้ใช้การสลับอุปกรณ์สองตัว เช่น ลำโพงแล็ปท็อปและหูฟังบลูทูธ และตั้งใจรักษาตรรกะให้เข้ากันได้กับทั้ง Debian 13 (Trixie) และ Debian 12 (Bookworm) ในปัจจุบัน ณ เดือนตุลาคม 2026 หน้าแพ็กเกจของ Debian แสดงรายการ WirePlumber เวอร์ชัน 0.5.8 ใน Debian 13 และ 0.4.13 ใน Debian 12 เวอร์ชัน WirePlumber ที่ใหม่กว่ามีคุณสมบัติการแสดงรายการเพิ่มเติม แต่wpctl status -n, wpctl inspect, และwpctl set-defaultเป็นตัวร่วมที่จำเป็นในที่นี้
เมื่อวิธีการนี้เหมาะสม
ใช้วิธีนี้เมื่อ PipeWire กำลังจัดการเสียงบนเดสก์ท็อปอยู่แล้ว และคุณต้องการทางลัดแป้นพิมพ์ ตัวเรียกใช้งาน ชื่อย่อในเชลล์ หรือปุ่มลัดเพื่อสลับระหว่างเอาต์พุตสองตัว วิธีนี้ใช้ได้ดีกับเอาต์พุตอะนาล็อกในตัว รวมถึง DAC USB จอภาพ HDMI ชุดหูฟังบลูทูธ หรืออุปกรณ์รับสัญญาณอื่นๆ ที่ปรากฏใน ส่วน Sinks ของwpctl statusPipeWire
นี่ไม่ใช่เครื่องมือที่เหมาะสมสำหรับปัญหาการกำหนดเส้นทางทุกประเภท การเปลี่ยนแปลงนี้wpctl set-defaultจะเปลี่ยนเป้าหมายเริ่มต้นที่ใช้สำหรับสตรีมที่ต้องการการเชื่อมต่ออัตโนมัติ และไม่รับประกันว่าแอปพลิเคชันที่กำลังทำงานอยู่ทุกตัวจะย้ายสตรีมที่มีอยู่ทันที บางแอปพลิเคชันจะปฏิบัติตามค่าเริ่มต้นใหม่โดยอัตโนมัติ ในขณะที่บางแอปพลิเคชันอาจต้องย้ายสตรีมแยกต่างหากหรือรีสตาร์ทแอปพลิเคชัน
ก่อนที่คุณจะเขียนบท
ตรวจสอบให้แน่ใจว่าเซสชัน PipeWire และ WirePlumber ระดับผู้ใช้ทำงานได้อย่างปกติ เอกสารอย่างเป็นทางการของ WirePlumber แนะนำให้ตรวจสอบ daemon ด้วยคำสั่ง ` wirewire.json` systemctl --user status wireplumberนอกจากนี้ Debian ยังแนะนำให้ใช้pipewire-audiometapackage บน Debian 12 และเวอร์ชันที่ใหม่กว่าเมื่อตั้งค่า PipeWire audio stack แบบสมบูรณ์
systemctl --user status wireplumber
systemctl --user status pipewire pipewire-pulse
หากwpctlไม่พบ ให้ติดตั้ง WirePlumber และส่วนประกอบเสียง PipeWire ตามปกติ แทนที่จะพยายามใช้ยูทิลิตี้มิกเซอร์ที่ไม่เกี่ยวข้องมาทดแทน:
sudo apt update
sudo apt install pipewire-audio wireplumber
อย่ารันwpctlด้วยsudoคำสั่ง `pipeWire` เพราะโดยปกติแล้ว PipeWire และ WirePlumber จะทำงานในเซสชันของผู้ใช้เดสก์ท็อป ดังนั้นคำสั่งควรเชื่อมต่อกับกราฟสื่อของผู้ใช้นั้น
ขั้นตอนที่ 1: ค้นหาชื่อของปลายทางเอาต์พุต
วิ่ง:
wpctl status -n
ตัวเลือก นี้-nขอwpctlให้แสดงชื่อวัตถุแทนคำอธิบายที่เข้าใจง่าย ภายใต้Audio → Sinks ให้จดชื่อของเอาต์พุตทั้งสองที่คุณต้องการสลับการใช้งาน เครื่องอาจแสดง sink ในตัวที่มีลักษณะคล้ายกับalsa_output.pci-0000_00_1f.3.analog-stereoและ sink บลูทูธที่ขึ้นต้นbluez_output.ด้วย
ตัวอย่างมุมมองเทอร์มินัลwpctl status -n: ระบุส่วนย่อยของชื่อที่เสถียรภายใต้หัวข้อ Sinks แทนที่จะคัดลอกรหัสตัวเลขลงในสคริปต์
เลือกส่วนย่อยของชื่อไฟล์ที่มีลักษณะเฉพาะและตรงกับเอาต์พุตที่ต้องการเท่านั้น สำหรับการ์ดเสียงแบบติดตั้งในตัวalsa_output...ชื่อโหนดแบบเต็มมักเป็นตัวเลือกที่เหมาะสม สำหรับอุปกรณ์บลูทูธbluez_output.ส่วนย่อยที่สั้นกว่าจะสะดวกก็ต่อเมื่อคุณเชื่อมต่ออุปกรณ์รับเสียงบลูทูธเพียงตัวเดียวเป็นประจำ หากคุณเชื่อมต่อเอาต์พุตบลูทูธหลายตัวบ่อยๆ ให้ใช้ส่วนย่อยที่ยาวกว่าและเฉพาะเจาะจงสำหรับอุปกรณ์นั้นๆ
ขั้นตอนที่ 2: ตรวจสอบอ่างล้างจานด้วยคำสั่ง wpctl inspect
ก่อนเขียนสคริปต์สวิตช์ โปรดตรวจสอบ ID ใด ID หนึ่งที่แสดงโดยwpctl status -n:
wpctl inspect 45
แทนที่45ด้วย ID ปัจจุบันในระบบของคุณ มองหาคุณสมบัติเช่นnode.nameและmedia.classสำหรับเอาต์พุตการเล่นmedia.classควรระบุแหล่งรับสัญญาณเสียง ID ตัวเลขมีประโยชน์สำหรับการตรวจสอบและสำหรับset-defaultคำสั่งโดยตรง แต่สคริปต์ด้านล่างจะกำหนด ID ใหม่ทุกครั้งที่ทำงาน
การตรวจสอบ sink จะยืนยันชื่อโหนดที่สคริปต์จะตรงกัน และช่วยแยกแยะ sink สำหรับการเล่นออกจาก source หรือวัตถุ PipeWire ที่ไม่เกี่ยวข้อง
คุณยังสามารถถาม WirePlumber ว่าอ่างล้างจานใดเป็นค่าเริ่มต้นโดยไม่ต้องทราบรหัสตัวเลขของอ่างล้างจานนั้นได้:
wpctl inspect @DEFAULT_AUDIO_SINK@
ตัวระบุพิเศษนี้@DEFAULT_AUDIO_SINK@ได้รับการบันทึกไว้ในเอกสารของ WirePlumber และจะถูกแปลงเป็นโหนดการเล่นเริ่มต้นปัจจุบันในระหว่างการทำงาน
ขั้นตอนที่ 3: สร้างสคริปต์สลับเอาต์พุตสองตัว
หากจำเป็น ให้สร้างไดเร็กทอรีสำหรับไฟล์ปฏิบัติการส่วนตัว จากนั้นเปิดสคริปต์:
mkdir -p ~/.local/bin
nano ~/.local/bin/toggle-audio-output
วางโค้ดต่อไปนี้แล้วแทนที่SINK_Aด้วยSINK_Bส่วนต่างๆ จาก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"
สคริปต์สลับควรจับคู่ชื่อซิงค์แบบไดนามิก กำหนดค่าเริ่มต้นปัจจุบัน และแก้ไขรหัสวัตถุปัจจุบันของเป้าหมายก่อนที่จะเรียกwpctl set-defaultใช้
เหตุใดสคริปต์จึงแก้ไข ID ได้ทุกครั้ง
รหัสประจำตัวของวัตถุ PipeWire เป็นวัตถุในเซสชัน ดังนั้นการ treating รหัสประจำตัวดังกล่าว45เป็นตัวระบุอุปกรณ์ถาวรจึงไม่เหมาะสม สคริปต์จะจัดเก็บส่วนของชื่อโหนดที่สามารถจดจำได้แทน วิเคราะห์ส่วน Sinks ปัจจุบัน และดึงรหัสตัวเลขออกมาเฉพาะในขณะที่ทำการสลับเท่านั้น
เหตุใดจึงใช้ wpctl inspect สำหรับค่าเริ่มต้นปัจจุบัน
สคริปต์จะขอ@DEFAULT_AUDIO_SINK@ชื่อนั้นnode.nameซึ่งจะหลีกเลี่ยงการพึ่งพาตำแหน่งของเครื่องหมายดอกจัน เมื่อพิจารณา ว่าwpctl statusอ่างล้างจานใดถูกเลือกอยู่ในขณะนี้ จากนั้นจะเปรียบเทียบชื่อนั้นกับSINK_AและSINK_B
ขั้นตอนที่ 4: ทำให้สคริปต์สามารถเรียกใช้งานได้และทดสอบ
บันทึกไฟล์ จากนั้นเรียกใช้คำสั่ง:
chmod +x ~/.local/bin/toggle-audio-output
~/.local/bin/toggle-audio-output
wpctl status -n
หากซิงค์เป้าหมายพร้อมใช้งาน สคริปต์ควรพิมพ์ ID ที่เลือกไว้ เรียกใช้สคริปต์อีกครั้ง และสคริปต์ควรเลือกซิงค์อื่นที่กำหนดค่าไว้ ตรวจสอบผลลัพธ์ด้วยwpctl status -nหรือโดยการตรวจ@DEFAULT_AUDIO_SINK@สอบ
หลังจากสคริปต์ทำงานเสร็จแล้ว ให้ตรวจwpctl status -nสอบว่าซิงค์ที่ต้องการได้ถูกตั้งค่าเป็นค่าเริ่มต้นแล้ว
เอกสารของ WirePlumber wpctl set-default IDระบุว่าการตั้งค่า sink หรือ source เป็นเป้าหมายเริ่มต้นนั้น ใน WirePlumber เวอร์ชันใหม่ ระบบจะจดจำการเลือกของผู้ใช้และอาจมีลำดับความสำคัญเหนือกว่าการเลือกอัตโนมัติตามลำดับความสำคัญ หากคุณต้องการให้ WirePlumber กลับไปใช้การเลือกเริ่มต้นอัตโนมัติในภายหลัง ให้ใช้คำสั่งต่อไปนี้:
wpctl clear-default
เพิ่มสคริปต์ลงในปุ่มลัดบนแป้นพิมพ์
เมื่อการทดสอบเทอร์มินัลทำงานได้อย่างน่าเชื่อถือแล้ว ให้กำหนด/home/YOUR_USER/.local/bin/toggle-audio-outputคีย์ลัดให้กับโปรแกรมบนเดสก์ท็อป ควรใช้พาธแบบเต็ม (absolute path) แทนการใช้~พาธย่อย (parameter) เพราะโปรแกรมเรียกใช้คีย์ลัดบางตัวไม่ขยายคีย์ลัดของเชลล์ ลักษณะของคีย์ลัดจะขึ้นอยู่กับสภาพแวดล้อมของเดสก์ท็อป ดังนั้นการทดสอบที่สำคัญคือ สคริปต์ต้องทำงานได้อย่างถูกต้องจากเทอร์มินัลของผู้ใช้ทั่วไปก่อน
หากทางลัดทำงานได้แต่wpctlแจ้งว่าไม่สามารถเชื่อมต่อได้ อาจเป็นเพราะตัวเรียกใช้งานไม่ได้รับสภาพแวดล้อมเซสชันผู้ใช้ที่คาดหวังไว้ ตรวจสอบคำสั่งเดียวกันจากเทอร์มินัลภายในเซสชันแบบกราฟิก จากนั้นตรวจสอบกฎการเรียกใช้ทางลัดของสภาพแวดล้อมเดสก์ท็อป อย่าแก้ปัญหานี้โดยการเพิ่มคำนำหน้าสคริปต์ด้วยsudo.
การแก้ไขปัญหาข้อผิดพลาดทั่วไป
“ไม่มีอ่างล้างจานที่ตรงกับความต้องการ”
เป้าหมายอาจตัดการเชื่อมต่อ ชื่อโหนดอาจเปลี่ยนไป หรือรูปแบบของคุณเฉพาะเจาะจงเกินไป ลองรันwpctl status -nใหม่และอัปเดตค่าที่เกี่ยวข้องSINK_AสำหรับSINK_Bบลูทูธ โปรดตรวจสอบให้แน่ใจว่าชุดหูฟังเชื่อมต่ออยู่และมีการเปิดใช้งานตัวรับสัญญาณเสียงก่อนเรียกใช้สคริปต์
สคริปต์จะเปลี่ยนค่าเริ่มต้น แต่เสียงที่มีอยู่จะยังคงเล่นต่อไปในที่อื่น
นี่อาจเป็นเรื่องปกติ เอกสารต้นทางอธิบายset-defaultว่าเป็นการเลือกเป้าหมายสำหรับสตรีมใหม่ที่ต้องการการเชื่อมต่ออัตโนมัติ หากสตรีมที่มีอยู่ของแอปพลิเคชันใดแอปพลิเคชันหนึ่งยังคงอยู่บนปลายทางเดิม ให้หยุดและเริ่มเล่นใหม่ หรือเปิดแอปพลิเคชันนั้นอีกครั้ง หากคุณต้องการย้ายสตรีมที่มีอยู่โดยเฉพาะ ให้ดำเนินการเป็นงานกำหนดเส้นทางแยกต่างหาก แทนที่จะคิดว่าset-defaultมันจะรับประกันได้เสมอไป
เลือกอุปกรณ์บลูทูธผิดตัว
ระบุให้SINK_Bละเอียดกว่านี้ รูปแบบทั่วไปเช่นนี้bluez_output.เหมาะสมเฉพาะเมื่อมีอุปกรณ์รับสัญญาณบลูทูธที่ตรงกันเพียงตัวเดียวเท่านั้น ใช้ชื่อโหนดแบบเต็มหรือส่วนตรงกลางที่ไม่ซ้ำกันเมื่อสามารถเชื่อมต่ออุปกรณ์ส่งสัญญาณไร้สายหลายตัวพร้อมกันได้
โปรแกรม WirePlumber ไม่ทำงาน
ตรวจสอบ:
systemctl --user status wireplumber
journalctl --user -u wireplumber
เอกสารต้นฉบับแนะนำsystemctl --user --now enable wireplumberให้ติดตั้ง daemon แต่ไม่ได้เปิดใช้งาน ในกรณีที่เดสก์ท็อป Debian ได้รับการกำหนดค่าไว้แล้ว ให้ตรวจสอบสาเหตุที่บริการผู้ใช้หยุดทำงานก่อนที่จะรีสตาร์ทระบบเสียงทั้งหมดซ้ำๆ
Debian 12 กับ Debian 13: มีอะไรเปลี่ยนแปลงบ้าง?
การเผยแพร่ Debian แพ็คเกจ WirePlumber ผลกระทบในทางปฏิบัติของบทนี้
Debian 12 (Bookworm) 0.4.13 ในที่เก็บมาตรฐาน ใช้เวิร์กโฟลว์ที่เข้ากันได้wpctl status -n, inspect, และset-defaultที่แสดงไว้ที่นี่
เดเบียน 13 (ทริกซี) 0.5.8 ในที่เก็บมาตรฐาน สคริปต์เดียวกันนี้ยังคงใช้งานได้ และ WirePlumber เวอร์ชันใหม่กว่ายังมีการปรับปรุงพฤติกรรมการกำหนดค่าผ่าน CLI และ JSON อีกด้วย
อย่าคัดลอกตัวอย่างการตั้งค่า WirePlumber 0.5 ไปใช้กับเวอร์ชัน 0.4 ที่เก่ากว่าโดยไม่ดูข้อมูลให้ครบถ้วน WirePlumber 0.5 ได้เปลี่ยนระบบการตั้งค่าไปแล้ว คู่มือนี้จึงหลีกเลี่ยงข้อจำกัดของเวอร์ชันดังกล่าวโดยใช้การดำเนินการผ่านบรรทัดคำสั่งแทนการใช้ไฟล์นโยบายแบบถาวร
รายการตรวจสอบการยืนยันอย่างรวดเร็ว
systemctl --user status wireplumberแสดงให้เห็นว่าตัวจัดการเซสชันกำลังทำงานอยู่
wpctl status -nแสดงรายการเอาต์พุตที่ต้องการทั้งสองรายการภายใต้ Sinks
wpctl inspect @DEFAULT_AUDIO_SINK@ส่งคืนโหนดการเล่นปัจจุบันที่ถูกต้อง
รูปแบบสคริปต์ทั้งสองแบบนี้ระบุปลายทางที่ต้องการได้อย่างชัดเจน
การเรียกใช้สคริปต์สองครั้งจะสลับค่าเริ่มต้นระหว่างผลลัพธ์ทั้งสอง
หากแอปพลิเคชันที่มีอยู่ไม่ได้ถูกย้าย คุณจะเข้าใจว่าการเลือกค่าเริ่มต้นและการย้ายสตรีมที่ใช้งานอยู่เป็นพฤติกรรมที่แยกจากกัน
เอกสารอ้างอิงหลัก
สำหรับความหมายของคำสั่งและพฤติกรรมปัจจุบันของ WirePlumber โปรดดูคู่มือ wpctl อย่างเป็นทางการของ WirePlumber และคู่มือเริ่มต้นใช้งาน WirePlumber อย่างเป็นทางการ สำหรับข้อมูลแพ็กเกจและการตั้งค่าเฉพาะสำหรับ Debian โปรดดูเอกสาร PipeWire ของ Debian หน้าแพ็กเกจ WirePlumber ของDebian 12 และ หน้าแพ็กเก จWirePlumber ของ Debian 13