是否有任何命令可以检查 PulseAudio 接收器音量。这意味着我想以百分比显示特定接收器的 PulseAudio 音量
即 50%
我已经使用命令设置了音量pactl set-sinks-volume 1 50%
。但现在我想检查它是否为 50%。
那么我该怎么做呢?
答案1
您可以使用它pactl list sinks
来获取有关接收器当前状态的信息。这将返回大量信息,包括音量。因此,要仅获取接收器 1 的音量,您可以使用:
pactl list sinks | perl -000ne 'if(/#1/){/(Volume:.*)/; print "$1\n"}'
这将返回类似这样的内容:
Volume: 0: 50% 1: 50%
上述perl
命令将打印 的详细信息sink 1
。要使用不同的接收器,请将 更改#1
为其他数字,例如#0
。
我不确定这两个是什么50%
意思,我假设它们是左右扬声器音量。因此,为了检查它们是高于还是低于特定值(假设平衡设置为“中心”,左右音量相同,因此只需检查一个),您可以执行以下操作:
pactl list sinks | perl -000lne 'if(/#1/){/Volume:.*?(\d+)%/; $1 >= 50 ? (print "y\n") : (print "n\n")}'
y
如果音量大于或等于 50,则上述代码将打印 a,n
否则打印 a。不过这一切都有点复杂,所以我将通过创建一个脚本来简化:
#!/usr/bin/env perl
## The sink we are interested in should be given as the
## 1st argument to the script.
die("Need a sink number as the first argument\n") if @ARGV < 1;
my $sink=$ARGV[0];
## If the script has been run with a second argument,
## that argument will be the volume threshold we are checking
my $volume_limit=$ARGV[1]||undef;
## Run the pactl command and save the output in
## ther filehandle $fh
open(my $fh, '-|', 'pactl list sinks');
## Set the record separator to consecutive newlines (same as -000)
## this means we read the info for each sink as a single "line".
$/="\n\n";
## Go through the pactl output
while (<$fh>) {
## If this is the sink we are interested in
if (/#$sink/) {
## Extract the current colume of this sink
/Volume:.*?(\d+)%/;
my $volume=$1;
## If the script has been run with a second argument,
## check whether the volume is above or below that
if ($volume_limit) {
## If the volume os greater than or equal to the
## value passed, print "y"
if ($volume >= $volume_limit) {
print "y\n";
exit 0;
}
else {
print "n\n";
exit 1;
}
}
## Else, if the script has been run with just one argument,
## print the current volume.
else {
print "$volume%\n";
}
}
}
将上述脚本保存为check_volume.pl
您的目录中$PATH
(例如/usr/local/bin
),使其可执行,chmod +x check_volume.pl
然后运行它,并将您感兴趣的接收器作为第一个参数:
$ check_volume.pl 1
50%
要检查音量是否高于给定的阈值,请将阈值作为第二个参数:
$ check_volume.pl 1 50
y
$ check_volume.pl 1 70
n
请注意,这假设您的系统语言是英语。如果不是,请使用更改的区域设置运行脚本:
LC_ALL=C check_volume.pl 1 50
答案2
您可以amixer
使用这样的混音器选项来读取脉冲音频音量。
$ 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]
现在我们可以使用grep
或sed
或 来解析它perl
。
$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
答案3
pactl
这实际上可能会在未来某个时间点作为 pulseaudio 命令的一部分实现(从 2021 年 1 月开始)。可能跟踪进度的地方的非完整列表: