15. 音频

音视频是人类在日常生活里面使用非常广泛的信息获取方式,它的本质就是声音和图像信息的采集、存储和回放。 本章我们来介绍音视频播放的相关基础概念,并且给大家演示如何在板卡上进行音视频的播放。

15.1. 硬件连接

lubancat-p1板载耳机输出接口、喇叭接口,可以接入耳机或者喇叭,如下图所示:

未找到图片

15.2. 声卡设备

15.2.1. 查看设备

执行arecord -l可查看系统录音设备:

1
2
3
4
5
6
7
8
#查看录音设备
arecord -l

#信息输出
**** List of CAPTURE Hardware Devices ****
card 0: cv182xaadc [cv182xa_adc], device 0: cviteka-adc 300a100.adc-0 [cviteka-adc 300a100.adc-0]
Subdevices: 1/1
Subdevice #0: subdevice #0

执行aplay -l可查看系统播放设备:

1
2
3
4
5
6
7
8
#获取播放设备
aplay -l

#信息输出
**** List of PLAYBACK Hardware Devices ****
card 1: cv182xadac [cv182xa_dac], device 0: cviteka-dac 300a000.dac-0 [cviteka-dac 300a000.dac-0]
Subdevices: 1/1
Subdevice #0: subdevice #0

card 0 和 card 1分别对应录音和播放设备。

15.2.2. 声卡驱动目录

查看声卡驱动目录

1
2
#查看声卡驱动目录
ls /dev/snd/
1
2
cat@lubancat:~$ ls /dev/snd/
by-path  controlC0  controlC1  pcmC0D0c  pcmC1D0p  timer
  • controlC0:用于声卡控制,C0 表示声卡0,对应上文的cv182xaadc录音设备。

  • controlC1:用于声卡控制,C1 表示声卡1,对应上文的cv182xadac播放设备。

  • pcmC0D0c:用于录音的 pcm 设备,最后面的“c”是 capture 的缩写,表示录音

  • pcmC1D0p:用于录音的 pcm 设备,最后面的“c”是 capture 的缩写,表示放音

  • timer :定时器

  • by-path: 保存着设备的对应关系

1
2
3
4
5
6
7
ls -l /dev/snd/by-path/

cat@lubancat:~$ ls -l /dev/snd/by-path/
total 0
lrwxrwxrwx 1 root root 12 Nov 22  2023 platform-sound_adc -> ../controlC0
lrwxrwxrwx 1 root root 12 Nov 22  2023 platform-sound_dac -> ../controlC1
cat@lubancat:~$
  • 可以看到每个control之间都有一个对应关系,而这些对应关系正好对应上文的 card 0 , card 1

15.3. 配置声卡

一般的配置声卡工具例如amixer、alsamixer进行配置会出现问题,需要使用算能官方提供的配置程序sample_audio进行配置。

程序对应的源码在sdk源码中,路径为cvi_mmf_sdk/middleware/v2/sample/audio

执行以下命令可以查看sample_audio程序可选参数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#查看可选参数
/mnt/system/usr/bin/sample_audio

#信息输出
/Usage:./sample_audio <index>/
      0:Ai bind Aenc, save as file
      1:Ai unbind Aenc, save as file
      2:Adec bind ao, save as file
      3:Adec unbind ao, save as file
      4:recording frame by frame
      5:playing audio frame by frame
      6:SetVolume db test
      7:Audio Version
      8:GetVolume db test
      9:ioctl test
      10:Aec test
[---------Sample Audio USE-------]
use: sample_audio 1 --list
-r [sample_rate] -R [Chnsample_rate]
-c [channel] -p [preiod_size][*aac enc must 1024]
-C [codec 0:g726 1:g711A 2:g711Mu 3: adpcm 4.AAC]
-V [bVqeOn] -F [In/Out filename] -T [record time]
Aenc eg:./sample_audio 0 --list -r 8000 -R 8000 -c 2 -p 320 -C 1 -V 0 -F Cvi_8k_2chn.g711a -T 10
      :./sample_audio 0 --list -r 8000 -R 8000 -c 2 -p 1024 -C 4 -V 0 -F Cvi_8k_2chn.aac -T 10
