15. 音频

本章配套视频介绍:

../../_images/video.png

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

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

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

15.1. 声卡设备

15.1.1. 获取录音设备

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#获取录音设备
arecord -l

#例子
root@lubancat:~# arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: rockchiprk809co [rockchip,rk809-codec], device 0: fe410000.i2s-rk817-hifi rk817-hifi-0 [fe410000.i2s-rk817-hifi rk817-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Camera [USB Camera], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
root@lubancat:~#
  • card 1 :板载音频处理芯片rockchip RK809。

  • card 2 :usb摄像头自带的数字麦克风。

15.1.2. 获取播放设备

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

root@lubancat:~# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: rockchiphdmi [rockchip,hdmi], device 0: fe400000.i2s-i2s-hifi i2s-hifi-0 [fe400000.i2s-i2s-hifi i2s-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: rockchiprk809co [rockchip,rk809-codec], device 0: fe410000.i2s-rk817-hifi rk817-hifi-0 [fe410000.i2s-rk817-hifi rk817-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
  • card 0 :HDMI声音输出。

  • card 1 :板载音频处理芯片rockchip RK809。

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

15.1.3. 声卡驱动目录

1
2
3
4
5
6
#查看声卡驱动目录
ls /dev/snd/

#信息输出如下
by-id    controlC0  controlC2  pcmC1D0c  pcmC2D0c  timer
by-path  controlC1  pcmC0D0p   pcmC1D0p  seq
  • controlC0:用于声卡控制,C0 表示声卡0,对应上文的HDMI声音输出。

  • controlC1:用于声卡控制,C1 表示声卡1,对应上文的板载音频处理芯片rockchip RK809。

  • controlC2:用于声卡控制,C2 表示声卡2,对应上文的usb摄像头自带的数字麦克风。

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

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

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

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

  • timer :定时器。

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

1
2
3
4
5
6
7
#查看by-path目录
ls -l /dev/snd/by-path/

#信息输出如下
lrwxrwxrwx 1 root root 12 Feb 14 18:11 platform-fd880000.usb-usb-0:1.4:1.2 -> ../controlC2
lrwxrwxrwx 1 root root 12 Feb 14 18:11 platform-hdmi-sound -> ../controlC0
lrwxrwxrwx 1 root root 12 Feb 14 18:11 platform-rk809-sound -> ../controlC1
  • 可以看到每个control之间都有一个对应关系,而这些对应关系正好对应上文的 card 0 , card 1 , card 2

15.2. 配置声卡

15.2.1. amixer

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

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

下面以rockchip RK809(card 1)为例进行配置。

1
2
3
4
5
6
7
8
#列出可以控制card 1的控制器
amixer controls -c 1

#信息输出如下
numid=2,iface=MIXER,name='Capture MIC Path'
numid=4,iface=MIXER,name='Capture Volume'
numid=1,iface=MIXER,name='Playback Path'
numid=3,iface=MIXER,name='Playback Volume'
  • Capture MIC Path :配置录音的方式,可以配置麦克风关闭和开启,以及配置麦克风录音的方式,增益方式,降噪等(前提是声卡支持设置)。

  • Capture Volume :配置录音声音的大小。

  • Playback Path :配置声音播放的方式,可以配置声音播放开启与关闭,可以配置耳机,扬声器等方式播放音乐,以及可以配置降噪,增益方式等(前提是声卡支持设置)。

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

 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
#列出所有card 1控制器能配置的值
amixer contents -c 1

#信息输出如下
numid=2,iface=MIXER,name='Capture MIC Path'
  ; type=ENUMERATED,access=rw------,values=1,items=4
  ; Item #0 'MIC OFF'
  ; Item #1 'Main Mic'
  ; Item #2 'Hands Free Mic'
  ; Item #3 'BT Sco Mic'
  : values=1
numid=4,iface=MIXER,name='Capture Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=255,step=0
  : values=255,0
  | dBscale-min=-95.00dB,step=0.37dB,mute=0
numid=1,iface=MIXER,name='Playback Path'
  ; type=ENUMERATED,access=rw------,values=1,items=11
  ; Item #0 'OFF'
  ; Item #1 'RCV'
  ; Item #2 'SPK'
  ; Item #3 'HP'
  ; Item #4 'HP_NO_MIC'
  ; Item #5 'BT'
  ; Item #6 'SPK_HP'
  ; Item #7 'RING_SPK'
  ; Item #8 'RING_HP'
  ; Item #9 'RING_HP_NO_MIC'
  ; Item #10 'RING_SPK_HP'
  : values=2
numid=3,iface=MIXER,name='Playback Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=252,step=0
  : values=252,252
  | dBscale-min=-95.00dB,step=0.37dB,mute=0
  • 可以看到列出了每个控制器能配置的值,以及当前的值。

 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
#获取对应的控制器配置的值
amixer -c $card_id cget $id

#设置对应的控制器配置的值
amixer -c $card_id 1 cset $id $value


#例:获取card1的声音播放音量大小
amixer -c 1 cget numid=3

