检查 PulseAudio 接收器音量

检查 PulseAudio 接收器音量

是否有任何命令可以检查 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]

现在我们可以使用grepsed或 来解析它perl

$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%

答案3

pactl这实际上可能会在未来某个时间点作为 pulseaudio 命令的一部分实现(从 2021 年 1 月开始)。可能跟踪进度的地方的非完整列表:

相关内容