커맨드 라인에서 펄스 오디오 볼륨을 읽으시겠습니까? (나는 원한다 :“pactl GET- 싱크-볼륨”)


25

설정할 수있는 볼륨 레벨을 읽고 싶습니다

pactl set-sink-volume $SINK $VOLUME

그렇게하는 쉬운 방법이 있습니까? 가설만큼 쉬운

pactl get-sink-volume $SINK

?

(내가하려는 일? pactl을 사용하여 볼륨을 설정하면 볼륨이 100 % 이상으로 설정되어 나쁜 생각입니다 (음질이 떨어집니다). 그래서 작은 스크립트를 작성하려고합니다. 100 %를 넘지 말고 읽어보십시오. 일부 임계 값을 초과 했습니까? 100 %로 설정하십시오. 아래? 1 %를 추가하십시오. 다른 방법이 있다면 말 해주세요! 100 %로. 그러나 원래의 질문은 여전히 ​​남아 있습니다.)

차이가 나는 데비안에 있습니다.


pactl list sinks볼륨을 제공하지만 set-sink-volume과 같은 쉬운 형식은 아닙니다.
derobert

2
Ask Ubuntu 에 대한 질문이 있는데 , 이것에서 볼륨을 구문 분석하는 멋진 펄 -oneliner를 제공합니다.
Andreas Wiese

@derobert 감사합니다, 나는 그냥 grep 및 / 또는 그것을 밖으로 sed 것입니다!
Higemaru

@AndreasWiese 감사합니다, 그것을 보지 못했습니다. 나는 펄 코드를 한 눈에 보았지만 내 자신의 더러운 작은 스크립트를 작성할 것이라고 생각한다. ;-)
Higemaru

답변:


19
pactl list sinks | grep '^[[:space:]]Volume:' | \
    head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,'

그것이 내가 가진 것입니다. 깔끔하지는 않지만 사용하기에 충분했습니다. 나는 그것을 할 수 있는 길 을 찾지 못했습니다 . 은 pactl하나는 싱크만을위한 목록을 가져 오는 수단이하지 않는 것,하지만 그들은 오름차순으로 인쇄됩니다. 그래서 tail와를 사용하여 n 번째 줄을 선택합니다 head. 볼륨 라인에는 오른쪽 및 왼쪽 채널에 대해 별도의 볼륨이있을 수 있으며 그 sed대신에 첫 번째 채널 만 선택합니다.

기록 pactl list sinks short을 위해 활성 싱크 번호를 얻기 위해를 사용합니다 .

pactl list short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'

2017-10-05 편집 : 펄스 오디오의 변화로 인해 약간 조정해야했습니다. 여기 내가 지금 가진 것입니다 :

