컴퓨터와 TV 간에 오디오를 어떻게 전환합니까?

컴퓨터와 TV 간에 오디오를 어떻게 전환합니까?

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

관련 정보