명령줄을 통해 특정 애플리케이션의 음악을 특정 사운드 출력으로 보내기

명령줄을 통해 특정 애플리케이션의 음악을 특정 사운드 출력으로 보내기

내 사용 사례:

저는 홈 오피스에서 근무하며 헤드폰과 일부 웹 회의 서비스를 사용하여 동료들과 지속적인 커뮤니케이션을 유지합니다. 외부 소음에 주의가 산만해지거나 짜증이 나지 않도록 같은 컴퓨터에서 음악도 재생합니다.

하이파이 스피커를 통해 음악을 재생하고 싶습니다. 이렇게 하면 의사소통을 방해하지 않는 신중한 배경 음악을 재생할 수 있습니다. 게다가 집중력도 향상되는 데 도움이 됩니다.

하지만 이 앱 은 pavucontrol기본 출력을 전환하지 않기 때문에 문제가 있는 것 같습니다(나중에 음악 플레이어만 다른 스피커로 라우팅). 다른 믹서 앱(내 경우에는 Cinnamon "Sound" 애플릿)을 사용해야 하고 두 믹서 사이를 전환하여 모든 것을 설정해야 합니다. 어떤 이유로 하이파이 연결이 끊기거나 음악이 중단되는 경우 이 모든 작업을 반복하세요.

그래서 저는 주로 특정 앱 하나를 사용하여 음악을 재생하기 때문에 방법을 찾아보았습니다.빠르게노선오직이 앱은 내 하이파이로 사운드를 출력합니다.

답변1

다음 bash 스크립트는 내 시나리오의 문제를 해결했습니다. 저는 음악을 재생하는 데에만 Brave 브라우저를 사용합니다(다른 콘텐츠에는 다른 브라우저를 사용합니다). 내 하이파이는 블루투스를 통해 연결된 서라운드 수신기입니다.

#!/bin/bash
    
# Collect all sinks
sinkList=$(pactl list sinks | tr '\n' '\r' | perl -pe 's/Sink #([0-9]+).+?device\.description = "([^\r]+)"\r.+?(?=Sink #|$)/\1:"\2",/g' | tr '\r' '\n')
IFS="," read -a sinksArray <<< "$sinkList"

# Is our Hi-fi sink available? → Use for loop with indexes to handle spaces in names
for ((i = 0; i < ${#sinksArray[@]}; i++)); do
  sink="${sinksArray[$i]}"
  #echo "sink found: $sink"

  # Search for this output device's name
  [[ "$sink" =~ "Philips HTB" ]] && hifiSinkIndex=$(echo $sink | cut -d':' -f1)
done

if [[ $hifiSinkIndex ]]; then
  echo "Hi-fi sink has index $hifiSinkIndex"

  # Collect all sound streams
  musicSourcesList=$(pactl list sink-inputs | tr '\n' '\r' | perl -pe 's/Sink Input #([0-9]+).+?application\.process\.binary = "([^\r]+)"\r.+?(?=Sink Input #|$)/\1:\2\r/g' | tr '\r' '\n')

  for soundSource in $musicSourcesList; do
    binary=$(echo $soundSource | cut -d':' -f2);
    index=$(echo $soundSource | cut -d':' -f1);
    #echo "index: $index, binary: $binary";

    # Brave browser is our music player, so we only care about that
    if [[ "$binary" == "brave" ]]; then
      echo "moving Brave output to $hifiSinkIndex"
      pactl move-sink-input $index $hifiSinkIndex
    fi
  done
else
  echo "Hi-fi sink was not found"
fi

찾고 있는 발표자 이름과 응용 프로그램을 찾기 위해 스크립트를 쉽게 조정할 수 있습니다.

필요할 때만 실행을 클릭할 수 있도록 이 스크립트에 대한 바로가기를 패널에 추가했습니다.

pactl포장과 함께 제공됩니다 pulseaudio-utils. 를 사용하면 pacmd명령이 비슷해집니다.

출처와 영감:

  • 원래 pacmd쿼리:이 답변작성자: phil294
  • for 루프는 공백이 있는 배열 값을 반복합니다.이 답변댄 파이기

관련 정보