Adec eg:./sample_audio 2 --list -r 8000 -R 8000 -c 2 -p 320 -C 1 -V 0 -F Cvi_8k_2chn.g711a -T 10
Ai eg:./sample_audio 4 --list -r 8000 -R 8000 -c 2 -p 320 -C 0 -V 0 -F Cvi_8k_2chn.raw -T 10
Ao eg:./sample_audio 5 --list -r 8000 -R 8000 -c 2 -p 320 -C 0 -V 0 -F Cvi_8k_2chn.raw -T 10
SetVol eg:./sample_audio 6
GetVol eg:./sample_audio 8
AECtest eg:./sample_audio 10 --list -r 8000 -R 8000 -c 2 -p 320 -C 0 -V 1 -F play.wav -T 10
[----------------------------------]

命令说明:

命令的基本格式是 ./sample_audio <index>,其中 <index> 是指定的操作序号。

操作列表 每个操作的含义如下:

  • 0:Ai bind Aenc, save as file: 绑定音频输入(Ai)到音频编码(Aenc),并将结果保存为文件。

  • 1:Ai unbind Aenc, save as file: 解除音频输入(Ai)与音频编码(Aenc)的绑定,并将结果保存为文件。

  • 2:Adec bind ao, save as file: 绑定音频解码(Adec)到音频输出(ao),并将结果保存为文件。

  • 3:Adec unbind ao, save as file: 解除音频解码(Adec)与音频输出(ao)的绑定,并将结果保存为文件。

  • 4:recording frame by frame: 录制音频。

  • 5:playing audio frame by frame: 播放音频。

  • 6:SetVolume db test: 设置音量。

  • 7:Audio Version: 显示音频版本信息。

  • 8:GetVolume db test: 获取音量。

  • 9:ioctl test: 进行输入输出控制。

  • 10:Aec test: 进行音频回声消除(AEC)测试。

使用示例

1
2
#查看版本信息
/mnt/system/usr/bin/sample_audio 7

15.3.1. 设置音量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#进行输入输出控制
sudo /mnt/system/usr/bin/sample_audio 9

