【问题标题】:ALSA combine mic inputs and speaker outputs for SkypeALSA 结合了 Skype 的麦克风输入和扬声器输出
【发布时间】:2018-08-13 14:54:44
【问题描述】:

我正在尝试合并两个麦克风输入和两个输出以在 Skype、Linux CentOS7 中使用 我知道我可以用硬件混音器来做,但我想尝试用软件来做。

刚刚完成了一个合并输出的 bash 脚本,它运行良好。尝试组合输入变得疯狂。

这是两个 USB 声卡麦克风输入的名称: alsa_input.usb-C-Media_Electronics_Inc._USB_Audio_Device-00-Device.analog-mono alsa_input.usb-C-Media_Electronics_Inc._USB_Audio_Device-00-Device_1.analog-mono

我在pacmd / pactl info上找到了很多,也测试了很多命令,但没有任何效果。

#!/bin/bash

function getOutputs {
    index=""
    name=""
    #declare -A sinks_list

    # Get dirty sinks list
    raw_sinks=`pacmd list-sinks`

    # Parse the sources list
    while IFS= read -r line
    do
        #Check if index and name are populated
        if [ -n "$index" ] && [ -n "$name" ]
        then
            sinks_list[$index]=$name
            index=""
            name=""
        fi
        # Get indexs and index number
        if grep -q index: <<<"$line"
        then
            index=$(echo "$line" | sed 's/[^0-9]*//g')
        fi
        # Get sound card output name and remove other than c-media soundcards
        if grep -q name: <<<"$line" && grep -q stereo <<<"$line" && grep -q C-Media_Electronics_Inc._USB_Audio_Device <<<"$line"
        then
            name=$(echo "$line" | sed -e "s/name://" | sed 's|[<>,]||g'| tr -d '[:space:]')
        fi
    done <<< "$raw_sinks"
}

function getInputs {
    index=""
    name=""
    #declare -A sources_list

    # Get dirty sources list
    raw_sources=`pacmd list-sources`

    # Parse the sources list
    while IFS= read -r line
    do
        #Check if index and name are populated
        if [ -n "$index" ] && [ -n "$name" ]
        then
            sources_list[$index]=$name
            index=""
            name=""            
        fi
        # Get indexs and index number
        if grep -q index: <<<"$line"
        then
            index=$(echo "$line" | sed 's/[^0-9]*//g')
        fi
        # Get sound card output name and remove other than c-media soundcards
        if grep -q name: <<<"$line" && grep -q mono <<<"$line" && grep -q C-Media_Electronics_Inc._USB_Audio_Device <<<"$line"
        then
            name=$(echo "$line" | sed -e "s/name://" | sed 's|[<>,]||g'| tr -d '[:space:]')
        fi
    done <<< "$raw_sources"
}

function combineOutputs {
    soundcard_names=""

    for K in "${!sinks_list[@]}"; 
    do
        # Set device default volume
        pacmd set-sink-volume ${sinks_list[$K]} 65536
        soundcard_names+=${sinks_list[$K]},
    done

    pacmd load-module module-combine-sink sink_name=MySink slaves=$soundcard_names

    # Set default volume
    pacmd set-sink-volume MySink 65536

    # Set as default source
    pacmd set-default-sink MySink
}

function combineInputs {
    # Create a null sink to merge signals
    pacmd load-module module-null-sink sink_name=MyLoopSink

    # One by one add mics to the null sink
    for K in "${!sources_list[@]}"; 
    do
        pactl load-module module-loopback source=$K sink=MyLoopSink
    done

    pacmd set-default-source MyLoopSink.monitor
    # Create a virtual source. Note: using uplink_sink=MyLoopSink removes all the devices
    pacmd load-module module-virtual-source source_name=loop_source

    # Set as default source
    pacmd set-default-source loop_source
}

# First restart pulseaudio to get sure we are working with a clean configuration
pulseaudio -k
sleep 10

# Combine Inputs
declare -A sources_list
getInputs
# Loop through array values
echo "Soundcard's inputs:"
for K in "${!sources_list[@]}"; 
do
    echo $K --- ${sources_list[$K]}
done
combineInputs

# Combine Outputs
declare -A sinks_list
getOutputs
# Loop through array values
echo "Soundcard's outputs:"
for K in "${!sinks_list[@]}"; 
do
    echo $K --- ${sinks_list[$K]}
done
combineOutputs

有什么线索吗?提前致谢。

【问题讨论】:

  • 对不起。只是添加了脚本而不是简短的示例。

标签: linux bash centos7 alsa


【解决方案1】:

替代解决方案是使用带有软件混音器和许多其他可用工具的JACK 音频服务器。我与一个使用IDJC 的小组合作,将音频(包括Skype 呼叫者)与icecast 在互联网上广播。 JACK 中的图形化接线盒以正确连接音频不是必需的,但它更容易和更快

pactl 命令应该优先于 Pulseaudio 的脚本控制,但并非所有 pacmd 命令在 pactl 中都有等效项

pacmd 命令在终端 shell 中运行,不能在带有直接命令的脚本中运行

如果与echo 命令一起使用,该命令将在脚本中运行。这是我在脚本中用来管理 Pulseaudio 到 JACK 连接的命令之一:

echo "set-default-sink voip2jack" |pacmd

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2011-12-25
    • 2022-09-26
    • 2014-10-31
    • 2017-05-20
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多