HDMI를 통해 연결된 PC와 TV 간에 오디오 출력을 전환하는 스크립트를 만들었습니다. 다음과 같습니다.
inactive_sink_id=$(pacmd list-sinks | grep -E "[^*] index: [0-9]+" | sed -r -e "s/.*([0-9]+)/\1/g")
pacmd set-default-sink $inactive_sink_id
move_sink_to_id=$(pacmd list-sink-inputs | grep -E "index: [0-9]+" | sed -r -e "s/.* ([0-9]+)/\1/g")
pacmd move-sink-input $move_sink_to_id $inactive_sink_id
하지만 때로는 작동하고 때로는 작동하지 않습니다.
예를 들어 YouTube 동영상이 재생되는 동안 컴퓨터에서 소리를 들을 수 있습니다. 영상에서 다른 위치로 전환하면 소리가 나지 않습니다. 오디오 및 비디오 설정을 열었고 TV HDMI가 장치 기본 설정 목록의 맨 위에 있는 것을 확인했습니다.
오디오 출력을 전환하는 안정적인 방법은 무엇입니까?
스크립트가 일부 변경되었음에도 불구하고 "오디오 및 비디오 설정"은 동일하게 유지되었습니다.
$ pacmd list-sinks | grep index
* index: 0
index: 1
$ toggle-audio-between-pc-and-tv.sh # My script
$ pacmd list-sinks | grep index
index: 0
* index: 1
동영상 재생. 소리가 나지 않습니다.
그런데 스크립트를 여러번 실행하면 소리가 TV로 전환됩니다.
작업과 오디오 및 비디오 설정 대화 상자가 pacmd
동기화되지 않은 것으로 나타납니다.
답변1
변수 이름으로 판단하면 여기서 무슨 일이 일어나고 있는지 이해하지 못합니다.
이 라인은 괜찮습니다. (단, 수신기가 2개 이상인 경우에는 해당되지 않습니다.) 하나도 없는 수신기를 찾아 *
할당합니다 inactive_sink_id
.
inactive_sink_id=$(pacmd list-sinks | grep -E "[^*] index: [0-9]+" | sed -r -e "s/.*([0-9]+)/\1/g")
싱크대가 두 개만 있으면 나쁘지 않습니다. 그 이상 있으면 변수에 많은 숫자가 포함되기 때문에 오류가 발생합니다.
pacmd set-default-sink $inactive_sink_id
이것도 괜찮을 수 있지만 입력이 하나뿐입니다. 그리고 여기의 변수 이름도 작동하지 않습니다.
move_sink_to_id=$(pacmd list-sink-inputs | grep -E "index: [0-9]+" | sed -r -e "s/.* ([0-9]+)/\1/g")
수신기를 ID로 이동하지 않았습니다. id로 식별된 수신기로 입력을 이동하고 있습니다. (id는 변경되지 않습니다. 변경되는 이유는 무엇입니까?) 입력이 더 많으면 move_sink_to_id
정수가 많기 때문에 이 줄은 작동하지 않습니다.
pacmd move-sink-input $move_sink_to_id $inactive_sink_id
다음 구성을 사용해 보세요.
for input in $(pactl list short sink-inputs | awk '{print $1}'); do
pacmd move-sink-input $input $inactive_sink_id
done
이제 각 입력이 대상 수신기로 이동되었음을 확인할 수 있습니다. YouTube 동영상을 일시중지하더라도 한동안 입력 목록에 남아 있기 때문에 이는 중요합니다. 당신은 몇 가지 실험을 할 수 있습니다
pactl list short sink-inputs
PulseAudio가 이에 대해 어떻게 생각하는지 확인하세요.
또한, 수신자가 2명 이상인 경우에 대해서는 이름을 inactive_sink_id
로 변경하고 적용 범위를 소개하겠습니다. target_sink_id
이는 수신자 이름을 기반으로 하드코딩될 수 있습니다. ID뿐만 아니라 이름으로도 수신기를 참조할 수 있습니다.
pactl move-sink-input 65 alsa_output.pci-0000_00_1b.0.analog-stereo
또는 입력을 이동할 위치를 선택할 수 있는 선택적 선택 목록을 도입할 수도 있습니다.
이 명령은 두 번째 열에 이름이 포함된 명확한 수신자 목록을 생성합니다.
pactl list short sinks
그리고 PulseAudio가 TV 수신기를 볼 수 있기 전에 스크립트를 실행해야 합니다!
최종 스크립트는 다음과 같습니다.
#!/bin/bash
target_sink=alsa_output.pci-0000_00_1b.0.analog-stereo
pactl list short sinks | grep -- "$target_sink" || {
echo Sink "$target_sink" not found! >&2
exit 1
}
pacmd set-default-sink "$target_sink"
for input in $(pactl list short sink-inputs | awk '{print $1}'); do
pacmd move-sink-input "$input" "$target_sink"
done