임베디드 Linux에서 arecord를 통해 오디오 파일을 녹음하려고 하는데 파일이 비어 있습니다. Audacity에서는 다음과 같이 보입니다.
하지만 aplay를 통해 일반 오디오 파일을 재생할 수 있습니다. 나는 I2S를 통해 CPU에 연결된 RK809를 사운드 카드로 사용합니다. RK809는 아날로그 마이크에 연결되어 있으며 아날로그 오디오는 RK809에 의해 처리되어 I2S 버스를 통해 CPU로 전송됩니다.
이에 대한 몇 가지 정보는 다음과 같습니다.
[root@DCIR:~]# cat /proc/asound/cards
0 [rockchiprk809co]: rockchip_rk809- - rockchip,rk809-codec
rockchip,rk809-codec
7 [Loopback ]: Loopback - Loopback
Loopback 1
[root@DCIR:~]# amixer scontrols
Simple mixer control 'Master',0
Simple mixer control 'Playback Path',0
Simple mixer control 'Capture MIC Path',0
Simple mixer control 'Digital',0
[root@DCIR:~]# amixer controls
numid=3,iface=MIXER,name='Master Playback Volume'
numid=2,iface=MIXER,name='Capture MIC Path'
numid=1,iface=MIXER,name='Playback Path'
numid=4,iface=MIXER,name='Digital Capture Volume'
[root@DCIR:~]# amixer scontents
Simple mixer control 'Master',0
Capabilities: pvolume
Playback channels: Front Left - Front Right
Limits: Playback 0 - 100
Mono:
Front Left: Playback 100 [100%] [0.00dB]
Front Right: Playback 100 [100%] [0.00dB]
Simple mixer control 'Playback Path',0
Capabilities: enum
Items: 'OFF' 'RCV' 'SPK' 'HP' 'HP_NO_MIC' 'BT' 'SPK_HP' 'RING_SPK' 'RING_HP' 'RING_HP_NO_MIC' 'RING_SPK_HP'
Item0: 'SPK_HP'
Simple mixer control 'Capture MIC Path',0
Capabilities: enum
Items: 'MIC OFF' 'Main Mic' 'Hands Free Mic' 'BT Sco Mic'
Item0: 'Main Mic'
Simple mixer control 'Digital',0
Capabilities: cvolume
Capture channels: Front Left - Front Right
Limits: Capture 0 - 100
Front Left: Capture 100 [100%] [0.00dB]
Front Right: Capture 100 [100%] [0.00dB]
내가 시도한 것은 다음과 같습니다.
- I/O 오류가 아닌지 확인하기 위해 최소 10초 동안 로깅합니다.
- 하드웨어를 확인하세요. MIC를 확인했지만 I2S 신호를 측정하려면 칩의 핀만 직접 측정할 수 있기 때문에 I2S 버스를 확인하기가 어렵습니다.
다음은 칩 제조사에서 제안하는 방법인데 어떻게 구현해야 할지 모르겠습니다.
- "Amixer 또는 Tinymix를 사용하여 CODEC 내부의 ADC 채널이 열려 있고 볼륨이 음소거되어 있는지 확인하십시오."alsamixer에서 "캡처 마이크 경로"가 꺼지지 않았는지, "디지털"이 음소거되지 않았는지 확인했습니다. ADC 상태를 확인하는 방법을 모르겠습니다.
- "코덱 측의 입력 신호 발생기에서 생성된 10kHz 파형 신호입니다."이는 I2S 버스에서 신호를 보내는 것을 의미합니까?
- "arecord나tinycap을 사용하여 문제가 사용자 모드에서 발생하는지 커널 모드에서 발생하는지 기록하고 찾습니다."
arecord -D hw:0,0 -d 2 -f cd -c 2 -vv -t wav test.wav
나는 빈 파일을 생성하는 기록 명령을 사용합니다 .
(고쳐 쓰다:)
[root@DCIR:/]# ls -ails /dev/snd
total 0
181 0 drwxr-xr-x 3 root root 240 Aug 4 09:00 .
1025 0 drwxr-xr-x 13 root root 4200 Aug 4 09:00 ..
8996 0 drwxr-xr-x 2 root root 80 Aug 4 09:00 by-path
1097 0 crw-rw---- 1 root audio 116, 0 Aug 4 09:00 controlC0
187 0 crw-rw---- 1 root audio 116, 224 Aug 4 09:00 controlC7
1096 0 crw-rw---- 1 root audio 116, 24 Aug 4 09:00 pcmC0D0c
1095 0 crw-rw---- 1 root audio 116, 16 Aug 4 09:00 pcmC0D0p
184 0 crw-rw---- 1 root audio 116, 248 Aug 4 09:00 pcmC7D0c
183 0 crw-rw---- 1 root audio 116, 240 Aug 4 09:00 pcmC7D0p
186 0 crw-rw---- 1 root audio 116, 249 Aug 4 09:00 pcmC7D1c
185 0 crw-rw---- 1 root audio 116, 241 Aug 4 09:00 pcmC7D1p
182 0 crw-rw---- 1 root audio 116, 33 Aug 4 09:00 timer
오실로스코프를 사용하여 사운드카드(rk809)와 CPU 사이의 I2S 버스에서 SDO/PDMDATA 신호를 측정한 결과, 녹음 중에 출력신호가 있는 것을 발견했습니다.
arecord -Dhw:0,0 -f cd -d 5 -vvv audio.wav
예를 들어 format 또는 alsa 를 사용하면 dat
볼륨 0이 표시됩니다.-f S16_LE
-f S32_LE
[root@DCIR:~]# arecord -Dhw:0,0 -f cd -d 5 -vvv audio.wav
Recording WAVE 'audio.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
Hardware PCM card 0 'rockchip,rk809-codec' device 0 subdevice 0
Its setup is:
stream : CAPTURE
access : RW_INTERLEAVED
format : S16_LE
subformat : STD
channels : 2
rate : 44100
exact rate : 44100 (44100/1)
msbits : 16
buffer_size : 22052
period_size : 5513
period_time : 125011
tstamp_mode : NONE
tstamp_type : MONOTONIC
period_step : 1
avail_min : 5513
period_event : 0
start_threshold : 1
stop_threshold : 22052
silence_threshold: 0
silence_size : 0
boundary : 1445199872
appl_ptr : 0
hw_ptr : 0
Max peak (11026 samples): 0x00000001 # 0%
Max peak (11026 samples): 0x00000001 # 0%
Max peak (11026 samples): 0x00000001 # 0%
Max peak (11026 samples): 0x00000001 # 0%
Max peak (11026 samples): 0x00000001 # 0%
Max peak (11026 samples): 0x00000001 # 0%
Max peak (11026 samples): 0x00000001 # 0%
Max peak (11026 samples): 0x00000001 # 0%
하지만 다음을 사용하면 S24_LE
볼륨이 200% 증가합니다 .
[root@DCIR:~]# arecord -Dhw:0,0 -r 44100 -f S24_LE -c 2 -d 10 -vvv audio.wav
Recording WAVE 'audio.wav' : Signed 24 bit Little Endian, Rate 44100 Hz, Stereo
Hardware PCM card 0 'rockchip,rk809-codec' device 0 subdevice 0
Its setup is:
stream : CAPTURE
access : RW_INTERLEAVED
format : S24_LE
subformat : STD
channels : 2
rate : 44100
exact rate : 44100 (44100/1)
msbits : 32
buffer_size : 22052
period_size : 5513
period_time : 125011
tstamp_mode : NONE
tstamp_type : MONOTONIC
period_step : 1
avail_min : 5513
period_event : 0
start_threshold : 1
stop_threshold : 22052
silence_threshold: 0
silence_size : 0
boundary : 1445199872
appl_ptr : 0
hw_ptr : 0
Max peak (11026 samples): 0x00ffffff #################### 200%
Max peak (11026 samples): 0x00ffffff #################### 200%
Max peak (11026 samples): 0x00ffffff #################### 200%
Max peak (11026 samples): 0x00ffffff #################### 200%
Max peak (11026 samples): 0x00ffffff #################### 200%
Max peak (11026 samples): 0x00ffffff #################### 200%