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

Hig*_*aru 39 command-line pulseaudio

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

pactl set-sink-volume $SINK $VOLUME
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法来做到这一点?像假设一样简单

pactl get-sink-volume $SINK
Run Code Online (Sandbox Code Playgroud)

?

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

如果这有什么不同,我在 Debian 上。

截至 2021 年初,似乎正在进行在 pactl 中实现此功能的工作。感谢 Klaas van Schelven 指出这一点。

Tom*_*ola 26

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

这就是我所拥有的。它并不整洁,但对我来说已经足够了。我找不到办法做到这一点。在pactl刚刚似乎并没有得到有上市的任何手段只有一个水槽,但它们都打印在按升序排列。这样就可以使用tailand选择第 n 行head。请注意,音量线可能具有用于左右声道的单独音量,并且sed替代品仅选择第一个,因为我只需要那个。

作为记录,我使用pactl list sinks short来获取我的活动接收器编号:

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

编辑 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,' )
Run Code Online (Sandbox Code Playgroud)

我已MOD设置为 +10 或 -10,并进行了一些边界检查,最后:

pactl set-sink-volume $SINK ${MOD}%
Run Code Online (Sandbox Code Playgroud)

  • 为了健壮性,我建议`LC_ALL=C pactl list sinks | grep` 因为“Volume:”文本可能被本地化为用户的语言。 (3认同)

小智 18

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

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

$ pamixer --get-volume
Run Code Online (Sandbox Code Playgroud)

  • 在 Debian 中,您可以使用 `pulsemixer` 包。它看起来差不多。 (6认同)

小智 12

请注意,Tommi Kyntola 的回答依赖于正在使用的接收器,以便您可以实际获得接收器编号。

另请注意,它依赖于命名接收器索引与计数索引相同。比方说,例如,我们有 3 个接收器 1、2 和 3,其中 3 是我们选择的接收器,然后我们断开数字 2,留下 1 和 3。现在你不能用 Tommi Kyntola 的解决方案计算接收 3,因为pactl list sinks | grep "^[[:space:]]Volume:"只会输出 2 个 Volume 字段,因此通过管道连接到头/尾以获得第$SINK + 1'th 行将不起作用。(我经历过这个 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
Run Code Online (Sandbox Code Playgroud)

注意:我不知道音量字段是否不同,我的看起来像这样(来自pacmd list-sinks):

volume: front-left: 42706 /  65% / -11.16 dB,   front-right: 42706 /  65% / -11.16 dB
Run Code Online (Sandbox Code Playgroud)

此外,我仅以百分比格式(即字段 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 set-sink-volume $(getdefaultsinkname) $1
}
Run Code Online (Sandbox Code Playgroud)


Set*_*lco 8

如果您有 PulseAudio 15.0 或更高版本,它包含命令get-sink-volume,可以使用该命令相当干净地完成此操作。

我们将使用它@DEFAULT_SINK@来获取默认接收器,这可能就是您想要的,除非您已将软件专门设置为不使用默认值。然后我们将使用它的输出作为 的参数get-sink-volume。之后,我们只需 grep 输出即可提取音量百分比,然后用于head仅获取结果之一。

pactl get-sink-volume @DEFAULT_SINK@ | grep -Po '\d+(?=%)' | head -n 1
Run Code Online (Sandbox Code Playgroud)

上面命令的编写方式假定左右扬声器的音量相同,但如果情况并非如此,您可能需要对其进行调整。

语境

它于 2020 年 12 月 7 日在 PR 中合并到 PulseAudio。

https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/430

对于 Debian 用户

在撰写此评论时,DebianStable 仍仅在 PulseAudio 14 上运行,但是如果您愿意将存储库切换到DebianTesting,则可以使用 PulseAudio 16。


小智 5

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

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

  • 注意:'Volume' 是本地语言翻译,因此它仅适用于英语系统。 (3认同)
  • 如果您有多个接收器,这将提供多行输出。 (3认同)

小智 5

多语言变体:

\n\n
pactl list sink-inputs | \\\ngrep -A15 -P "(\\#|\xe2\x84\x96)$SINK" | \\\ngrep -P "\\d+\\s*\\/\\s*\\d+\\%" | \\\nhead -1 | \\\nawk "{print \\$5}"\n
Run Code Online (Sandbox Code Playgroud)\n\n

在pactl 5.0上测试

\n


小智 5

由于我还不能评论(专门注册以改进@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
}
Run Code Online (Sandbox Code Playgroud)