21. 音频#

本章配套视频介绍:

../../_images/video.png

《42-鲁班猫音频播放和录制》

https://www.bilibili.com/video/BV14s4y1r7Ud/

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

21.1. 声卡设备#

21.1.1. 获取录音设备#

 1#获取录音设备
 2arecord -l
 3
 4#例子
 5root@lubancat:~# arecord -l
 6**** List of CAPTURE Hardware Devices ****
 7card 0: rockchipes8388 [rockchip-es8388], device 0: dailink-multicodecs ES8323 HiFi-0 [dailink-multicodecs ES8323 HiFi-0]
 8   Subdevices: 1/1
 9   Subdevice #0: subdevice #0
10card 1: rockchiphdmi [rockchip-hdmi], device 0: rockchip-hdmi i2s-hifi-0 [rockchip-hdmi i2s-hifi-0]
11   Subdevices: 1/1
12   Subdevice #0: subdevice #0
  • card 0 :板载音频处理芯片rockchip-es8388

  • card 1 :HDMI音频

  • card 0 和 card 1 是这些设备在Linux里注册的设备,我们可以通过应用程序调用这些接口

21.1.2. 获取播放设备#

 1#获取播放设备
 2aplay -l
 3
 4root@lubancat:~# aplay -l
 5**** List of PLAYBACK Hardware Devices ****
 6card 0: rockchipes8388 [rockchip-es8388], device 0: dailink-multicodecs ES8323 HiFi-0 [dailink-multicodecs ES8323 HiFi-0]
 7   Subdevices: 1/1
 8   Subdevice #0: subdevice #0
 9card 1: rockchiphdmi [rockchip-hdmi], device 0: rockchip-hdmi i2s-hifi-0 [rockchip-hdmi i2s-hifi-0]
10   Subdevices: 1/1
11   Subdevice #0: subdevice #0
12card 2: rockchipdp0 [rockchip-dp0], device 0: rockchip-dp0 spdif-hifi-0 [rockchip-dp0 spdif-hifi-0]
13   Subdevices: 1/1
14   Subdevice #0: subdevice #0
  • card 0 :板载音频处理芯片rockchip-es8388

  • card 1、2 :HDMI和DP音频输出

  • card 0 、card 1和card 2 是这些设备在Linux里注册的设备,我们可以通过应用程序调用这些接口

21.1.3. 声卡驱动目录#

查看声卡驱动目录

1ls /dev/snd/
1root@lubancat:~# ls /dev/snd/
2by-path    controlC1  pcmC0D0c  pcmC1D0c  pcmC2D0p  timer
3controlC0  controlC2  pcmC0D0p  pcmC1D0p  seq
4root@lubancat:~#
  • controlC0:用于声卡控制,C0 表示声卡0,对应上文的es8388音频输出。

  • controlC1:用于声卡控制,C1 表示声卡1,对应上文的HDMI音频输出。

  • controlC2:用于声卡控制,C2 表示声卡2,对应上文的DP音频输出。

  • pcmC0D0p:用于播放的 pcm 设备,最后面的“p”是 playback 的缩写,表示放音。

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

  • pcmC1D0p:用于播放的 pcm 设备,最后面的“p”是 playback 的缩写,表示放音。

  • timer :定时器

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

1root@lubancat:~# ls -l /dev/snd/by-path/
2total 0
3lrwxrwxrwx 1 root root 12  1月15日 11:00 platform-dp0-sound -> ../controlC2
4lrwxrwxrwx 1 root root 12  1月15日 11:00 platform-es8388-sound -> ../controlC0
5lrwxrwxrwx 1 root root 12  1月15日 11:00 platform-hdmi-sound -> ../controlC1
6root@lubancat:~#
  • 可以看到每个control之间都有一个对应关系,而这些对应关系正好对应上文的 card 0 , card 1 , card 2

21.2. 配置声卡#

21.2.1. amixer#

使用amixer可以获取声卡的详细配置

使用amixer前需要知道你需要的配置的声卡的设备号(card x, 如card 0)

下面以rockchip-es8388(card 0)为例进行配置

1#列出可以控制card 0的控制器
2amixer controls -c 0
 1root@lubancat:~# amixer controls -c 0
 2numid=62,iface=CARD,name='Headphone Jack'
 3numid=63,iface=CARD,name='Headset Mic Jack'
 4numid=66,iface=MIXER,name='Headphone Switch'
 5numid=56,iface=MIXER,name='PCM Volume'
 6numid=73,iface=MIXER,name='Mono Mux'
 7numid=61,iface=MIXER,name='ADC Data Select'
 8numid=50,iface=MIXER,name='Capture Digital Volume'
 9numid=51,iface=MIXER,name='Capture Mute'
