尝试使用 arecord 录制音频时抛出“设备或资源繁忙”错误

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只能从一个频道录制/捕获之间是否存在冲突?有没有另一种方法可以实现这一目标?

CL.*_*CL. 5

用于ipc_key共享同一设备的程序之间的通信。这意味着您必须对不同的硬件设备使用不同的值,但是访问同一硬件设备(即同一从属设备usb_audio_1)的所有虚拟设备必须使用相同的ID。