我正在嘗試使用 錄製在單獨通道上播放的音訊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(即使空閒且播放清單為空),設備將被阻止使用。
同樣,如果我只打開(右上角選單)設置,它也會被阻止 - 大概是因為它的聲音/麥克風測試面板。