从命令行中读出PulseAudio音量?(我要:“ pactl GET-sink-volume”)


25

我想读出我可以设置的音量

pactl set-sink-volume $SINK $VOLUME

有没有简单的方法可以做到这一点?像假设一样容易

pactl get-sink-volume $SINK

(我想做什么?我使用pactl来设置音量,它使我可以将音量设置为高于100%,这是一个坏主意(音质下降),所以我正在考虑编写一个小脚本不能超过100%。读出来。超过某个阈值?设置为100%。低于?加1%。如果还有另一种方法,很好,告诉我!最干净的解决方案可能是告诉脉冲停止达到100%。但是最初的问题仍然存在,必须有某种方法。)

如果这有什么区别,我在Debian上。


pactl list sinks给你的音量,但不是像set-sink-volume这样的简单格式。
derobert 2014年

2
Ask Ubuntu上存在一个问题,给出了一个很好的perl-oneliner来解析其体积的答案。
Andreas Wiese 2014年

@derobert谢谢,我只是grep和/或将其从那里取出!
Higemaru 2014年

@AndreasWiese谢谢,没有看到。我快速浏览了一下perl代码,但我想我只会写自己的肮脏小脚本。;-)
Higemaru 2014年

Answers:


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:由于pulseaudio的变化,我不得不稍作调整。这是我现在所拥有的:

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因为“音量:”文本可能会被本地化为用户的语言。
Marius Gedminas

由于我只有一个水槽,因此在Bash脚本中对我有用:volume=$(pactl list sinks | grep Volume | head -n1 | awk '{print $5}')
Matthias Braun

11

如果您没有使用其他程序的限制,则可以使用pamixer

您可以通过以下方式获得音量:

$ pamixer --get-volume

4
在Debian中,您可以使用该pulsemixer软件包。看起来差不多。
Josef Kufner

8

请注意,Tommi Kyntola的答案取决于使用的接收器,因此您实际上可以获取接收器编号。

另请注意,它依赖于命名接收器索引与计数索引相同。比方说,例如,我们有3个接收器1、2和3,而3是我们选择的接收器,然后断开数字2,剩下1和3。现在您不能指望Tommi Kyntola的解决方案可以接收3个,因为pactl list sinks | grep "^[[:space:]]Volume:"将仅输出2个“体积”字段,因此通过管道连接到头/尾以得到$SINK + 1 'th线是行不通的。

我的解决方案基于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"
Monica Cellio的MountainX'Apr

4

为了获得一卷我正在尝试这个:

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

3
注意:“卷”是母语翻译的,因此仅适用于英语系统。

3
如果您有多个接收器,这将提供多行输出。
2014年

4

多语言变体:

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

在pactl 5.0上测试


您能补充说明吗?
代码Bling

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这样的混音器选项来读取PulseAudio音量。

$ 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]

现在,我们可以使用解析它grepsedperl

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.