#信息输出如下
[cvi_info] cvi_sample_audio:Enter command id =[9]
[cviaudio] ioctl_test!
Enter SAMPLE_AUDIO_DEBUG_IOCTL_TEST
[SAMPLE_COMM_AUDIO_CfgAcodec_Test][1728]
IOCTL SAMPLE_COMM_AUDIO_CfgAcodec_Test 182x
Correspond cmd as below------------------------------
0:ACODEC_SOFT_RESET_CTRL  //控制音频编解码器进行软件复位。
1:ACODEC_SET_I2S1_FS      //设置I2S1的采样率。
2:ACODEC_SET_INPUT_VOL    //设置输入音频的音量。
3:ACODEC_GET_INPUT_VOL    //获取输入音频的音量。
4:ACODEC_SET_OUTPUT_VOL   //设置输出音频的音量。
5:ACODEC_GET_OUTPUT_VOL   //获取输出音频的音量。
6:ACODEC_SET_MIXER_MIC    //设置混音器的麦克风参数。
7:ACODEC_SET_GAIN_MICL    //设置左声道麦克风增益。
8:ACODEC_SET_GAIN_MICR    //设置右声道麦克风增益。
9:ACODEC_SET_DACL_VOL     //设置左声道DAC的音量。  (播放音量)
10:ACODEC_SET_DACR_VOL    //设置右声道DAC的音量。
11:ACODEC_SET_ADCL_VOL    //设置左声道ADC的音量。  (录音音量)
12:ACODEC_SET_ADCR_VOL    //设置右声道ADC的音量。
13:ACODEC_SET_MICL_MUTE   //设置左声道麦克风静音状态。
14:ACODEC_SET_MICR_MUTE   //设置右声道麦克风静音状态。
15:ACODEC_SET_DACL_MUTE   //设置左声道DAC静音状态。
16:ACODEC_SET_DACR_MUTE   //设置右声道DAC静音状态。
17:ACODEC_GET_GAIN_MICL   //获取左声道麦克风增益。
18:ACODEC_GET_GAIN_MICR   //获取右声道麦克风增益。
19:ACODEC_GET_DACL_VOL    //获取左声道DAC音量。
20:ACODEC_GET_DACR_VOL    //获取右声道DAC音量。
21:ACODEC_GET_ADCL_VOL    //获取左声道ADC音量。
22:ACODEC_GET_ADCR_VOL    //获取右声道ADC音量。
23:ACODEC_SET_PD_DACL     //控制左声道DAC的电源状态。
24:ACODEC_SET_PD_DACR     //控制右声道DAC的电源状态
25:ACODEC_SET_PD_ADCL     //控制左声道ADC的电源状态。
26:ACODEC_SET_PD_ADCR     //控制右声道ADC的电源状态。
27:ACODEC_SET_PD_LINEINL  //控制左声道线路输入的电源状态。
28:ACODEC_SET_PD_LINEINR  //控制右声道线路输入的电源状态。
29:ACODEC_SET_DAC_DE_EMPHASIS //设置DAC的去加重滤波器
30:ACODEC_SET_ADC_HP_FILTER   //置ADC的高通滤波器。
-----------------------------------------------------------
[SAMPLE_COMM_AUDIO_CfgAcodec_Test]get value in line[1800]: val = [0]
[SAMPLE_COMM_AUDIO_CfgAcodec_Test]get value in line[1805]: val = [0]

------------------------------
Please Enter command

根据信息输出,调整音量需要调整的是9、10播放音量、11、12录音音量,如果需要调整其他可自行调整,以下以调整左声道播放音量为例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#进行输入输出控制
sudo /mnt/system/usr/bin/sample_audio 9

#省略信息
....

#输入9设置左声道DAC的音量
9

#输入要设置的音量数值,范围0~32
24

#信息输出如下
Please Enter command
9
---->[9]
24
enter  ACODEC_SET_DACL_VOL[32-0, 0:mute]:
Enter[24]
vol_ctrl.vol_ctrl_mute set 0
fdAcodec_dac ACODEC_SET_DACL_VOL [24]ok!
[cviaudio] ioctl_test!...end

同理调整右声道播放音量,使用EOF方式输入:

1
2
3
4
5
#设置右声道播放音量
sudo /mnt/system/usr/bin/sample_audio 9  <<EOF
10
24
EOF

如果需要调整录音音量,示例如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#设置左声道ADC的音量
sudo /mnt/system/usr/bin/sample_audio 9  <<EOF
11
24
EOF

#设置右声道ADC的音量
sudo /mnt/system/usr/bin/sample_audio 9  <<EOF
12
24
EOF

提示

以上使用EOF输入方式,可以直接加了shell脚本中,一键配置。

15.3.2. 播放音乐

同样可以使用sample_audio播放音乐,输入参数为5,执行以下命令查看播放音乐时可使用的参数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#查看播放音乐时可使用的参数
sudo /mnt/system/usr/bin/sample_audio 5

#信息输出如下
[---------Sample Audio USE-------]
use: sample_audio 1 --list
-r [sample_rate] -R [Chnsample_rate]
-c [channel] -p [preiod_size][*aac enc must 1024]
-C [codec 0:g726 1:g711A 2:g711Mu 3: adpcm 4.AAC]
-V [bVqeOn] -F [In/Out filename] -T [record time]
Aenc eg:./sample_audio 0 --list -r 8000 -R 8000 -c 2 -p 320 -C 1 -V 0 -F Cvi_8k_2chn.g711a -T 10
      :./sample_audio 0 --list -r 8000 -R 8000 -c 2 -p 1024 -C 4 -V 0 -F Cvi_8k_2chn.aac -T 10
