- codec
arecord -l
**** List of CAPTURE Hardware Devices ****
xcb_connection_has_error() returned true
card 0: rockchipes8388 [rockchip,es8388], device 0: dailink-multicodecs ES8323.3-0011-0 [dailink-multicodecs ES8323.3-0011-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: rockchiphdmiin [rockchip,hdmiin], device 0: fddf8000.i2s-dummy_codec hdmiin-dc-0 [fddf8000.i2s-dummy_codec hdmiin-dc-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
aplay -l
**** List of PLAYBACK Hardware Devices ****
xcb_connection_has_error() returned true
card 0: rockchipes8388 [rockchip,es8388], device 0: dailink-multicodecs ES8323.3-0011-0 [dailink-multicodecs ES8323.3-0011-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: rockchiphdmi0 [rockchip-hdmi0], device 0: rockchip-hdmi0 i2s-hifi-0 [rockchip-hdmi0 i2s-hifi-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
- 产生音频
# 生成测试音(需安装sox)
sudo apt install sox
# 播放5秒440Hz正弦波
play -n synth 5 sine 440
# 保存为WAV格式(16bit/44.1kHz标准CD音质)
sox -n -b 16 -r 44100 1.wav synth 120 sine 440 gain -3
- 回声消除
# 在线检测麦克风网站
https://www.onlinemictest.com/
# 1. PulseAudio
# 2. PipeWire
# 3. NoiseTorch
# 4. SpeexDSP(配置PulseAudio使用Speex)
- 声卡信息获取
plughw:0,0 带自动格式转换的硬件设备
hw:0,0 直接访问硬件设备
default 系统默认设备(经过完整音频链)
pulse 使用 PulseAudio 管道
# 主要的 ALSA 配置文件
/usr/share/alsa/alsa.conf # 主配置文件(最低优先级,默认配置)
/etc/asound.conf # 系统级配置(系统级)
~/.asoundrc # 用户级配置(最高优先级,用户级)
# 插件定义文件
/usr/share/alsa/pcm/ # PCM 插件定义
/usr/lib/alsa-lib/ # 插件库文件
# 查看 plug 插件的具体定义
grep -A 30 "^pcm\.plug" /usr/share/alsa/alsa.conf
# 查看硬件真实能力
arecord -D hw:CARD=rockchipes8388,DEV=0 --dump-hw-params
# PCM 插件:
libasound_module_pcm_oss.so - OSS 兼容插件
libasound_module_pcm_pulse.so - PulseAudio 集成
libasound_module_pcm_upmix.so - 声道上混
libasound_module_pcm_vdownmix.so - 声道下混
libasound_module_pcm_usb_stream.so - USB 音频流
libasound_module_pcm_jack.so - JACK 音频连接
# 重采样插件:
libasound_module_rate_samplerate.so - 使用 libsamplerate
libasound_module_rate_speexrate.so - 使用 Speex 重采样
- 使用插件追溯
# 查看 plughw 使用的插件
arecord -v -D plughw:CARD=rockchipes8388,DEV=0 -f S16_LE -r 44100 -c 2 -d 1 /dev/null 2>&1 | grep -i "plugin\|plug\|open\|type"
Plug PCM: Hardware PCM card 0 'rockchip,es8388' device 0 subdevice 0
tstamp_type : MONOTONIC
可知:使用的是Plug PCM 插件
# 判断是否是内置插件
strings /lib/aarch64-linux-gnu/libasound.so.2 | grep -i "plug pcm\|snd_pcm_plug"
_snd_pcm_plug_open
__snd_pcm_plug_open_dlsym_pcm_001
snd_pcm_plugin_read_areas
snd_pcm_plugin_write_areas
snd_pcm_plugin_mmap_commit
Plug PCM:
snd_pcm_plug_change_channels
snd_pcm_plug_change_channels
snd_pcm_plug_hw_refine_schange
snd_pcm_plug_hw_refine_cchange
snd_pcm_plug_change_rate
snd_pcm_plug_close
snd_pcm_plug_open
_snd_pcm_plug_open
可知:是内置插件
- 查看当前配置的插件节点(有些配置文件配置,有些自动生成)
arecord -L
null
Discard all samples (playback) or generate zero samples (capture)
samplerate
Rate Converter Plugin Using Samplerate Library
speexrate
Rate Converter Plugin Using Speex Resampler
jack
JACK Audio Connection Kit
oss
Open Sound System
pulse
PulseAudio Sound Server
upmix
Plugin for channel upmix (4,6,8)
vdownmix
Plugin for channel downmix (stereo) with a simple spacialization
default:CARD=rockchipes8388
rockchip,es8388, dailink-multicodecs ES8323.3-0011-0
Default Audio Device
sysdefault:CARD=rockchipes8388
rockchip,es8388, dailink-multicodecs ES8323.3-0011-0
Default Audio Device
dmix:CARD=rockchipes8388,DEV=0
rockchip,es8388, dailink-multicodecs ES8323.3-0011-0
Direct sample mixing device
dsnoop:CARD=rockchipes8388,DEV=0
rockchip,es8388, dailink-multicodecs ES8323.3-0011-0
Direct sample snooping device
hw:CARD=rockchipes8388,DEV=0
rockchip,es8388, dailink-multicodecs ES8323.3-0011-0
Direct hardware device without any conversions
plughw:CARD=rockchipes8388,DEV=0
rockchip,es8388, dailink-multicodecs ES8323.3-0011-0
Hardware device with all software conversions
usbstream:CARD=rockchipes8388
rockchip,es8388
USB Stream Output
default:CARD=rockchiphdmiin
rockchip,hdmiin, fddf8000.i2s-dummy_codec hdmiin-dc-0
Default Audio Device
sysdefault:CARD=rockchiphdmiin
rockchip,hdmiin, fddf8000.i2s-dummy_codec hdmiin-dc-0
Default Audio Device
dmix:CARD=rockchiphdmiin,DEV=0
rockchip,hdmiin, fddf8000.i2s-dummy_codec hdmiin-dc-0
Direct sample mixing device
dsnoop:CARD=rockchiphdmiin,DEV=0
rockchip,hdmiin, fddf8000.i2s-dummy_codec hdmiin-dc-0
Direct sample snooping device
hw:CARD=rockchiphdmiin,DEV=0
rockchip,hdmiin, fddf8000.i2s-dummy_codec hdmiin-dc-0
Direct hardware device without any conversions
plughw:CARD=rockchiphdmiin,DEV=0
rockchip,hdmiin, fddf8000.i2s-dummy_codec hdmiin-dc-0
Hardware device with all software conversions
usbstream:CARD=rockchiphdmiin
rockchip,hdmiin
USB Stream Output
usbstream:CARD=rockchiphdmi0
rockchip-hdmi0
USB Stream Output
- 实时录制播放
arecord -D pulse -f cd | aplay -D pulse
- pulseaudio
# 查看默认设备:pactl info
xcb_connection_has_error() returned true
Server String: unix:/tmp/pulse-socket
Library Protocol Version: 34
Server Protocol Version: 34
Is Local: yes
Client Index: 7
Tile Size: 65472
User Name: neardi
Host Name: LPA3588
Server Name: pulseaudio
Server Version: 13.99.3
Default Sample Specification: s16le 2ch 44100Hz
Default Channel Map: front-left,front-right
Default Sink: alsa_output.platform-hdmi0-sound.hdmi-stereo
Default Source: alsa_input.platform-hdmiin-sound.stereo-fallback
Cookie: 49a8:4158
# 查看可用pulse设备
root@LPA3588:~# pactl list sinks short
xcb_connection_has_error() returned true
0 alsa_output.platform-es8388-sound.stereo-fallback module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
1 alsa_output.platform-hdmi0-sound.hdmi-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
root@LPA3588:~# pactl list sources short
xcb_connection_has_error() returned true
0 alsa_output.platform-es8388-sound.stereo-fallback.monitor module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
1 alsa_input.platform-es8388-sound.stereo-fallback module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
2 alsa_output.platform-hdmi0-sound.hdmi-stereo.monitor module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
3 alsa_input.platform-hdmiin-sound.stereo-fallback module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
# 设置默认设备
1)方式一
pactl set-default-sink alsa_output.platform-es8388-sound.stereo-fallback
pactl set-default-source alsa_input.platform-es8388-sound.stereo-fallback
pactl set-default-sink alsa_output.platform-hdmi0-sound.hdmi-stereo
pactl set-default-source alsa_input.platform-hdmiin-sound.stereo-fallback
2)方式二
PULSE_SOURCE=alsa_input.platform-es8388-sound.stereo-fallback arecord -D pulse -f S16_LE -r 44100 -c 2 -d 5 1.wav
PULSE_SINK=alsa_output.platform-es8388-sound.stereo-fallback aplay -D pulse 1.wav
注意:如果pactl方式不能永久生效,可以修改pulseaudio对应的配置文件
- pulseaudio回声消除模块
# 加载回声消除模块
pactl load-module module-echo-cancel source_name=noechosource sink_name=noechosink
加载时绑定到指定的声卡:
pactl load-module module-echo-cancel \
source_name=noechosource \
sink_name=noechosink\
source_master=alsa_input.platform-es8388-sound.stereo-fallback \
sink_master=alsa_output.platform-es8388-sound.stereo-fallback
# 查看模块详情
pactl list modules short | grep echo
xcb_connection_has_error() returned true
24 module-echo-cancel source_name=noechosource sink_name=noechosink
# 查看输入设备
pactl list sources short | grep -i echo
# 查看输出设备
pactl list sinks short | grep -i echo
# 测试
1)设置默认声卡:
pactl set-default-source noechosource
pactl set-default-sink noechosink
2)先录音:
arecord -Dplughw:0,0 -f cd 1.wav
3)查看录音是否正常:
aplay -Dplughw:0,0 1.wav
4)使用pulse播放:
aplay -D pulse 1.wav &
5)同时使用pulse录音(此时录的音应该和2)的一样,比如都是一个正弦波:
arecord -D pulse -f cd -t wav -d 10 2.wav
6)播放2.wav
如果回声消除有效:录制文件中应该几乎听不到测试音频
如果回声消除无效:录制文件中会清楚地听到测试音频
注:回环测试
arecord -D pulse -f cd | aplay -D pulse -f cd
# 查看已加载的模块
pactl list modules short | grep echo-cancel
# 卸载模块(替换 X 为实际的模块索引)
pactl unload-module <module_index>