【问题标题】:how to read out volume level of clients of pulseaudio in the console如何在控制台中读取pulseaudio客户端的音量级别
【发布时间】:2011-06-30 03:19:40
【问题描述】:

我想为pulseaudio的几个客户读出此刻播放的音频的音量。

我想解决的问题如下: 我正在用 xmms 听音乐,然后我把它暂停,听一首朋友在 youtube 上发给我的歌。一个小时后,我突然发现我没有在听任何音乐!

我想到的(非常基本的)解决方案是一个 bash 脚本,它每秒检查除 xmms 以外的所有应用程序的音量,如果任何应用程序正在发出声音,则 xmms 暂停,如果没有声音,则 xmms静音,启用 xmms。 (我确实希望能够在应用程序方面做到这一点,例如,应该忽略 pidgin)

我只能找到读取音量的图形工具,例如 pavucontrol,它可以很好地显示音量。我真的不想编写各种C程序来做这么简单的事情,所以:

  1. 我的想法是正确的,还是有更简单的解决方案
  2. 如果没有,我如何读取单独应用程序的当前音量级别

【问题讨论】:

    标签: linux console pulseaudio


    【解决方案1】:

    也许您可以从输出流中录制一个音频样本,看看它是否(接近)0。此管道为您提供单个样本,其形式为 -32768 和 32767(含)之间的数字:

    parec --raw --channels=1 --latency=2 2>/dev/null | od -N2 -td2 | head -n1 | cut -d' ' -f2- | tr -d ' '
    

    您需要调整 parec 参数,可能还需要调整 PulseAudio 配置,以利用输出流并从中记录。

    【讨论】:

    • parec --device=0 --latency=2 --channels=1 | od -N2 -td2 |头-n1 |剪切 -d' ' -f2- | tr -d''| perl -pe 's/^-//' 给出 xmms (sink 0) 是否正在播放。现在我只需要将它包装在一个脚本中。谢谢!
    • 很棒的解决方案。谢谢。
    • 我遇到了一个问题,OD 命令抛出错误'write() failed: Broken pipe' 有已知且简单的解决方案吗?
    • 我和@Vilsol 有同样的问题.. 没有解决方案? :((
    • @Surferonthefall 不是od,而是parecod 关闭其输入管道(即parec 的输出管道)时打印此错误。我没有办法告诉parec 只记录一个样本,但我会以某种方式编辑以抑制错误消息。
    【解决方案2】:

    pactl list 转储了...的列表,看起来几乎所有内容。使用正在运行的 mplayer -ao pulse 实例,我在输出中得到以下内容:

    Sink Input #2
            Driver: protocol-native.c
            Owner Module: 8
            Client: 10
            Sink: 0
            Sample Specification: s16le 2ch 44100Hz
            Channel Map: front-left,front-right
            Mute: no
            Volume: 0: 100% 1: 100%
                    0: 0.00 dB 1: 0.00 dB
                    balance 0.00
            ...
            Properties:
                    media.name = "audio stream"
                    application.name = "MPlayer"
                    native-protocol.peer = "UNIX socket client"
                    ....
                    application.process.binary = "mplayer"
                    ...
    

    虽然它不会为您提供当前的监听电平(当前播放音频的音量),但也许就足够了?

    【讨论】:

    • 其实目前的监听级别正是我所需要的。一个典型的情况是一个打开的浏览器和一个 youtube 电影。我需要知道那部电影是在发声还是已经完结。如果它没有发出声音,我的音乐应该会再次响起,所以我需要检测实际的当前监听电平...
    【解决方案3】:

    我什至不会费心阅读这些卷。我会编写一个模块,其中包含一个接收器,该接收器检测连接到它的应用程序的数量并可以基于它执行操作,以及一个虚拟应用程序,您可以将其定向到现有接收器以进行最终音频输出。

    【讨论】:

    • 但是这样的应用程序/库不是很容易获得吗?关键是我可以看到那些卷在我面前跳舞,所以我认为这将是获取正确的库调用/调用正确的脚本/程序的问题,但我找不到任何东西。这只是一个爱好项目,所以我花费的时间应该不会超过一个小时..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多