从命令行读取脉冲音频音量? (我想要:“pactl GET-sink-volume”)

从命令行读取脉冲音频音量? (我想要:“pactl GET-sink-volume”)

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

pactl set-sink-volume $SINK $VOLUME

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

pactl get-sink-volume $SINK

(我想要做什么?我使用 pactl 来设置音量,它让我将音量设置为高于 100%,这是一个坏主意(音质会下降),所以我正在考虑编写一个小脚本,它将不超过 100%。超过某个阈值吗?如果有另一种方法可以做到这一点,最好告诉我! 100%,但原来的问题仍然存在,一定有某种方法..)

如果这有什么区别的话,我使用的是 Debian。

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

看来现在(2022 年末)有一个pactl get-sink-volume命令。

答案1

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}%

答案2

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

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

$ pamixer --get-volume

答案3

请注意,Tommi Kyntola 的答案依赖于正在使用的水槽,以便您实际上可以获得水槽编号。

另请注意,它依赖于命名接收器索引与数过的指数。举例来说,我们有 3 个接收器 1、2 和 3,其中 3 是我们选择的接收器,然后我们断开编号 2 的连接,只剩下 1 和 3。现在您无法使用 Tommi Kyntola 的解决方案数到接收器 3,因为pactl list sinks | grep "^[[:space:]]Volume:"只会输出 2 个 Volume 字段,因此管道到 head/tail 来获取第$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

注意:我不知道体积字段是否不同,我的看起来像这样(来自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 set-sink-volume $(getdefaultsinkname) $1
}

答案4

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

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

相关内容