Phím tắt để chuyển giữa đầu ra Analog Stereo & đầu ra âm thanh HDMI


18

Để chuyển sang đầu ra âm thanh HDMI (của màn hình) và trở lại đầu ra âm thanh bình thường từ giắc âm thanh hệ thống (đối với tai nghe, vì màn hình của tôi không có âm thanh ra), tôi thấy mình mở tùy chọn âm thanh và chọn đúng kênh mọi lúc. Có cách nào để tôi có thể tạo nút chuyển đổi trong bảng điều khiển hoặc gán một số phím tắt để chuyển đổi do tôi thường xuyên chuyển đổi.

:aplay -l 
**** List of PLAYBACK Hardware Devices ****
card 0: Intel [HDA Intel], device 0: STAC92xx Analog [STAC92xx Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 7: STAC92xx Digital [STAC92xx Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

nhập mô tả hình ảnh ở đây


1
+1 Thật tuyệt vời nếu tôi có thể chuyển sang chế độ đầu ra màn hình HDMI và chế độ âm thanh chính xác trong một lần nhấn phím.
Kit Menke

Điều gì sẽ tốt hơn nữa là khi phát hiện ra kênh âm thanh HDMI / Display Port này, nó sẽ tự động chuyển nó. Đây là những gì docking là dành cho. Tôi dường như nhớ một số mã docking trước đây sẽ thay đổi cấu hình dựa trên một số ID phần cứng (MAC) nhất định. Bất cứ ai biết những gì được gọi là một lần nữa?
Elijah Lynn

Câu trả lời:


10

Với pulseaudio, chúng tôi có thể chọn phần đầu ra từ dòng lệnh:

pacmd set-default-sink "SINKNAME"

Lệnh này có thể được sử dụng trong trình khởi chạy, tập lệnh hoặc thậm chí được gán cho một phím tắt để chuyển nhanh giữa các bồn khác nhau. Vui lòng thay thế "SINKNAME" bằng tên hoặc số bồn rửa mong muốn của bạn. Một danh sách các bồn rửa đã biết với các số và tên liên quan của chúng được đưa ra bởi lệnh:

pacmd list-sinks

Lưu ý: Thay đổi mức chìm đầu ra thông qua giao diện dòng lệnh chỉ có thể có hiệu lực nếu việc đọc thiết bị đích luồng bị vô hiệu hóa. Điều này có thể được thực hiện bằng cách chỉnh sửa dòng chỉnh sửa /etc/pulse/default.pathành:

load-module module-stream-restore restore_device=false

Ngoài ra, chúng tôi có thể chạy pulseaudio để phát đồng thời âm thanh cho thiết bị âm thanh bên trong và cho thiết bị hdmi bằng cách chạy paprefs với tùy chọn thêm thiết bị đầu ra ảo:

giấy bạc


2
pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.analog-stereo"pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.hdmi-stereo"chỉ hoạt động sau khi chọn cấu hình tương ứng trong Tùy chọn âm thanh. Nếu tôi có bộ HDMI và tôi chạy lệnh pacmd cho âm thanh nổi tương tự, tôi sẽ nhận được eror Sink alsa_output.pci-0000_00_1b.0.analog-stereo does not exist.Nhưng nếu tôi chọn thủ công cấu hình từ GUI Tùy chọn âm thanh và chạy cùng một lệnh, tôi sẽ không gặp lỗi. Vì vậy, nó không giúp chuyển đổi.
iJeeves

@iJeeves: xem chỉnh sửa để cập nhật.
Takkat

Vấn đề tương tự. Nếu tôi chạy lệnh, nó sẽ thay đổi trực quan trong GUI nhưng âm thanh không chuyển hướng. Tôi phải tự chuyển đổi nó trong GUI để nó hoạt động. Có ý kiến ​​gì không?
Elijah Lynn

1
@ElijahLynn: Bạn cũng có thể phải di chuyển luồng: askubfox.com/questions/71863/ mẹo
Takkat

@Takkat: Tôi chưa thử nhưng đây có vẻ là vấn đề chính xác mà tôi gặp phải. Cám ơn rất nhiều!
Elijah Lynn

7

Tôi thấy điều này rất khó chịu với chính mình và đã viết một kịch bản để chuyển đổi đầu ra:

#!/bin/bash

CURRENT_PROFILE=$(pacmd list-cards | grep "active profile" | cut -d ' ' -f 3-)

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo+input:analog-stereo>" ] ; then
        pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo"
else 
        pacmd set-card-profile 0 "output:hdmi-stereo+input:analog-stereo"        
fi

và sau đó ràng buộc một phím không sử dụng trên bàn phím của tôi để thực thi nó (xem Cách liên kết các lệnh tùy chỉnh với phím tắt? )


Mặc dù bạn đã không đăng nhập trong 18 tháng chỉ muốn cho bạn biết đây là câu trả lời hay nhất IMO +1
WinEunuuchs2Unix

Làm thế nào tôi có thể làm điều này nếu tôi cần chuyển đổi giữa hai thẻ, không chỉ hai hồ sơ của một thẻ?
Oebele

2

Một kịch bản chuyển đổi chìm khác

đã thử nghiệm trên Ubuntu 16.04


Nhưng cái này cho phép bạn chỉ chuyển đổi âm thanh của ứng dụng bạn muốn.

SỬ DỤNG: Tập trung vào ứng dụng bạn muốn thay đổi phần chìm và chạy tập lệnh này. Đó là nó!!!

Kịch bản lệnh này phát hiện ứng dụng đang tập trung, tìm tất cả âm thanh phát từ ứng dụng đó và chuyển chúng sang bồn rửa có sẵn tiếp theo.

https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3

Giải thích kịch bản

Chúng ta cần tìm ra PID của ứng dụng.

Nhưng trước tiên chúng ta cần xid

xprop -root _NET_ACTIVE_WINDOW 

Sau đó chèn nó vào đây $xidđể lấy pid của ứng dụng

xprop -id $xid _NET_WM_PID

Bây giờ chúng ta cần tìm các đầu vào chìm liên quan đến PID đó

Trước tiên, hãy tuyến tính hóa đầu ra của lệnh pacmd list-sink-inputsđể liệt kê một đầu vào chìm trên mỗi dòng, hiển thị chỉ mục của nó, chìm và pid trên cùng một dòng

pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2

hãy phân tích từng bước một:

grep -E 'index:|sink:|process.idchỉ giữ các dòng có chứa index:, sink:hoặcprocess.id

tr '\n' ' ' tham gia tất cả các dòng

tr -d '"'loại bỏ tất cả các "ký tự. Cần thiết để có được pid mà không có dấu ngoặc kép

sed -e 's/index:/\n/g'thay thế tất cả các index:lần xuất hiện bằng một ký tự dòng mới\n

tail -n +2 xóa dòng đầu tiên vì nó trống

Và kết quả là như thế này:

  180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
  181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
  182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

Hãy phân tích một dòng để hiểu ý nghĩa của nó:

  # 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

182là chỉ số đầu vào chìm, 0là chỉ số chìm và 13752ở cuối, là giá trị của ứng dụng thuộc

Sau đó, chúng tôi lặp lại qua từng dòng

... | while IFS= read -r line || [ -n "$line" ]; do
  sink_input_pid=$(echo $line | awk '{print $NF}')

Và cuối cùng chỉ lọc pid của đầu vào chìm phù hợp với pid của ứng dụng tập trung

  if [ $sink_input_pid = $app_pid ]; then

Trích xuất dữ liệu

Với awkchúng tôi có thể có được các yếu tố chúng tôi cần

sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')

Lấy số lượng bồn, để biết khi nào vòng quay của bồn sẽ khởi động lại từ 0.

sink_list_size=${#sink_list_array[@]}

Tìm bồn rửa tiếp theo, chúng ta phải lặp qua danh sách các bồn, để biết cái nào khớp với current_sink_index và để biết chỉ số của bồn tiếp theo.

i=0
for sink in "${sink_list_array[@]}"; do
  i=$((($i+1)%sink_list_size))  # i++ mod(#sinks)
  if [ $sink = $current_sink_index ]; then
    next_sink_index=${sink_list_array[i]}
    break
  fi
done

Và cuối cùng, chúng tôi di chuyển đầu vào chìm để chơi trong next_sink_index

pacmd move-sink-input $sink_input_index $next_sink_index

Lưu ý trên Ubuntu 16.04:

Khi định cấu hình phím tắt, tôi không thể làm cho nó hoạt động với trình quản lý phím tắt của ubfox. Vì vậy, tôi đã phải cài đặt compizconfig-settings-manager

sudo apt-get install compizconfig-settings-manager

+1 cho câu trả lời đầu tiên tuyệt vời khi người dùng mới. Vì câu hỏi ban đầu là dành cho Ubuntu 11.04, bạn nên chỉ ra phiên bản nào đã được thử nghiệm.
WinEunuuchs2Unix

@ WinEunuuchs2Unix Wow! cảm ơn bạn :). Tôi đã thêm phiên bản Ubuntu bên dưới tiêu đề.
Madacol


1

Vì chỉ có một soundcard hiển thị trong ảnh chụp màn hình, tôi nghĩ đầu ra của soundcard này nên được chuyển đổi.

Ví dụ: Tôi có một Notebook với một soundcard tích hợp, nhưng nó có đầu ra kỹ thuật số (SPDIF) khi được gắn.

Vì vậy, những gì tôi muốn làm là chuyển đổi đầu ra hoạt động hoặc "Hồ sơ" trong pulseaudio.

Tôi tìm thấy các lệnh làm chính xác điều đó:

pacmd set-card-profile 0 output:analog-stereo
pacmd set-card-profile 0 output:iec958-stereo+input:analog-stereo

Những gì tôi đã làm để có được tên chính xác cho cài đặt đầu ra mong muốn của mình - ở đây, đầu ra kỹ thuật số, nhưng đầu vào tương tự (vi mô) - là:

pacmd list | grep output

1

Tôi cũng đang cố gắng tìm giải pháp cho vấn đề này. Kể từ Ubuntu 11.04, điều này dường như không thể thực hiện trực tiếp, tôi chỉ tìm thấy hướng dẫn này để thêm cả HDMI và Analog dưới dạng đầu ra riêng biệt, vì vậy pacmd hiện hiển thị 3 mức chìm. Sau đó, có thể chuyển đổi giữa các bồn rửa bằng các lệnh trên. ( xem thêm )

Nhưng rõ ràng Ubuntu 11.11 sẽ có được PulseAudio với hệ thống phát hiện jack. Theo trang web bên dưới, David Henningsson đã mã hóa phát hiện qua udev để âm thanh xung tự động được chuyển sang đầu ra được thêm vào cuối cùng, bao gồm chuyển đổi giữa các cấu hình khác nhau của cùng một soundcard (như trường hợp của bạn và thiết lập của tôi). (xem tại đây )

Vì vậy, tôi hy vọng điều này sẽ hoạt động, khi tôi thử phiên bản cuối cùng vào thứ Sáu tới.


1

Dựa trên nhiều câu trả lời trước đó, tôi đã viết một tập lệnh đặt bồn phát lại xen kẽ giữa các câu trả lời có sẵn.

Cách tốt nhất để sử dụng nó là bằng cách tạo một phím tắt để chạy nó, vì vậy mỗi lần bạn nhấn tổ hợp phím đó, âm thanh sẽ được chuyển hướng đến bồn rửa có sẵn tiếp theo.

Mã có sẵn ở đây: https://gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c


0

Trong trường hợp của tôi, các tùy chọn tương tự không có trong danh sách. Cài đặt pavucontrol: sudo apt install pavucontrol

Có thể khắc phục sự cố, bằng cách bắt đầu ứng dụng:

  1. Khởi động ứng dụng qua thiết bị đầu cuối, bằng cách nhập: pavucontrol(enter)
  2. Chuyển đến tab 'Cấu hình'.
  3. Chọn cấu hình đầu ra âm thanh nổi Analoge tại Âm thanh thực tế

nhập mô tả hình ảnh ở đây

Bây giờ tôi có thể ở đây âm thanh và chọn các cấu hình khác nhau (trong Linux Mint):

nhập mô tả hình ảnh ở đây


0

Một thay thế cho Chỉ báo chuyển đổi âm thanh (yêu cầu thêm PPA) là tạo lệnh (hoặc tập lệnh) và gọi nó bằng phím tắt:

Trong trường hợp của tôi là hdmi-stereo-extra1+inputhồ sơ, vì vậy trong một dòng sẽ là:

[[ $(pacmd list-cards | grep "active profile" | cut -d " " -f 3-) = "<output:hdmi-stereo-extra1+input:analog-stereo>" ]] && \
     pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo" || \
     pacmd set-card-profile 0 "output:hdmi-stereo-extra1+input:analog-stereo"

Bạn có thể sử dụng một phím tắt tùy chỉnh ( gnome-control-center keyboard) để thực thi nó với bash -c(sẽ cảnh báo bạn nếu có bất kỳ xung đột nào với các phím tắt khác):

ảnh chụp màn hình

ảnh chụp màn hình

Tôi sử dụng:

  • Super + Alt + o: Chuyển đổi đầu ra giữa tai nghe và HDMI.
  • Super + Alt + Up: Tăng âm lượng
  • Super + Alt + Down: Tập xuống

Ngoài ra bạn có thể thêm aliasvào của bạn .bashrc.

Đã thử nghiệm trên Ubuntu 16.04 và 18.04


Nếu bạn không ở trên hành vi trên một tập lệnh, tôi đã thực hiện một số thay đổi dựa trên câu trả lời @ user829996:

#!/bin/bash
set -euo pipefail # strict mode

activeProfile() { pacmd list-cards | grep "active profile" | cut -d " " -f 3-; }
CURRENT_PROFILE="$(eval activeProfile)"

# If it doesn't work run  pacmd list-cards  and try the other outputs from profile section
ANALOG_PROFILE="output:analog-stereo+input:analog-stereo"
HDMI_PROFILE="output:hdmi-stereo-extra1+input:analog-stereo"

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo-extra1+input:analog-stereo>" ] ; then
  pacmd set-card-profile 0 "$ANALOG_PROFILE"
else
    pacmd set-card-profile 0 "$HDMI_PROFILE"
fi

activeProfile

0

Có cách nào tôi có thể tạo nút chuyển đổi trong bảng điều khiển

Tôi đã viết một applet chỉ báo cho phép bạn chuyển đổi âm thanh phát ra.


Chào mừng bạn đến hỏi Ubuntu! Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Warren Hill
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.