를 사용하여 별도의 채널에서 재생되는 오디오를 녹음하려고 합니다 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가 열려 있으면(유휴 상태이고 재생 목록이 비어 있는 경우에도) 장치 사용이 차단됩니다 .
마찬가지로 (오른쪽 상단 모서리 메뉴) 설정만 열려 있는 경우에도 차단됩니다. 아마도 사운드/마이크 테스트 패널 때문일 것입니다.