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