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와 사이에 충돌이 있다는 뜻인가요 ? 이것을 달성할 수 있는 다른 방법이 있나요?dsharedsnoop

답변1

ipc_key동일한 장치를 공유하는 프로그램 간의 통신에 사용됩니다 . 이는 하드웨어 장치마다 다른 값을 사용해야 하지만 동일한 하드웨어 장치(예: 동일한 슬레이브 usb_audio_1)에 액세스하는 모든 가상 장치는 동일한 ID를 사용해야 함을 의미합니다.

답변2

arecord제 경우에는 VLC가 열려 있으면(유휴 상태이고 재생 목록이 비어 있는 경우에도) 장치 사용이 차단됩니다 .

마찬가지로 (오른쪽 상단 모서리 메뉴) 설정만 열려 있는 경우에도 차단됩니다. 아마도 사운드/마이크 테스트 패널 때문일 것입니다.

관련 정보