项目

一般

简介

音频

  1. 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
    
  2. 产生音频
    # 生成测试音(需安装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
    
  3. 回声消除
    # 在线检测麦克风网站
    https://www.onlinemictest.com/ 
    
    # 1. PulseAudio
    
    # 2. PipeWire
    
    # 3. NoiseTorch
    
    # 4. SpeexDSP(配置PulseAudio使用Speex)
    
  4. 声卡信息获取
    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 重采样
    
  5. 使用插件追溯
    # 查看 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
    可知:是内置插件
    
  6. 查看当前配置的插件节点(有些配置文件配置,有些自动生成)
    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
    
  7. 实时录制播放
    arecord -D pulse -f cd | aplay -D pulse
    
  8. 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对应的配置文件
    
  9. 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>