#信息输出如下
numid=3,iface=MIXER,name='Playback Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=252,step=0
  : values=252,252
  | dBscale-min=-95.00dB,step=0.37dB,mute=0

1. values=2 : 需要配置两个值
2. min=0 :可配置的最小值为0
3. max=252 :可配置的最大值为252
4. values=252,252:当前的值为252,252(左右声道)


#设置card1声音播放音量大小为150,150
amixer -c 1 cset numid=3 "150,150"

#信息输出如下
numid=3,iface=MIXER,name='Playback Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=252,step=0
  : values=150,150
  | dBscale-min=-95.00dB,step=0.37dB,mute=0
  • 配置声音播放输出。

 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
#例:获取card1的声音播放的方式
amixer controls -c 1

#信息输出如下
numid=1,iface=MIXER,name='Playback Path'
  ; type=ENUMERATED,access=rw------,values=1,items=11
  ; Item #0 'OFF'
  ; Item #1 'RCV'
  ; Item #2 'SPK'
  ; Item #3 'HP'
  ; Item #4 'HP_NO_MIC'
  ; Item #5 'BT'
  ; Item #6 'SPK_HP'
  ; Item #7 'RING_SPK'
  ; Item #8 'RING_HP'
  ; Item #9 'RING_HP_NO_MIC'
  ; Item #10 'RING_SPK_HP'
  : values=2

1. values=1 : 需要配置1个值
2. OFF :关闭
3. SPK :扬声器播放
4. HP:耳机播放
5. SPK_HP:扬声器和麦克风播放
6. values=2:当前的播放方式为SPK(扬声器播放)

#设置card1声音播放方式为耳机
amixer -c 1 cset numid=1 "HP"

#信息输出如下
numid=1,iface=MIXER,name='Playback Path'
  ; type=ENUMERATED,access=rw------,values=1,items=11
  ; Item #0 'OFF'
  ; Item #1 'RCV'
  ; Item #2 'SPK'
  ; Item #3 'HP'
  ; Item #4 'HP_NO_MIC'
  ; Item #5 'BT'
  ; Item #6 'SPK_HP'
  ; Item #7 'RING_SPK'
  ; Item #8 'RING_HP'
  ; Item #9 'RING_HP_NO_MIC'
  ; Item #10 'RING_SPK_HP'
  : values=3

可以看到成功配置完成。

15.2.2. alsamixer

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

1
alsamixer

F6 选择自己想要配置的声卡。

未找到图片

F4 可进入录音设置模式。

未找到图片

15.3. 录音与播放

15.3.1. 命令行

15.3.1.1. 录音

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

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

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

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

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

更多命令需要自行去探索。

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

15.3.1.2. 音频播放

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

在播放声音前请确认声卡控制器的配置,如果使用的是rk809作为音频输出,debian用户需要配置rk809的音频输出方式(默认为SPK),具体方法在上面。

1
2
3
4
5
#播放上面产出的录音
aplay -Dhw:1 test.wav

#获取更多用法
aplay -h

aplay命令只能播放wav格式的音频。

15.3.1.3. 边录音边播放

利用arecord和aplay两个工具。

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

15.3.1.4. 多格式音频播放

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

15.3.1.4.1. SoX

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

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

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

1
2
#安装软件
sudo apt install sox libsox-fmt-all

使用方法:

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

#使用card 1播放wav音频
play -d hw:1 xxx.wav

#使用card 1播放flac音频
play -d hw:1 xxx.flac

15.3.2. 桌面端

15.3.2.1. 音频管理

debian用户需要自行安装。

1
2
#安装软件
sudo apt install pavucontrol

打开软件(方法一)

未找到图片

打开软件(方法二)

未找到图片

输出设备配置如下图。

未找到图片

输入设备配置如下图。

未找到图片

设备配置如下图。

未找到图片

15.3.2.2. 录音

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

软件打开方法如下图。

未找到图片

软件设置界面如下图。

未找到图片

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

未找到图片

播放录音如下图。

未找到图片

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

15.3.2.3. 播放音乐

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

打开方法1

未找到图片

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

未找到图片

打开方法2

未找到图片

播放界面如下图。

未找到图片
15.3.2.3.1. ffplay

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

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

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

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

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

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

如下图

未找到图片

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

未找到图片

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

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

波形图如下。

未找到图片

15.4. 配置hdmi作为默认声卡

在鲁班猫系统中,默认是使用 rockchiprk809co 作为音频输出,即耳机接口和SPK输出。

如果想把声音输出到hdmi上的话,可以使用上文的桌面端pavucontrol配置网卡,但是如果这样的话,重启就会重新配置成 rockchiprk809co

下面是桌面端配置hdmi作为默认声卡的方法:

  1. 修改默认配置文件 /etc/pulse/default.pa

1
sudo vi /etc/pulse/default.pa
  1. 修改配置,修改文件的最后两行配置。

1
2
3
### Make some devices default
set-default-sink 1
set-default-source 1

/etc/pulse/default.pa 最后两行中的 1 改成 0

1
2
3
### Make some devices default
set-default-sink 0
set-default-source 0