SINK=$( pactl list short sinks | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,' | head -n 1 )
NOW=$( pactl list sinks | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,' )

나는 MOD+10 또는 -10으로 설정하고 경계 검사를하고 마침내 :

pactl set-sink-volume $SINK ${MOD}%

1
감사! 액티브 싱크 번호를 얻으려면, 내가 사용하는 데 필요한 pactl list sinks short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'- 추가 sinks사이 pactl listshort
코식

견고성을 LC_ALL=C pactl list sinks | grep위해 "Volume :"텍스트가 사용자의 언어로 현지화 될 수 있기 때문에 제안 합니다.
Marius Gedminas

싱크가 하나뿐이므로 Bash 스크립트에서 다음과 같이 작동했습니다.volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun

11

다른 프로그램을 사용하는 데 제한이 없으면이 있습니다 pamixer.

다음을 통해 볼륨을 얻을 수 있습니다.

$ pamixer --get-volume

4
데비안에서는 pulsemixer패키지를 사용할 수 있습니다 . 같은 모양입니다.
Josef Kufner

8

Tommi Kyntola의 답변은 실제로 싱크 번호를 얻을 수 있도록 싱크를 사용하고 있다는 점에 유의하십시오.

또한 명명 된 싱크 인덱스를 사용하여 계산 된 인덱스 와 동일해야합니다 . 예를 들어, 세 개의 싱크 1, 2 및 3이 있고 3이 선택된 싱크라고 가정하고 2를 분리하여 1과 3으로 남겨 둡니다. 이제 Tommi Kyntola의 솔루션으로 3을 싱크 할 수 없습니다. pactl list sinks | grep "^[[:space:]]Volume:"2 개의 볼륨 필드 만 출력하므로 $SINK + 1'라인 을 얻기 위해 헤드 / 테일로 파이프가 작동하지 않습니다. (이 irl을 경험했습니다.

내 솔루션은 pacmd가 항상 특정 순서로 싱크를 나열한다는 가정에 따라 작동합니다. 보다 안정적인 솔루션을 원하면 출력을 구문 분석해야합니다.

#!/bin/sh

# Get the index of the selected sink:
getsink() {
    pacmd list-sinks |
        awk '/index:/{i++} /* index:/{print i; exit}'
}

# Get the selected sink volume
getvolume() {
    pacmd list-sinks |
        awk '/^\svolume:/{i++} i=='$(getsink)'{print $5; exit}'
}

getvolume

참고 : 볼륨 필드가 다른지 모르겠습니다 pacmd list-sinks.

volume: front-left: 42706 /  65% / -11.16 dB,   front-right: 42706 /  65% / -11.16 dB

또한 첫 번째 채널 (왼쪽 앞)의 비율 만 백분율 형식으로 표시합니다 (예 : 필드 5). 채널의 레벨이 다를 수 있습니다.


편집하다:

두 번째로 생각하면 실제로 pacmd stat덜 복잡한 솔루션 의 기본 싱크 이름을 얻고 싶을 것입니다 .

#/bin/sh
getdefaultsinkname() {
    pacmd stat | awk -F": " '/^Default sink name: /{print $2}'
}

getdefaultsinkvol() {
    pacmd list-sinks |
        awk '/^\s+name: /{indefault = $2 == "<'$(getdefaultsinkname)'>"}
            /^\s+volume: / && indefault {print $5; exit}'

}

setdefaulsinkvol() {
    pactl $(getdefaultsinkname) $1
}

감사! 두 번째 솔루션은 훌륭합니다. 그러나 setdefaulsinkvol ()은 다음과 같아야합니다.pactl set-sink-volume $(getdefaultsinkname) "$1"
MountainX

4

볼륨을 얻기 위해 이것을 시도하고 있습니다.

echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`

3
참고 : '볼륨'은 자국어로 번역되므로 영어 시스템에서만 작동합니다.

3
싱크가 여러 개인 경우 여러 줄로 출력됩니다.
tremby

4

다국어 변형 :

pactl list sink-inputs | \
grep -A15 -P "(\#|№)$SINK" | \
grep -P "\d+\s*\/\s*\d+\%" | \
head -1 | \
awk "{print \$5}"

pactl 5.0에서 테스트


설명을 추가 할 수 있습니까?
코드 블링

4

내가 아직 언급 할 수 없기 때문에 (@jgr의 대답을 향상시키기 위해 특별히 서명) 기본 싱크가 플러그인 (모든 수의 ladspa 플러그인과 같은) 인 경우 편집 솔루션은 XX %를 반환합니다 (마지막 쉼표 참고) ), 이것은 그보다 조금 더 잘 작동합니다. 죄송합니다, awk-fu는 매우 기본적입니다. 더 좋은 방법이있을 것입니다.

수정 된 솔루션은 유지해야 할 요지가 없으므로 '%'를 생략하고 숫자를 반환하면 수학에서 사용할 수 있습니다. 또한 setvol 케이스를 수정했는데, 필자의 경우 특정 지침이 필요합니다.

#/bin/sh
getdefaultsinkname() {
    pacmd stat | awk -F": " '/^Default sink name: /{print $2}'
}

getdefaultsinkvol() {
    pacmd list-sinks |
        awk '/^\s+name: /{indefault = $2 == "<'$(getdefaultsinkname)'>"}
            /^\s+volume: / && indefault {print $5; exit}' |
        awk -F"%" '{print $1}'
}

setdefaultsinkvol() {
    pactl -- set-sink-volume $(getdefaultsinkname) $1
}

2

amixer이와 같은 믹서 옵션을 사용하여 펄스 오디오 볼륨을 읽는 데 사용할 수 있습니다 .

$ amixer -c $CARD -M -D $MIXER get $SCONTROL
# CARD is your sound card number, mixer is either alsa or pulse and scontrol is the alsa device name, Master if you want to use pulse.
$ amixer -c 1 -M -D pulse get Master

Simple mixer control 'Master',0
  Capabilities: pvolume pswitch pswitch-joined
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 65536
  Mono:
  Front Left: Playback 27662 [42%] [on]
  Front Right: Playback 27662 [42%] [on]

이제 우리는 사용하여 분석 할 수 grep또는 sedperl.

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.