ALSA & Python - 捕获多个单声道音频输入
Posted
技术标签:
【中文标题】ALSA & Python - 捕获多个单声道音频输入【英文标题】:ALSA & Python - Capturing multiple mono audio inputs 【发布时间】:2013-01-21 10:13:39 【问题描述】:我正在使用 python 音频 alsa 库与我的 M-Audio Delta 1010LT PCI 音频接口进行交互。该音频接口有 8 个模拟输入。我想分析一个特定单声道输入的信号。正在识别卡:
cat /proc/asound/cards 0 [M1010LT ]: ICE1712 - M Audio Delta 1010LT
M Audio Delta 1010LT at 0xa000, irq 18
之后,我使用命令“amixer”列出了所有设备名称(此处显示输入 ADC)
...
Simple mixer control 'ADC',0
Capabilities: volume volume-joined penum
Playback channels: Mono
Capture channels: Mono
Limits: 0 - 164
Mono: 142 [87%] [7.50dB]
Simple mixer control 'ADC',1
Capabilities: volume volume-joined penum
Playback channels: Mono
Capture channels: Mono
Limits: 0 - 164
Mono: 164 [100%] [18.50dB]
Simple mixer control 'ADC',2
Capabilities: volume volume-joined penum
Playback channels: Mono
Capture channels: Mono
Limits: 0 - 164
Mono: 164 [100%] [18.50dB]
Simple mixer control 'ADC',3
Capabilities: volume volume-joined penum
Playback channels: Mono
Capture channels: Mono
Limits: 0 - 164
Mono: 164 [100%] [18.50dB]
Simple mixer control 'ADC',4
Capabilities: volume volume-joined penum
Playback channels: Mono
Capture channels: Mono
Limits: 0 - 164
Mono: 164 [100%] [18.50dB]
Simple mixer control 'ADC',5
Capabilities: volume volume-joined penum
Playback channels: Mono
Capture channels: Mono
Limits: 0 - 164
Mono: 164 [100%] [18.50dB]
Simple mixer control 'ADC',6
Capabilities: volume volume-joined penum
Playback channels: Mono
Capture channels: Mono
Limits: 0 - 164
Mono: 164 [100%] [18.50dB]
Simple mixer control 'ADC',7
Capabilities: volume volume-joined penum
Playback channels: Mono
Capture channels: Mono
Limits: 0 - 164
Mono: 164 [100%] [18.50dB]
...
之后我使用命令“arecord -l”列出了录音硬件设备
arecord -l**** List of CAPTURE Hardware Devices ****
card 0: M1010LT [M Audio Delta 1010LT], device 0: ICE1712 multi [ICE1712 multi]
Subdevices: 1/1
Subdevice #0: subdevice #0
我说的对吗?这是否仅显示 1 个录制子设备?不是应该显示 8 吗?
我还安装了 Mudita24——一个 envy24 视觉混合器。有了这个,我可以完美地调整和监控所有输入通道的电平。
之后我使用 GStreamer 做了一个小测试,效果也很好:
gst-launch-0.10 alsasrc card-name=0 device-name='ADC 0' ! queue ! alsasink card-name=0 device-name='DAC 0'
但是我在使用以下卡和设备描述符来解决 python 的 alsa 中的某个单声道通道时遇到了麻烦:
'default' // This one get's me channel 1 & 2 MIXED (I'd like to get them as seperated mono inputs)
'hw:0,0' // recognizes device but the input value is 0
'hw:0,0,0' // returns same as hw:0,0
'hw:0,0,1' // Device or resource busy (pretty much every other value than 0 returns this)
'hw:0,1' // No such file or directory
如何使用 ALSA 处理特定的单声道输入通道?这是我正在使用的 python 库:link
这就是我尝试为每个频道创建设备的方式:
pcm.one_channel
@args [ CHANNEL ]
@args.CHANNEL type integer
type dsnoop
ipc_key 20130206
slave
pcm "hw:0"
channels 12
rate 44000
bindings [ $CHANNEL ]
pcm.two_channel
@args [ CHANNEL ]
@args.CHANNEL type integer
type dsnoop
ipc_key 20130206
slave
pcm "hw:0"
channels 12
rate 44000
bindings [ $CHANNEL ]
pcm.three_channel
@args [ CHANNEL ]
@args.CHANNEL type integer
type dsnoop
ipc_key 20130206
slave
pcm "hw:0"
channels 12
rate 44000
bindings [ $CHANNEL ]
pcm.four_channel
@args [ CHANNEL ]
@args.CHANNEL type integer
type dsnoop
ipc_key 20130206
slave
pcm "hw:0"
channels 12
rate 44000
bindings [ $CHANNEL ]
pcm.five_channel
@args [ CHANNEL ]
@args.CHANNEL type integer
type dsnoop
ipc_key 20130206
slave
pcm "hw:0"
channels 12
rate 44000
bindings [ $CHANNEL ]
我是否正确解释了您的建议?我也一直在网上寻找这个,并为这张卡找到了另外两个 .asoundrc(不幸的是也不起作用)。
#
# M-Audio Delta 1010
#
pcm.ice1712_capture
type dsnoop
ipc_key 1024
slave
pcm "hw:0"
period_size 0
buffer_size 65536
rate 44100
channels 10
format "S16_LE"
pcm.ice1712_playback
type dsnoop
ipc_key 1024
slave
pcm "hw:0"
period_size 0
buffer_size 65536
rate 44100
channels 10
format "S16_LE"
pcm.ice1712_duplex
type asym
playback.pcm ice1712_playback
capture.pcm ice1712_capture
pcm.ch1
type plug
ttable.0.0 1
slave.pcm ice1712_duplex
pcm.ch2
type plug
ttable.1.1 1
slave.pcm ice1712_duplex
pcm.ch3
type plug
ttable.0.2 1
slave.pcm ice1712_duplex
pcm.ch4
type plug
ttable.1.3 1
slave.pcm ice1712_duplex
pcm.ice1712_ch5
type plug
ttable.0.4 1
slave.pcm ice1712_duplex
pcm.ice1712_ch6
type plug
ttable.1.5 1
slave.pcm ice1712_duplex
pcm.ice1712_ch7
type plug
ttable.0.6 1
slave.pcm ice1712_duplex
pcm.ice1712_ch8
type plug
ttable.1.7 1
slave.pcm ice1712_duplex
pcm.ice1712_ch9
type plug
ttable.0.8 1
slave.pcm ice1712_duplex
pcm.ice1712_ch10
type plug
ttable.1.9 1
slave.pcm ice1712_duplex
这里还有一个:
pcm.multi_capture
type multi
slaves.a.pcm hw:0
slaves.a.channels 12
# First 8 channels of first soundcard (capture)
bindings.0.slave a
bindings.0.channel 0
bindings.1.slave a
bindings.1.channel 1
bindings.2.slave a
bindings.2.channel 2
bindings.3.slave a
bindings.3.channel 3
bindings.4.slave a
bindings.4.channel 4
bindings.5.slave a
bindings.5.channel 5
bindings.6.slave a
bindings.6.channel 6
bindings.7.slave a
bindings.7.channel 7
# S/PDIF section. Uncomment bindings if required.
# S/PDIF first soundcard (capture)
#bindings.16.slave a
#bindings.16.channel 8
#bindings.17.slave a
#bindings.17.channel 9
ctl.multi_capture
type hw
card 0
pcm.multi_playback
type multi
slaves.a.pcm hw:0
slaves.a.channels 10
# First 8 channels of first soundcard (playback)
bindings.0.slave a
bindings.0.channel 0
bindings.1.slave a
bindings.1.channel 1
bindings.2.slave a
bindings.2.channel 2
bindings.3.slave a
bindings.3.channel 3
bindings.4.slave a
bindings.4.channel 4
bindings.5.slave a
bindings.5.channel 5
bindings.6.slave a
bindings.6.channel 6
bindings.7.slave a
bindings.7.channel 7
# S/PDIF section. Uncomment bindings if required.
# S/PDIF first soundcard (playback)
#bindings.16.slave a
#bindings.16.channel 8
#bindings.17.slave a
#bindings.17.channel 9
ctl.multi_playback
type hw
card 0
【问题讨论】:
【参考方案1】:amixer
工具不显示设备名称,而是显示混音器控件。
ICE1712 芯片确实只有一个捕获设备(正好有 12 个通道)。
要获取各个频道的虚拟设备,请尝试将以下内容添加到您的 ~/.asoundrc
或 /etc/asound.conf
:
pcm.one_channel
@args [ CHANNEL ]
@args.CHANNEL type integer
type dsnoop
ipc_key 20130206
slave
pcm "hw:0"
channels 12
rate 48000
bindings [ $CHANNEL ]
然后使用one_channel:0
、one_channel:1
等设备名称。
【讨论】:
谢谢!那么我该如何解决这个问题呢?这是否意味着 card = 0、device = 0 和 0-11 是我的频道?例如:“hw:0,0,1”?对于除 0 以外的每个输入(不返回任何内容),我都会收到“设备或资源繁忙”。 只要使用hw:0
;其他数字用于选择设备和子设备,但无论如何你只有一个。
您始终可以在一台设备中获得所有 12 个频道。 (如果您使用像 default
这样进行自动格式转换的设备,某些通道会被缩混。)
好的,但我必须同时分别分析 2、3、4 个输入。所以我需要能够处理特定的单声道输入。我将有一个算法(pyhton 应用程序),我将为不同的输入执行该算法。因此,将多个麦克风输入下混不是一种选择。为什么 gstreamer 组件“alsasrc”允许使用名称对特定输入进行寻址?是否可以将所有通道分离到自己的设备上?谢谢!
感谢 CL 的提示。我一直在尝试编写我的 .asoundrc 文件,但我几乎感觉它实际上没有任何效果。因为 arecord -l 仍然只显示一个设备。我是否正确解释了您的最后建议(更新了问题)?以上是关于ALSA & Python - 捕获多个单声道音频输入的主要内容,如果未能解决你的问题,请参考以下文章
如何配置不同的 ALSA 默认值以通过一台设备捕获并通过另一台设备播放?