跳到主要内容

音频

1. 简介

RV1106 SoC 内置的⾳频 IP 模块,可以通过它外接模拟麦克⻛,通过模-数转换,将外部信号录⾳采集传给 CPU;CPU 也可以将本地的PCM (全称是脉冲编码调制数据) ⾳频数字信号,通过数-模转换后再播放出来。更多详细用法,请参考相关数据手册里面的音频部分。由于 Luckfox-Pico-Pro/Max 未引出相关的音频引脚,本教程仅适用 Luckfox-Pico-Ultra 上使用。

型号适用系统
Luckfox Pico Ultra/Ultra WBuildroot
  • 注意:如果是烧录Ubuntu22.04系统,可以下载ffmpeg工具来进行录音和播放音乐。

2. 声音配置

  1. 查看声卡设备

    # arecord -l
    **** List of CAPTURE Hardware Devices ****
    card 0: rvacodec [rv-acodec], device 0: ffae0000.i2s-rv1106-hifi ff480000.acodec-0 [ffae0000.i2s-rv1106-hifi ff480000.acodec-0]
    Subdevices: 0/1
    Subdevice #0: subdevice #0

    # aplay -l
    **** List of PLAYBACK Hardware Devices ****
    card 0: rvacodec [rv-acodec], device 0: ffae0000.i2s-rv1106-hifi ff480000.acodec-0 [ffae0000.i2s-rv1106-hifi ff480000.acodec-0]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
    • card0:SOC 自带的音频处理 IP 模块。
  2. 声卡的驱动目录

    # ls /dev/snd/
    by-path controlC0 pcmC0D0c pcmC0D0p
    • controlC0:用于声卡控制,C0 表示声卡0,对应上文的SOC自带的声音输出。
    • pcmC0D0c:用于录音的 pcm 设备,最后面的“c”是 capture 的缩写,表示录音
    • pcmC0D0p:用于播放的 pcm 设备,最后面的“p”是 playback 的缩写,表示放音。
    • by-path: 保存着设备的对应关系
    # ls -l /dev/snd/by-path/
    total 0
    lrwxrwxrwx 1 root root 12 Jan 1 2021 platform-acodec-sound -> ../controlC0

3. 配置声卡

