Audio

嘗試使用 arecord 錄製音頻時引發“設備或資源繁忙”錯誤

  • April 28, 2017

我正在嘗試使用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>)"
}

where<num>取 1 到 8 之間<ch_num>的所有值,取 0 到 7 之間的所有值。

因為,錯誤清楚地表明存在一個明確的問題dsnoop,這是否意味著它不適用於同時/多通道錄製?我的意思是之間是否存在衝突dsnoopdshare或者是否dsnoop可以一次僅從一個頻道錄製/擷取?還有另一種方法可以實現這一目標嗎?

ipc_key用於共享同一設備的程序之間的通信。這意味著您必須對不同的硬體設備使用不同的值,但訪問同一硬體設備(即,相同的 slave usb_audio_1)的所有虛擬設備必須使用相同的 ID。

引用自:https://unix.stackexchange.com/questions/361594