AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1011806
Accepted
pa4080
pa4080
Asked: 2018-03-05 07:00:27 +0800 CST2018-03-05 07:00:27 +0800 CST 2018-03-05 07:00:27 +0800 CST

如何从 CLI 切换音频设备的音频输出?

  • 772

我正在尝试从命令行在我的视频卡的音频输出之间切换。我可以通过 GUI 设置来做到这一点,如图所示。如何以编程方式执行此操作?

在此处输入图像描述

图片上显示了两个音频设备,每个设备都有两个输出:

  • (绿色)设备 1 -具有两个输出的内置音频:

    • 数字输出
    • 耳机
  • (红色)设备 2 - NVidia GTX 660 的HDMI 音频控制器。视频卡上连接了两台显示器:

    • 第一台显示器是LG 电视,它连接到HDMI-0。

    • 第二台显示器是LG ULTRAWIDE,它连接到DVI-I-1。

所以我想通过命令行在红色输出(两个监视器)之间切换。在我的研究中,我发现的一切都是如何在音频设备(声卡)之间切换。我已经阅读了一些主题作为这些问题:

  • 音频输出设备,快速切换?
  • 如何在播放期间使用“pacmd set-default-sink”更改pulseaudio sink?
  • 如何使用终端选择音频输出设备?
  • 如何使用快捷键切换声音输出

当第一台显示器LG电视| HDMI-0用作音频输出:

在此处输入图像描述

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

$ pacmd list-sinks | grep name:
    name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
    name: <alsa_output.pci-0000_03_00.1.hdmi-stereo>
  • 的输出pactl list sinks
  • 的输出pacmd list-sinks

当第二台显示器LG ULTRAWIDE | DVI-I-1用作音频输出:

在此处输入图像描述

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

$ pacmd list-sinks | grep name:
    name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
    name: <alsa_output.pci-0000_03_00.1.hdmi-stereo-extra1>
  • 的输出pactl list sinks
  • 的输出pacmd list-sinks

pacmd list-cards和的输出在此处pactl list cards提供。


您可以看到(在这种特殊情况下)我正在寻找一种在sink 16和之间切换的方法sink 17。但是当sink 16出现在 中时pactl list sinks,sink 17不会出现,反之亦然。我只能从 GUI 设置中切换它们。有没有办法通过命令行做到这一点?

pulseaudio command-line xorg desktop-environments
  • 1 1 个回答
  • 6330 Views

1 个回答

  • Voted
  1. Best Answer
    pa4080
    2018-03-07T13:00:29+08:002018-03-07T13:00:29+08:00

    感谢与@Thomas的讨论,我意识到正确的 therms (关键词)是profile和card。在问题配置文件方面是输入和输出。这些卡是音频设备。接收器编号并不那么重要,但我们需要它们。

    pacmd list-cards我们可以通过命令或pactl list cards输出相同信息的命令找到每个卡名称的所有可用配置文件:

    $ pactl list cards
    
    Card #0
        Name: alsa_card.pci-0000_00_1b.0
        ...
        Profiles:
            input:analog-stereo: Analog Stereo Input (sinks: 0, sources: 1, priority: 60, available: yes)
            output:analog-stereo: Analog Stereo Output (sinks: 1, sources: 0, priority: 6000, available: yes)
            output:analog-stereo+input:analog-stereo: Analog Stereo Duplex (sinks: 1, sources: 1, priority: 6060, available: yes)
            output:analog-surround-21: Analog Surround 2.1 Output (sinks: 1, sources: 0, priority: 800, available: yes)
            ...
        Active Profile: output:iec958-stereo+input:analog-stereo
        ...
    
    Card #1
        Name: alsa_card.pci-0000_03_00.1
        ...
        Profiles:
            output:hdmi-stereo: Digital Stereo (HDMI) Output (sinks: 1, sources: 0, priority: 5400, available: yes)
            output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) Output (sinks: 1, sources: 0, priority: 5200, available: yes)
            output:hdmi-surround-extra1: Digital Surround 5.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes)
            output:hdmi-surround71-extra1: Digital Surround 7.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes)
            ...
        Active Profile: output:hdmi-stereo
        ...
    

    可以通过命令设置某个配置文件,格式如下:

    pactl set-card-profile output:hdmi-stereo <card name|number> <profile name>
    

    根据提到的四个输出的问题,命令是:

    pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo # LG ULTRAWIDE
    pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo-extra1 # LG TV
    pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:iec958-stereo # Digital Output
    pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:analog-stereo # Headphones
    

    如this answer所示,设置新配置文件后,接下来要做的事情是:

     pacmd set-default-sink <sink number of the target profile>
     pacmd move-sink-input "$i" <sink number of the target profile> 
     # where $i is the index number of any active input: pacmd list-sink-inputs   
    

    根据我在问题中描述的需要,我创建了以下脚本:

    #!/bin/bash
    
    # Name: /usr/local/bin/audioswitch
    # Usage: audioswitch; audioswitch 1; audioswitch 2;  audioswitch 3; audioswitch 4
    
    CARD_1="pci-0000_03_00.1"             ### HDMI Audio Controller of NVidia GTX 660
    CARD_1_PROFILE_1="hdmi-stereo"          # LG ULTRAWIDE
    CARD_1_PROFILE_2="hdmi-stereo-extra1"   # LG TV
    CARD_0="pci-0000_00_1b.0"             ### Built-in Audio
    CARD_0_PROFILE_1="iec958-stereo"        # Digital Output
    CARD_0_PROFILE_2="analog-stereo"        # Headphones
    
    # Read the user's input
    CHOICE="${@}"
    choice() {
        if   [ "$CHOICE" == 1 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_1" # LG ULTRAWIDE
        elif [ "$CHOICE" == 2 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_2" # LG TV
        elif [ "$CHOICE" == 3 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_1" # Digital Output
        elif [ "$CHOICE" == 4 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_2" # Headphones
        else
            echo -e "\nYou should choice between:"
            echo -e "\n\t[1] LG ULTRAWIDE\n\t[2] LG TV\n\t[3] Digital Output\n\t[4] Headphones\n"
            echo -n "Your choice: "; read CHOICE; echo; choice; # call the function again
        fi
    }; choice # call the function
    
    # Set the choosen card profile as sink
    pactl set-card-profile "alsa_card.${CARD}" "output:${PROF}";
    
    # Set the default sink to the new one
    pacmd set-default-sink "alsa_output.${CARD}.${PROF}" &> /dev/null
    
    # Redirect the existing inputs to the new sink
    for i in $(pacmd list-sink-inputs | grep index | awk '{print $2}'); do
        pacmd move-sink-input "$i" "alsa_output.${CARD}.${PROF}" &> /dev/null
    done
    

    该脚本已准备好与自定义键盘快捷键一起使用,因为它可以处理第一个位置参数的值 ( 1- 4)。当它在没有额外参数的情况下被调用时,它会询问您的选择:

    $ audioswitch 
    
    You should choice between:
    
        [1] LG ULTRAWIDE
        [2] LG TV
        [3] Digital Output
        [4] Headphones
    
    Your choice: 1
    
    • 12

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve