更改Shell的PulseAudio输入/输出?


38

除了扬声器和普通麦克风外,我还有一套不错的无线耳机,不时使用。

我想编写一个脚本,以在一个输入和输出源与另一个输入和输出源之间切换,实际上是在耳机和扬声器+麦克风之间切换。

我想在这之间进行更改:

...和这个:

我有办法脚本在两个输入和输出之间进行转换吗?本质上,我正在寻找这样的东西:

CURRENT_INPUT="$(get-current-input-name)"
CURRENT_OUTPUT="$(get-current-output-name)"

if [ "$CURRENT_INPUT" == "Vengeance 2000" ]; then
    set-current-input "HD Pro Webcam C920"
else 
    set-current-input "Vengeance 2000"
fi

if ["$CURRENT_OUTPUT" == "Vengeance 2000" ]; then
    set-current-output "Built-in Audio"
else
    set-current-output "Vengeance 2000"
fi

有没有办法编写脚本?


3
您可以查看man pactlPulseAudio命令行选项。
Teresa e Junior

题外话:这些屏幕截图上的GUI应用程序是什么?
WhyNotHugo 2013年

这是基本的系统设置。
Naftuli Kay

Answers:


53

正如@ Teresa-e-Junior指出的pactl是要使用的工具:

首先,我们可能想要获取PA接收器的ID。在我的系统上,这是我得到的:

$ pactl list short sinks
0       alsa_output.pci-0000_01_00.1.hdmi-surround      module-alsa-card.c      s16le 6ch 44100Hz  SUSPENDED
1       alsa_output.pci-0000_00_1b.0.analog-stereo      module-alsa-card.c      s16le 2ch 44100Hz  RUNNING

接收器1当前是我的默认接收器。
但是现在我希望所有当前和将来的流都可以通过HDMI播放(即接收器0)。

有一个命令可以为PulseAudio设置默认接收器,但是它对我的PC似乎没有任何影响:

$ pacmd set-default-sink 0 #doesn't work on my PC :(

取而代之的是,新的流似乎已连接到最近有流移动到的接收器。

因此,让我们告诉pactl将所有当前正在播放的流移动到sink 0。我们首先需要列出它们:

$ pactl list short sink-inputs
290     1       176     protocol-native.c       float32le 2ch 44100Hz
295     1       195     protocol-native.c       float32le 2ch 44100Hz

好的,我们有两个流(ID 290和295)都连接到sink 1
让我们将它们下沉0

$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0

所以,应该是这样。现在,我们只需要编写一个脚本即可为我们完成工作:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: $0 <sinkId/sinkName>" >&2
    echo "Valid sinks:" >&2
    pactl list short sinks >&2
    exit 1
fi

newSink="$1"

pactl list short sink-inputs|while read stream; do
    streamId=$(echo $stream|cut '-d ' -f1)
    echo "moving stream $streamId"
    pactl move-sink-input "$streamId" "$newSink"
done

您可以使用接收器ID或接收器名称作为参数来调用它(即0或之类的alsa_output.pci-0000_01_00.1.hdmi-surround)。

现在,您可以将此脚本附加到udev事件或快捷键。


1
很好,谢谢!我已将其转换为Python脚本,使其易于使用且易于使用,可在此处获得
Naftuli Kay 2013年


1
@NaftuliTzviKay:您的脚本不再可用。如果仍有,请考虑发布到[GitHub Gist](gist.github.com)。
DenilsonSáMaia 2014年

如果0 sink input(s) available.呢?但是那个糟糕的Flash Player仍在播放音频吗?我在client(s) logged inpacmd list
Zhigalin '17

1
$ pacmd set-default-sink INDEX我的脚本仍然需要它,否则用于改变音量的键盘命令将继续使用旧的接收器源。
myol

9

以下命令用于操纵PulseAudio声音服务器:

pacmd - Used to reconfigure a PulseAudio sound server during runtime.
pactl - Used to control a running PulseAudio sound server.

以下是它们如何工作的一些示例。

pacmd list-sinks:: 可能的接收器的列表名称索引号

pacmd set-default-sink [sinkname]::设置默认输出接收

pacmd set-default-source [sourcename]::设置默认输入

pacmd set-sink-volume [index] [volume]::设置水槽容积

pacmd set-source-volume index volume:: 音量控制范围0-65536(数字越小音量越小)

这些只是我从Wiki和手册页中撤出的一部分。参考以获取更多详细信息。或者,您可以查看命令--helpman页面。

已经有一个命令行工具可以满足此目的。它的名字叫ponymix。这是PulseAudio的命令行混音器。提供的链接是指向项目github的。它是由一个朋友和Arch Linux的受信任用户/开发人员开发的。如果您没有运行Arch,则可以使用make和从源代码进行编译sudo make install

$ ponymix --help
    usage: ponymix [options] <command>... 
Options:
 -h, --help              display this help and exit    
 -c, --card CARD         target card (index or name)
 -d, --device DEVICE     target device (index or name)
 -t, --devtype TYPE      device type
 -N, --notify            use libnotify to announce volume changes
     --source            alias to -t source
     --input             alais to -t source
     --sink              alias to -t sink
     --output            alias to -t sink
     --sink-input        alias to -t sink-input
     --source-output     alias to -t source-output
Device Commands:
  help                   display this message
  defaults               list default devices (default command)
  set-default            set default device by ID
  list                   list available devices
  list-short             list available devices (short form)
  list-cards             list available cards
  list-cards-short       list available cards (short form)
  get-volume             get volume for device
  set-volume VALUE       set volume for device
  get-balance            get balance for device
  set-balance VALUE      set balance for device
  adj-balance VALUE      increase or decrease balance for device
  increase VALUE         increase volume
  decrease VALUE         decrease volume
  mute                   mute device
  unmute                 unmute device
  toggle                 toggle mute
  is-muted               check if muted
Application Commands:
  move DEVICE            move target device to DEVICE
  kill DEVICE            kill target DEVICE
Card Commands:
  list-profiles          list available profiles for a card
  list-profiles-short    list available profiles for a card(short form)
  get-profile            get active profile for card
  set-profile PROFILE    set profile for a card

嘿,谢谢你的回答!它帮助我一吨与此相关的一个问题
KlaymenDK '18年

5

在运行Fedora 20的笔记本电脑上,HDMI输出未在默认配置文件中列为接收,而是在其他配置文件中列出。

我只有1个水槽,笔记本电脑的扬声器上播放着优美的音乐:

$ pactl list short sinks
8   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

如果我跑步,pactl set-card-profile 0 output:hdmi-stereo则可以通过HDMI播放优美的音乐。我得到:

$ pactl list short sinks
14  alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

要恢复默认值,我只需要运行即可pactl set-card-profile 0 output:analog-stereo+input:analog-stereo。无论哪种方式,如果重新启动,默认值都会再次出现。

我的卡的配置文件列表在pactl list cards输出中的某处。


此信息已由接受的答案提供。除非您要添加其他内容,否则请勿复制其他用户的答案。这只是重新定义了其他答案,没有提供任何新内容或有用的内容!
slm

5
set-card-profile之前没有提到,这是此答案最重要的信息。
Spidey 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.