我正在尝试使用 录制在单独通道上播放的音频arecord
。我通过在 python 脚本中的单独线程中执行以下命令来实现此目的:
arecord -D plug:"+str(in_id)+" -c 1 -d "+str(duration)+" -f S16_LE -r "+str(rate)+" "+rec_filename
其中in_id
是我传递给每个线程的输入通道变量。但随后,抛出以下错误:
ALSA lib pcm_dsnoop.c:606:(snd_pcm_dsnoop_open) unable to open slave
arecord: main:722: audio open error: Device or resource busy
当我在程序中的记录功能中lsof /dev/snd/pcm*
开始记录之前运行时,我看到以下内容:arecord
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
aplay 12236 user4 mem CHR 116,3 493 /dev/snd/pcmC1D0p
aplay 12236 user4 4u CHR 116,3 0t0 493 /dev/snd/pcmC1D0p
我的输入通道的设备定义.asoundrc
如下:
pcm.!default {
type plug
slave {
pcm "hw:1,0"
}
}
ctl.!default {
type hw
card 1
}
pcm_slave.usb_audio_1 {
pcm "hw:1,0"
channels 8
rate 44100
buffer_size 4096
period_size 1024
}
pcm.outch<num> {
type dshare
ipc_key <id>
slave usb_audio_1
bindings [ <ch_num> ]
hint.description "USB output/playback channel <num> (from output port <num>)"
}
pcm.inch<num> {
type dsnoop
ipc_key <id>
slave usb_audio_1
bindings [ <ch_num> ]
hint.description "USB input/capture channel <num> (from input port <num>)"
}
其中,<num>
取 1 到 8 之间的所有值,并<ch_num>
取 0 到 7 之间的所有值。
由于该错误清楚地表明 存在明确的问题dsnoop
,这是否意味着它不适用于同时/多通道录制?我的意思是dsnoop
, 和之间是否存在冲突,dshare
或者是否dsnoop
一次只能从一个通道进行记录/捕获?我还有其他方法可以实现这一目标吗?
答案1
用于ipc_key
共享同一设备的程序之间的通信。这意味着您必须对不同的硬件设备使用不同的值,但是访问同一硬件设备(即同一从属设备usb_audio_1
)的所有虚拟设备必须使用相同的ID。
答案2
arecord
就我而言,如果我打开 VLC(即使空闲且播放列表为空),设备将被阻止使用。
同样,如果我只打开(右上角菜单)设置,它也会被阻止 - 大概是因为它的声音/麦克风测试面板。