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