コンピュータとテレビの間でオーディオを切り替えるには?

コンピュータとテレビの間でオーディオを切り替えるには?

HDMIを介して接続されたPCとテレビの間でオーディオ出力を切り替えるスクリプトを作成しました。次のようになります。

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

ここに画像の説明を入力してください。 テレビをつける

動画の再生。音が出ません。

ちなみに、スクリプトを複数回実行すると、音がテレビに切り替わります。

タスクとオーディオとビデオの設定ダイアログボックスがpacmd同期していないように見えます。

ベストアンサー1

変数名で判断すると、ここで何が起こっているのかわかりません。

このラインは大丈夫です。 (ただし、受信機が2つ以上の場合は該当しません。)1つもない受信機を見つけて割り当て*ますinactive_sink_id

inactive_sink_id=$(pacmd list-sinks | grep -E "[^*] index: [0-9]+" | sed -r -e "s/.*([0-9]+)/\1/g")

流し台が2つしかないと悪くないそれ以上の場合、変数に多数の数値が含まれるため、エラーが発生します。

pacmd set-default-sink $inactive_sink_id

これも大丈夫かもしれませんが、入力は1つだけです。そしてここの変数名も機能しません。

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

あるいは、入力を移動する場所を選択できるオプションの選択リストを導入することもできます。

このコマンドは、2番目の列に名前を含む明確な受信者のリストを生成します。

pactl list short sinks

そして、PulseAudioがテレビ受信機を見る前にスクリプトを実行する必要があります!

最終スクリプトは次のとおりです。

#!/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

おすすめ記事