10numid=55,iface=MIXER,name='Capture Polarity'
11numid=54,iface=MIXER,name='Playback De-emphasis'
12numid=37,iface=MIXER,name='3D Mode'
13numid=72,iface=MIXER,name='Differential Mux'
14numid=69,iface=MIXER,name='Headset Mic Switch'
15numid=52,iface=MIXER,name='Left Channel Capture Volume'
16numid=74,iface=MIXER,name='Left Line Mux'
17numid=77,iface=MIXER,name='Left Mixer Left Bypass Switch'
18numid=57,iface=MIXER,name='Left Mixer Left Bypass Volume'
19numid=76,iface=MIXER,name='Left Mixer Left Playback Switch'
20numid=70,iface=MIXER,name='Left PGA Mux'
21numid=68,iface=MIXER,name='Main Mic Switch'
22numid=80,iface=MIXER,name='OUT1 Switch'
23numid=81,iface=MIXER,name='OUT2 Switch'
24numid=59,iface=MIXER,name='Output 1 Playback Volume'
25numid=60,iface=MIXER,name='Output 2 Playback Volume'
26numid=53,iface=MIXER,name='Right Channel Capture Volume'
27numid=75,iface=MIXER,name='Right Line Mux'
28numid=79,iface=MIXER,name='Right Mixer Right Bypass Switch'
29numid=58,iface=MIXER,name='Right Mixer Right Bypass Volume'
30numid=78,iface=MIXER,name='Right Mixer Right Playback Switch'
31numid=71,iface=MIXER,name='Right PGA Mux'
32......
33root@lubancat:~#
  • Capture Volume :配置录音声音的大小

  • Playback Volume :配置播放声音的大小

 1#列出所有card 0控制器能配置的值
 2amixer contents -c 0
 3
 4root@lubancat:~# amixer contents -c 0
 5numid=62,iface=CARD,name='Headphone Jack'
 6; type=BOOLEAN,access=r-------,values=1
 7: values=off
 8numid=63,iface=CARD,name='Headset Mic Jack'
 9; type=BOOLEAN,access=r-------,values=1
10: values=off
11numid=66,iface=MIXER,name='Headphone Switch'
12; type=BOOLEAN,access=rw------,values=1
13: values=off
14numid=56,iface=MIXER,name='PCM Volume'
15; type=INTEGER,access=rw---R--,values=2,min=0,max=192,step=0
16: values=192,192
17| dBscale-min=-96.00dB,step=0.50dB,mute=1
18numid=73,iface=MIXER,name='Mono Mux'
19; type=ENUMERATED,access=rw------,values=1,items=3
20; Item #0 'Stereo'
21; Item #1 'Mono (Left)'
22; Item #2 'Mono (Right)'
23: values=0
24numid=61,iface=MIXER,name='ADC Data Select'
25; type=ENUMERATED,access=rw------,values=1,items=4
26; Item #0 'Left Right'
27; Item #1 'Left Left'
28; Item #2 'Right Right'
29; Item #3 'Right Left'
30: values=0
31numid=50,iface=MIXER,name='Capture Digital Volume'
32; type=INTEGER,access=rw---R--,values=2,min=0,max=192,step=0
33: values=192,192
34| dBscale-min=-96.00dB,step=0.50dB,mute=1
35numid=51,iface=MIXER,name='Capture Mute'
36; type=BOOLEAN,access=rw------,values=1
37: values=off
38......
39root@lubancat:~#
  • 可以看到列出了每个控制器能配置的值,以及当前的值

 1#获取对应的控制器配置的值
 2amixer -c $card_id cget $id
 3#设置对应的控制器配置的值
 4amixer -c $card_id 0 cset $id $value
 5
 6#例:获取card0的声音播放音量大小
 7root@lubancat:~# amixer -c 0 cget numid=59
 8numid=59,iface=MIXER,name='Output 1 Playback Volume'
 9; type=INTEGER,access=rw---R--,values=2,min=0,max=33,step=0
10: values=27,27
11| dBscale-min=-45.00dB,step=1.50dB,mute=0
12
131. values=2 : 需要配置两个值
142. min=0 :可配置的最小值为0
153. max=33 :可配置的最大值为33
164. values=27,27:当前的值为27,27(左右声道)
17
18#设置card0声音播放音量大小为150,150
19root@lubancat:~# amixer -c 0 cset numid=59 "30,30"
20numid=59,iface=MIXER,name='Output 1 Playback Volume'
21; type=INTEGER,access=rw---R--,values=2,min=0,max=33,step=0
22: values=30,30
23| dBscale-min=-45.00dB,step=1.50dB,mute=0
24root@lubancat:~#
25
26可以看到成功配置完成

21.2.2. alsamixer(推荐)#

这是一个命令行图形化的配置工具

