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
刚刚似乎并没有得到有上市的任何手段只有一个水槽,但它们都打印在按升序排列。这样就可以使用tail
and选择第 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)
小智 18
如果您没有使用其他程序的限制,则可以使用pamixer
.
您可以通过以下方式获取音量:
$ pamixer --get-volume
Run Code Online (Sandbox Code Playgroud)
小智 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)
如果您有 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
在撰写此评论时,DebianStable 仍仅在 PulseAudio 14 上运行,但是如果您愿意将存储库切换到DebianTesting,则可以使用 PulseAudio 16。
小智 5
为了获得一卷,我正在尝试这个:
echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`
Run Code Online (Sandbox Code Playgroud)
小智 5
多语言变体:
\n\npactl 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)
归档时间: |
|
查看次数: |
46809 次 |
最近记录: |