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摄像头自带的数字麦克风

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

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 0 和 card 1 是这些设备在Linux里注册的设备,我们可以通过应用程序调用这些接口

15.1.3. 声卡驱动目录

查看声卡驱动目录

1
ls /dev/snd/
1
2
3
4
root@lubancat:~# ls /dev/snd/
by-id    controlC0  controlC2  pcmC1D0c  pcmC2D0c  timer
by-path  controlC1  pcmC0D0p   pcmC1D0p  seq
root@lubancat:~#
  • 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
root@lubancat:~# ls -l /dev/snd/by-path/
total 0
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
root@lubancat:~#
  • 可以看到每个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
#列出可以控制card 1的控制器
amixer controls -c 1
1
2
3
4
5
6
root@lubancat:~# 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'
root@lubancat:~#
  • 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
34
#列出所有card 1控制器能配置的值
amixer contents -c 1

root@lubancat:~# 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
root@lubancat:~#
  • 可以看到列出了每个控制器能配置的值,以及当前的值

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

#例:获取card1的声音播放音量大小
root@lubancat:~# 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
root@lubancat:~# 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
root@lubancat:~#

可以看到成功配置完成

配置声音播放输出

 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
#例:获取card1的声音播放的方式
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
root@lubancat:~#

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

#设置card1声音播放方式为耳机
root@lubancat:~# 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
root@lubancat:~#

可以看到成功配置完成

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
#播放上面产出的录音
aplay -Dhw:1 test.wav
  • aplay命令只能播放wav格式的音频

更多命令需要自己去探索

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

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等),可以参照一下方法

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

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

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

1
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-RK3562/RK3566/RK3568系列板卡在系统上预装了ffmpeg工具包,因此无需安装即可使用

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

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

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

如下图

未找到图片

如果用ssh连接LubanCat-RK3562/RK3566/RK3568系列板卡,具有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

2.修改配置,修改文件的最后两行配置

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