使用 amixer 或 rk_mpi_amix_test --list_contents 都可以获取声卡上的所有可用音频控制项(controls)。mpi_amix_test 源码位于 SDK 目录 //media/rockit/rockit/mpi/example/mod/ 下。

  1. 查看内置 Codec 增益所有状态

    # rk_mpi_amix_test --list_contents
    cmd parse result:
    sound control id : 0
    control name : (null)
    control value : (null)
    list controls : 0
    list contents : 1
    Number of controls: 25
    ctl type num name value
    0 ENUM 1 I2STDM Digital Loopback Mode , DisabledMode1Mode2Mode2 Swap
    1 INT 1 ADC MIC Left Gain 2 (range 0->3)
    2 INT 1 ADC MIC Right Gain 2 (range 0->3)
    3 INT 1 ADC ALC Left Volume 6 (range 0->31)
    4 INT 1 ADC ALC Right Volume 6 (range 0->31)
    5 INT 1 ADC Digital Left Volume 195 (range 0->255)
    6 INT 1 ADC Digital Right Volume 195 (range 0->255)
    7 ENUM 1 ADC HPF Cut-off , OffOn
    8 INT 1 ALC AGC Left Volume 12 (range 0->31)
    9 INT 1 ALC AGC Right Volume 12 (range 0->31)
    10 INT 1 ALC AGC Left Max Volume 7 (range 0->7)
    11 INT 1 ALC AGC Right Max Volume 7 (range 0->7)
    12 INT 1 ALC AGC Left Min Volume 0 (range 0->7)
    13 INT 1 ALC AGC Right Min Volume 0 (range 0->7)
    14 ENUM 1 ALC AGC Left Switch , OffOn
    15 ENUM 1 ALC AGC Right Switch , OffOn
    16 ENUM 1 AGC Left Approximate Sample Rate , 96KHz48KHz44.1KHz32KHz24KHz16KHz12KHz8KHz
    17 ENUM 1 AGC Right Approximate Sample Rate , 96KHz48KHz44.1KHz32KHz24KHz16KHz12KHz8KHz
    18 ENUM 1 ADC Mode , DiffadcLSingadcLDiffadcRSingadcRSingadcLRDiffadcLR
    19 ENUM 1 ADC MICBIAS Voltage VREFx0_8VREFx0_825VREFx0_85VREFx0_875, VREFx0_9VREFx0_925VREFx0_95VREFx0_975
    20 ENUM 1 ADC Main MICBIAS Off, On
    21 ENUM 1 ADC MIC Left Switch , WorkMute
    22 ENUM 1 ADC MIC Right Switch , WorkMute
    23 INT 1 DAC LINEOUT Volume 20 (range 0->30)
    24 INT 1 DAC HPMIX Volume 2 (range 0->2)
    • I2STDM Digital Loopback Mode:表示 I2STDM 控制器是否工作在回采模式下
      • Disabled:默认状态,不开启回采模式
      • Mode1:适用于4ch 使用场景。1-2 声道为 MIC 拾音数据,3-4 声道为回采数据
      • Mode2:适用于 2ch 使用场景。左声道为 MIC 拾音数据,右声道为播放的右声道的回采数据
      • Mode2 Swap:适用于 2ch 使用场景。左声道为播放的左声道的回采数据,右声道为 MIC 拾音数据。与 Mode2 声道顺序相反
    • ACodec ADC Boost Gain:为 codec 模拟音量,数值实际有效取值范围为1~3
      • vol 0: Disabled and not recommended
      • vol 1: 0dB
      • vol 2: 20dB
      • vol 3: 12dB
    • ACodec ADC ALC PGA Gain:为 codec 模拟音量,数值取值范围为0~255
      • min: -9dB (vol: 0)
      • max: +37.5dB (vol: 255)
      • step: +1.5dB
      • location: 0dB (vol: 6)
    • ACodec ADC Digital Gain:为 codec 数字音量,数值取值范围为0~255
      • min: -97.5dB (vol: 0)
      • max: +30dB (vol: 255)
      • step: +0.5dB
      • location: 0dB (vol: 195)
    • ADC Mode:“Diff”为差分“Differential”的缩写;“Sing”为单端“Single-end”的缩写。用于配置 ACodec ADC 工作在差分或者单端模式。默认为“Diff”差分模式。且为了最大限度节省功耗,ADC 仅使能L左声道。因此,“DiffadcL”为默认首选项。
    • ACodec DAC Lineout Gain:音量数值取值范围为0~30
      • min: -39dB (vol: 0)
      • max: +6dB (vol: 30)
      • step: +1.5dB
      • location: 0dB (vol: 26)
    • ACodec DAC HPMIX Gain:它为 Lineout 的前级 Gain,通常不做设置。音量数值取值范围实际为1和2
      • vol 0: Disabled and not recommended
      • vol 1: 0dB
      • vol 2: 6dB
    • AGC Left Approximate Sample Rate:PCM(脉冲编码调制)音频的常用采样率包括但不限于以下几种
      • 8 kHz:用于电话系统和语音通信,一般用于窄带语音通信,音质较差
      • 16 kHz:常见于语音识别、语音留言等应用中,音质较好
      • 32 kHz:用于早期的音频存储和播放设备,也常见于一些低质量音频录制设备
      • 44.1 kHz:CD音质标准采样率,也是许多数字音频文件的标准采样率,适用于音乐存储和播放
      • 48 kHz:广泛应用于数字音频领域,包括音乐录制、电影制作等,也是许多专业和消费级数字音频设备的标准采样率
      • 96 kHz:高保真音频录制和播放,用于专业音乐制作和发烧友级别的音频设备