Adec eg:./sample_audio 2 --list -r 8000 -R 8000 -c 2 -p 320 -C 1 -V 0 -F Cvi_8k_2chn.g711a -T 10
Ai eg:./sample_audio 4 --list -r 8000 -R 8000 -c 2 -p 320 -C 0 -V 0 -F Cvi_8k_2chn.raw -T 10
Ao eg:./sample_audio 5 --list -r 8000 -R 8000 -c 2 -p 320 -C 0 -V 0 -F Cvi_8k_2chn.raw -T 10
SetVol eg:./sample_audio 6
GetVol eg:./sample_audio 8
AECtest eg:./sample_audio 10 --list -r 8000 -R 8000 -c 2 -p 320 -C 0 -V 1 -F play.wav -T 10
[----------------------------------]
  • -r [sample_rate] :设置采样率。

  • -R [Chnsample_rate] :设置通道的采样率。

  • -c [channel]:设置音频通道数,比如 -c 2 表示双声道。

  • -p [period_size] 设置周期大小,特别是对于AAC编码,必须设置为1024。

  • -C [codec]设置编解码器类型:0:G.726 ,1:G.711 A-law ,2:G.711 μ-law,3:ADPCM,4:AAC

  • -V [bVqeOn] 设置是否开启VQE(Voice Quality Enhancement)功能。-V 1 表示开启,-V 0 表示关闭。

  • -F [In/Out filename]:指定输入或输出文件名。

  • -T [record time]:设置录音的时长,单位是秒。

以播放wav格式的音频文件为例,以下xxx.wav代指实际音频文件:

1
2
3
4
5
#查看音频文件采样率
file xxx.wav

#播放音频文件,采样率根据实际音频文件确定,单位是hz
sudo /mnt/system/usr/bin/sample_audio 5 --list -r 44100 -R 44100 -c 2 -p 320 -C 0 -V 0 -F xxx.wav -T 10

以上-T参数在播放时实际没有使用,只在录音时使用,但仍需添加,如果需要播放固定时间的音频可以使用timeout命令,如下:

1
2
#播放5s
sudo timeout 5 /mnt/system/usr/bin/sample_audio 5 --list -r 44100 -R 44100 -c 2 -p 320 -C 0 -V 0 -F xxx.wav -T 10

如果是mp3、flac格式的音频文件需要转换成wav格式再进行播放,转换可以在pc上或者Linux下可以通过sox或者ffmpeg进行转换。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#使用sox转换mp3,-b 16表示输出的wav文件是16位深度的音频文件
sox xxx.mp3 -b 16 xxx.wav

#使用sox转换flac
sox xxx.flac xxx.wav



#使用ffmpeg转换mp3
ffmpeg -i xxx.mp3 xxx.wav

#使用ffmpeg转换flac
ffmpeg -i xxx.flac xxx.wav

15.3.3. 录音

同样可以使用sample_audio进行录音,输入参数为4,执行以下命令查看录音可使用的参数。

1
2
#查看播放音乐时可使用的参数
sudo /mnt/system/usr/bin/sample_audio 4

输出的信息和播放的一样,此处不在赘述。

测试录音前需要接上耳机,录音时可以对着耳机的麦进行说话。

1
2
#录音10s
sudo /mnt/system/usr/bin/sample_audio 4 --list -r 8000 -R 8000 -c 2 -p 320 -C 0 -V 0 -F Cvi_8k_2chn.raw -T 10

生成的是Cvi_8k_2chn.raw就是录音生成的音频文件。

1
2
#播放录音文件
sudo /mnt/system/usr/bin/sample_audio 5 --list -r 8000 -R 8000 -c 2 -p 320 -C 0 -V 0 -F Cvi_8k_2chn.raw   -T 10

更多用法可以查看源码或者算能官方文档:

《sophgo-音频》