Pulseaudio 具有两个音源,可降低其中一个音源的音量

Pulseaudio 具有两个音源,可降低其中一个音源的音量

我在 Firefox 中观看 NHL 季后赛,但在广告期间,我正在测试我正在开发的音乐播放器。我在广告期间“取消暂停”我的音乐播放器,因此 pulseaudio 中有两个声源在播放。我希望我的音乐播放器(python 名称mserve)比 Firefox 具有“声源优先级”。

目前,当 mserve 正在播放时,pulseaudio 似乎已经将 Firefox 的声音调暗了一点。声音调暗大概是 20% 到 40%?我怎样才能增加这个值,使 pulseaudio 将 Firefox 的声音调暗 60% 到 80%?

如果有软件可以自动识别广告何时开始,例如声音增益增加或人耳听不到的商业追踪软件激活后,我就不用在广告开始时单击“播放”或在曲棍球比赛恢复时单击“暂停”。

笔记:我认为它是pulseaudio,并且不会alsa在双输入流声音混合器中承担繁重的工作。我不是在寻找 GUI 声音混合器,而是寻找 bash 或 python 解决方案。

答案1

简短答案

在 Unix & Linux 网站上我发现了这个问答:

首先获取接收器的简短列表:

$ pactl list short sink-inputs

1545    0   1083    protocol-native.c   float32le 2ch 48000Hz
1556    0   1083    protocol-native.c   float32le 2ch 48000Hz
1688    0   1083    protocol-native.c   float32le 2ch 44100Hz
1698    0   1455    protocol-native.c   s16le 2ch 44100Hz

从上面的命令中删除short以确认 Firefox(在我的情况下)实际上是1688。我的音乐播放器刚刚加载并且是最后输入:1698。当我在音乐播放器上按下播放键时,我将 Firefox 音量设置为 40%:

$ pactl set-sink-input-volume 1688 40%

当按下音乐播放器上的暂停键时,我使用以下命令将 Firefox 音量重置为 100%:

$ pactl set-sink-input-volume 1688 100%

长答案

40%音量不够柔和所以25%被使用。

声源可能存在多个实例,Firefox因此需要将它们全部静音。

最终的代码如下:

    def hockey_commercial(self):
        ''' 
        Commercial button plays music for 90 seconds then pauses.
        '''
        if self.play_hockey_active is True:
            return                          # Already running, don't restart
        self.play_hockey_active = True
        self.play_hockey_secs = 90
        self.play_hockey_remaining = self.play_hockey_secs
        self.play_soften_firefox()          # Soften volume of commercials
        self.play_hockey_tstart = time.time()
        if self.pp_state is "Paused":
            self.pp_toggle()                # Play music during commercials

    def play_soften_firefox(self):
        result = []
        self.play_firefox_indices = []
        result = os.popen('pactl list short sink-inputs') \
                          .read().strip().splitlines()
        count = len(result)
        if count < 2:
            print('result missing firefox:',result)
            return

        # Firefox may have multiple entries
        for line in result:
            sink = line.split('\t')[0]
            app = os.popen('pactl list sink-inputs | grep "Sink Input #' + \
                            sink + '" -A20 | grep application.name').read()
            if "Firefox" in app:
                self.play_firefox_indices.append(sink)
                result = os.popen('pactl set-sink-input-volume ' + \
                                    sink + ' 25%') \
                                    .read().strip().splitlines()

如果你好奇它在运行时是什么样子的(请谅解我的第二个程序):

mserve 商业版.gif

  • 观看曲棍球比赛时音乐播放器暂停
  • 当广告开始时,点击带有曲棍球棒角色的广告按钮
  • 按钮文字变为剩余时间倒计时
  • Firefox 的音量被削减至 25%,几乎听不见
  • 音乐开始以正常音量播放
  • 当倒计时归零时,音乐暂停,Firefox 音量恢复
  • 您仍然可以在倒计时期间按暂停/播放

相关内容