如何在播放过程中使用“pacmd set-default-sink”更改 pulseaudio 接收器?

如何在播放过程中使用“pacmd set-default-sink”更改 pulseaudio 接收器?

我需要切换当前播放音频流的 pulseaudio 服务器。

Pulseaudio 服务器的 IP 设置为 192.168.1.105

$>cat /etc/pulse/default.pa
...
load-module module-esound-protocol-tcp auth-anonymous=1
load-module module-native-protocol-tcp auth-anonymous=1
load-module module-zeroconf-publish
...

在源端,VLC 媒体播放器正在播放一首歌曲。

我在源端使用 pulseaudio 创建了一个新的隧道接收器。

pacmd load-module module-tunnel-sink server=192.168.1.105
pacmd set-default-sink 1

但是在播放音频时服务器不能立刻切换,只有停止播放器再播放才可以。

从“gnome-volume-control”或“gnome-control-center sound”可以立即切换输出设备。

如何在播放声音文件期间从命令行立即切换输出接收器?

答案1

当接收器输入中有正在播放的流时, PulseAudiopacmd无法切换默认接收器。不过,仍有一种方法可以实现这一点。

从命令行更改默认接收器

首先,我们需要确定要切换的接收器的索引号。这可以通过调用以下方法完成:

pacmd list-sinks

根据我们的系统,这将为您提供当前可访问的接收器和属性的或多或少的长列表:

 >>> 2 sink(s) available.
      * index: 0
            name: <alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1>
            driver: <module-alsa-card.c>
    :
    :
        index: 1
            name: <alsa_output.pci-0000_00_14.2.analog-stereo>
            driver: <module-alsa-card.c>

此处给出的indexname是我们通过命令行寻址接收器所需的内容。当前默认接收器标有星号(此处0)。

为了能够从命令行切换默认接收器,我们可能需要禁用流目标设备恢复将相应行编辑/etc/pulse/default.pa为:

pacmd load-module module-stream-restore restore_device=false

要将默认输出接收器更改为接收器,1我们运行

pacmd set-default-sink 1

可以通过打开声音设置菜单。

将流移动到另一个接收器

当我们有一个活动的输入流正在播放到给定接收器时,更改默认接收器没有效果。这应该通过将该输入移动到另一个接收器来完成。

pacmd list-sink-inputs

将告诉我们输入流的索引

>>> 1 sink input(s) available.
    index: 5
    driver: <protocol-native.c>

我们现在知道我们想通过调用将输入流移动5到接收器1

pacmd move-sink-input 5 1

或者如果我们愿意的话,也可以返回到接收器0。这将立即完成,无需停止播放。

在游戏过程中更改默认接收器

当然,我们可以组合这两个命令,在播放过程中立即切换默认接收器,例如

pacmd set-default-sink 1 & pacmd move-sink-input 5 1

这种方法的一个缺点是输入流索引发生变化每次我们停止并重新启动音乐播放器时。因此,在使用命令行进行切换之前,我们总是必须找出当前的流索引。

答案2

我编写了一个简单的脚本来自动移动所有的接收器输入pacmd

用法:./move-sink-inputs.sh <sink number>

#!/usr/bin/env bash

echo "Setting default sink to: $1";
pacmd set-default-sink "$1"
pacmd list-sink-inputs | grep index | while read -r line; do
  echo "Moving input: ";
  echo "$line" | cut -f2 -d' ';
  echo "to sink: $1";
  pacmd move-sink-input "$(echo "$line" | cut -f2 -d' ')" "$1"
done

答案3

改进版本@Gaco 脚本

#!/usr/bin/env bash

case "${1:-}" in
  (""|list)
    pacmd list-sinks |
      grep -E 'index:|name:'
    ;;
  ([0-9]*)
    echo switching default
    pacmd set-default-sink $1 ||
      echo failed
    echo switching applications
    pacmd list-sink-inputs |
      awk '/index:/{print $2}' |
      xargs -r -I{} pacmd move-sink-input {} $1 ||
        echo failed
    ;;
  (*)
    echo "Usage: $0 [|list|<sink name to switch to>]"
    ;;
esac

我的运行时副本是在 github 上它还包括自动切换主通道为了kmix

答案4

圆形肘节水槽。

Gaco 脚本只需再加一条线即可循环切换可用的接收器。

#!/bin/bash 

new_sink=$(pacmd list-sinks | grep index | tee /dev/stdout | grep -m1 -A1 "* index" | tail -1 | cut -c12-)

echo "Setting default sink to: $new_sink";
pacmd set-default-sink $new_sink
pacmd list-sink-inputs | grep index | while read line
do
echo "Moving input: ";
echo $line | cut -f2 -d' ';
echo "to sink: $new_sink";
pacmd move-sink-input `echo $line | cut -f2 -d' '` $new_sink

done

相关内容