4. 录制

  1. 使用采样率16kHz/2ch/16bit的 PCM 格式录音,rk_mpi_ai_tes t命令同样默认处理16bit位深。

    rk_mpi_ai_test --sound_card_name=hw:0,0 --device_rate=16000 --device_ch=2 --out_rate=16000 --out_ch=2 --output=/tmp
    • --sound_card_name=hw:0,0:指定音频输入设备的名称为 "hw:0,0",这通常是 ALSA(Advanced Linux Sound Architecture)中设备的名称,代表第一个声卡的第一个设备
    • --device_rate=16000:指定音频输入设备的采样率为 16000 Hz
    • --device_ch=2:指定音频输入设备的通道数为 2(立体声)
    • --out_rate=16000:指定输出音频的采样率为 16000 Hz
    • --out_ch=2:指定输出音频的通道数为 2(立体声)
    • --output=/tmp:指定输出音频数据的文件路径为 /tmp 目录
  2. 使用采样率16kHz/2ch/16bit的 WAV 格式录音

    arecord -f S16_LE -c 2 -r 16000 -D hw:0 -d 30 test.wav
    • -f S16_LE:指定PCM格式为16位小端(16-bit Little Endian),常见采样大小有 8 BIT、16BIT、32BIT(FLTP)
    • -c 2:指定声道数为2,即双声道。一般有单通道、双声道、四声道、5.1声道等四种通道数
    • -r 16000:指定采样率为16 kHz
    • -D hw:0:指定音频设备为hw:0
    • -d 30:指定录制时间为30秒
    • test.wav:指定输出文件名为test.wav
  3. 如果没有指定采样率参数,arecord 将使用默认的采样率。通常,arecord 的默认采样率是44100 Hz(44.1 kHz),这是 CD 音频标准的采样率。

    arecord -f cd -Dhw:0 -d 30 test.wav

5. 播放

  1. 播放 PCM 格式的音频。

    rk_mpi_ao_test -i /root/2.pcm   --sound_card_name=hw:0,0 --device_ch=2 --device_rate=16000 --input_rate=16000 --input_ch=2
  2. 播放 WAV 格式的音频。

    aplay -Dhw:0 test.wav
  3. 播放 MP3 格式的音频。

    madplay anheqiao.mp3 
  4. 在音频格式丰富多样的情况下,我们可以利用 ffmpeg 工具,将各种音频统一转换成 WAV 格式。

    ffmpeg -i anheqiao.mp3 -f wav -acodec pcm_s16le -ar 44100 -ac 2 output.wav
    • -f wav 选项来明确指定输出文件的格式为 WAV

    • -acodec pcm_s16le 选项指定了音频编解码器为 pcm_s16le,表示使用 16 位有符号整数格式进行编码

    • -ar 44100 选项指定了输出音频的采样率为 44100 Hz

    • -ac 2 选项指定了输出音频的声道数为 2,表示双声道音频

6. 音量调整

  1. 调节扬声器音量(推荐)

    # amixer cset name='DAC LINEOUT Volume' 15
    numid=24,iface=MIXER,name='DAC LINEOUT Volume'
    ; type=INTEGER,access=rw---R--,values=1,min=0,max=30,step=0
    : values=15
    | dBscale-min=-39.00dB,step=1.50dB,mute=1
    • 根据自己的需求调节,范围是0-30
  2. 使用 sox 调节音量

    #查看音量可以最大调整值倍数——Volume adjustment
    # sox anheqiao.wav -n stat
    Samples read: 22058820
    Length (seconds): 250.100000
    Scaled by: 2147483647.0
    Maximum amplitude: 0.891235
    Minimum amplitude: -0.891266
    Midline amplitude: -0.000015
    Mean norm: 0.153542
    Mean amplitude: -0.000068
    RMS amplitude: 0.206771
    Maximum delta: 1.232666
    Minimum delta: 0.000000
    Mean delta: 0.060496
    RMS delta: 0.092891
    Rough frequency: 3153
    Volume adjustment: 1.122

    #设置音量因子,生成另一个文件
    sox -v 0.2 anheqiao.wav output.wav
    • SoX是一个强大的音频处理工具,但是它的某些功能,比如MP3编码,可能需要特定的编译选项和依赖库才能支持。