1#打开声卡0配置
2alsamixer -Dhw:0
3
4#打开声卡1配置
5alsamixer -Dhw:1

打开界面后也可以按 F6 选择自己想要配置的声卡

未找到图片
  • 按 F4 可进入录音设置模式

未找到图片

21.3. 保存声卡设置#

当我们需要保存当前声卡设置,需要使用如下命令生成声卡配置文件:

1alsactl store

声卡配置文件默认保存在/var/lib/alsa目录下,名字为asound.state。有了该配置文件, 可以使用以下命令来使该配置文件生效:

1alsactl restore

21.4. 录音与播放#

21.4.1. 命令行#

21.4.1.1. 录音#

录音使用的是arecord命令,在这里列出一下简单的命令

1#获取录音设备
2arecord -l
1#使用声卡0,cd音质,录制10s
2arecord -f cd -Dhw:0 -d 10 test.wav
  • -f 是设置录音质量,cd表示录音质量为 cd 级别

  • -d 是指定录音时间,单位是 s

  • -Dhw:0 是使用card 0作为录音设备

  • test.wav是生成的录音文件名

更多命令需要自己去探索

1#获取更多用法
2arecord -h

21.4.1.2. 音频播放#

1#获取播放设备
2aplay -l

在播放声音前请确认声卡控制器的配置。

1#播放上面产出的录音
2aplay -Dhw:0 test.wav
  • aplay命令只能播放wav格式的音频

更多命令需要自己去探索

1#获取更多用法
2aplay -h

21.4.1.3. 边录音边播放#

利用arecord和aplay两个工具

1#使用card 0录制并使用card 0进行播放
2sudo arecord -f cd -Dhw:0 | aplay -Dhw:0

21.4.1.4. 多格式音频播放#

如果需要播放除wav格式外的比较通用的文件格式(mp3,flac等),可以参照一下方法

SoX是一个跨平台的命令行实用程序, 可以将各种格式的音频文件转换为需要的其他格式。 SoX 还可以对输入的音频文件应用各种效果,也支持在大多数平台上播放和录制音频文件。

本小节仅以简单的测试播放,更多使用方式请参考官方说明文档: http://sox.sourceforge.net/

用以下命令安装sox,libsox-fmt-all包含各个格式的解码器。

1sudo apt install sox libsox-fmt-all

使用方法:

1#使用card 0播放mp3音频
2play -d hw:0 xxx.mp3
3
4#使用card 0播放wav音频
5play -d hw:0 xxx.wav
6
7#使用card 0播放flac音频
8play -d hw:0 xxx.flac

21.4.2. 桌面端#

21.4.2.1. 音频管理#

打开软件

未找到图片

输出设备配置

未找到图片

输入设备配置

未找到图片

21.4.2.2. 录音#

安装录音软件

1#安装软件
2sudo apt install gnome-sound-recorder

打开软件

未找到图片

软件设置

未找到图片

按左上角的record就可以录制了,按done结束录音,录音的路径为/home/cat/Recordings 如果录制的时候波形图没有东西就要检查以下耳机是否插好。

未找到图片

播放录音

未找到图片

当然,你也可以安装其他更专业,更强大的录音软件。

21.4.2.3. 播放音乐#

默认音乐软件是mpv Media Player, 如果想要使用其他的音乐播放器,可自行根据播放器的安装方法安装。

打开方法

未找到图片

然后,可以把文件拖进mpv软件里

未找到图片

播放界面

未找到图片
21.4.2.3.1. ffplay#

ffplay 是 FFMpeg 自带的播放器,使用了 ffmpeg 解码库和用于视频渲染显示的 sdl 库, 也是业界播放器最初参考的设计标准。

ffplay既可以播放音频,又可以播放视频,是从事音视频相关开发的工作人员常用的基础工具之一。

LubanCat-RK3576系列板卡在系统上预装了ffmpeg工具包,因此无需安装即可使用

ffplay 需要使用图形界面播放,如果没有图形界面, 或者没有用带X server的图形界面的SSH连接终端连接,是无法正常播放的。 (比如:mobaxterm)

这里推荐使用mobaxterm 用SSH连接LubanCat板卡,然后开启X server服务,就能观看,或者播放音乐。

1#ffplay兼容多种类型的音频格式
2ffplay xxx.mp3

如下图

未找到图片

如果用ssh连接LubanCat-RK3576系列板卡,具有X server服务的远程连接客户端会 自动打开播放音乐的频谱图

未找到图片

除了默认的方法打开,还可以通过配置选项

1#关闭任何播放图形
2ffplay -showmode 0 01.mp3
3#播放音乐波形图
4ffplay -showmode 1 01.mp3
5#播放音乐频谱图
6ffplay -showmode 2 01.mp3

波形图如下

未找到图片