skr*_*mit 6 alsa audio recording
我正在尝试使用arecord. 我通过在 python 脚本的单独线程中执行以下命令来做到这一点:
arecord -D plug:"+str(in_id)+" -c 1 -d "+str(duration)+" -f S16_LE -r "+str(rate)+" "+rec_filename
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
当我在程序中的记录功能中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
Run Code Online (Sandbox Code Playgroud)
我对输入通道的设备定义.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>)"
}
Run Code Online (Sandbox Code Playgroud)
where<num>取 1 到 8 之间的所有值,<ch_num>取 0 到 7 之间的所有值。
因为,该错误清楚地表明 存在明确的问题dsnoop,这是否意味着它不适用于同时/多通道录制?我的意思是,dsnoop和dshare或是否一次dsnoop只能从一个频道录制/捕获之间是否存在冲突?有没有另一种方法可以实现这一目标?
用于ipc_key共享同一设备的程序之间的通信。这意味着您必须对不同的硬件设备使用不同的值,但是访问同一硬件设备(即同一从属设备usb_audio_1)的所有虚拟设备必须使用相同的ID。