【发布时间】: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
有什么线索吗?提前致谢。
【问题讨论】:
-
对不起。只是添加了脚本而不是简短的示例。