arecord를 사용하여 오디오를 녹음하려고 할 때 "장치 또는 리소스 사용 중" 오류 발생

arecord를 사용하여 오디오를 녹음하려고 할 때 "장치 또는 리소스 사용 중" 오류 발생

별도의 채널에서 오디오를 재생하기 위해 녹음을 사용하려고 합니다 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를 열면(유휴 상태이고 재생 목록이 비어 있는 경우에도) 장치 사용이 차단됩니다.

마찬가지로 (오른쪽 상단 메뉴) 설정을 열면 차단됩니다. 아마도 사운드/마이크 테스트 패널 때문일 것입니다.

관련 정보