我想读出我可以设置的音量级别
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
答案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}'`