5

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

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

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

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

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

3 回答 3

8

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

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

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

于 2011-03-02T13:58:15.177 回答
1

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"
                ...

但是,它不会为您提供当前的监视器级别(当前正在播放的音频的音量),但也许就足够了吗?

于 2011-03-02T12:43:46.570 回答
0

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

于 2011-03-02T00:57:46.537 回答