如何在播放不同音频源时降低背景音乐流的音量?

pan*_*mon 8 pulseaudio

使用 PulseAudio 可以在应用程序的基础上管理音量,但我发现手动进行几乎没有用。我宁愿拥有以下内容:我通常在听音乐,但有时我想观看 YouTube 视频 - 然后我必须手动暂停或降低音乐的音量,我经常忘记重新打开它视频结束了。

当另一个应用程序播放声音时,我需要做什么来自动降低音频流(背景音乐)的音量?

Gra*_*eme 4

没有太多答案,但我不妨描述一下我发现的问题/可能性。

我看不出有什么方法可以为此编写 shell 脚本。没有(已记录的)方法可以使用pactl/更改每个应用程序的卷pacmd。我也看不到任何方法来判断何时添加新客户端,而无需重复进行轮询,例如:

pactl list short clients
Run Code Online (Sandbox Code Playgroud)

脉冲音频可以设置为 log through syslog,因此一种可能性是使用一个名为 via 的脚本rsyslog(如果发行版有)。请参阅我的回答以了解如何执行此操作的指示。这当然取决于pulseaudio有关新客户的日志信息。

这绝对是可行的,该pavucontrol程序是此类事情的一个很好的例子。然而,目前看起来没有 CLI 可以做同样的事情,所以它可能需要一个更直接的 API 接口pulseaudio

更新

查看@derobert 的链接,角色闪避模块很容易启用,但它需要指定media.role属性。无论如何我都找不到看看这些是什么!它们很可能没有为很多流定义(许多程序仍然认为它们正在使用 ALSA)。如果有某种方法列出这些并可能将它们配置为分配(可能基于进程的名称),这将是最简单的方法。

更新2

media.role可以通过环境变量设置PULSE_PROP。例如:

PULSE_PROP='media.role=music' play some_music.mp3 &
pactl list clients | grep -C 10 'media.role = "music"'
Run Code Online (Sandbox Code Playgroud)

这可以通过编辑文件和/或创建包装脚本来为不同的应用程序设置.desktop,但这似乎不是一个很好的方法。

  • 有一个记录的 CLI 用于更改每个客户端的卷...例如“pactl set-sink-input-volume 1384 100%”,其中 1384 是客户端编号。秘密在于,对于播放客户端,它们被称为“接收器输入”(对于录制客户端,它们被称为“源输出”)。 (3认同)