9. 音频

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

9.1. 声卡设备

注意

LubanCat-H618系列板卡3.5mm音频接口仅支持音频输出,不支持音频输入。LubanCat-A0没有3.5mm音频接口

9.1.1. 获取录音设备

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

#例子
cat@lubancat:~$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 2: ahubhdmi [ahubhdmi], device 0: ahub_plat-snd-soc-dummy-dai snd-soc-dummy-dai-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
cat@lubancat:~$
  • card 2 : HDMI声音设备

9.1.2. 获取播放设备

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

cat@lubancat:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: audiocodec [audiocodec], device 0: soc@3000000:codec_plat-5096000.codec 5096000.codec-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: ahubhdmi [ahubhdmi], device 0: ahub_plat-snd-soc-dummy-dai snd-soc-dummy-dai-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
cat@lubancat:~$
  • card 0 :板载SOC(H618)音频输出

  • card 2 :HDMI声音设备

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

9.1.3. 声卡驱动目录

查看声卡驱动目录

1
ls /dev/snd/
1
2
3
cat@lubancat:~$ ls /dev/snd/
by-path  controlC0  controlC1  controlC2  pcmC0D0p  pcmC2D0c  pcmC2D0p  timer
cat@lubancat:~$
  • controlC0:用于声卡控制,C0 表示声卡0,对应上文的板载H618芯片。

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

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

  • pcmC2D0p:用于播放的 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之间都有一个对应关系。

查看系统挂载上的声卡:

1
2
3
4
5
6
7
cat@lubancat:~$ cat /proc/asound/cards
 0 [audiocodec     ]: audiocodec - audiocodec
                      audiocodec
 1 [ahubdam        ]: ahubdam - ahubdam
                      ahubdam
 2 [ahubhdmi       ]: ahubhdmi - ahubhdmi
                      ahubhdmi

9.2. 配置声卡

9.2.1. amixer

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

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

下面以audiocodec(card 0)为例进行配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#列出可以控制card 0的控制器
amixer controls -c 0

#示例
cat@lubancat:~$ amixer controls -c 0
numid=4,iface=MIXER,name='LINEOUT Switch'
numid=9,iface=MIXER,name='LINEOUTL src LR'
numid=10,iface=MIXER,name='LINEOUTR src LR'
numid=5,iface=MIXER,name='OutputL Mixer DACL Switch'
numid=6,iface=MIXER,name='OutputL Mixer DACR Switch'
numid=7,iface=MIXER,name='OutputR Mixer DACL Switch'
numid=8,iface=MIXER,name='OutputR Mixer DACR Switch'
numid=2,iface=MIXER,name='digital volume'
numid=3,iface=MIXER,name='lineout volume'
numid=1,iface=MIXER,name='tx hub mode'
cat@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
42
43
44
45
46
47
48
#列出所有card 0控制器能配置的值
amixer contents -c 0

cat@lubancat:~$ amixer contents -c 0
numid=4,iface=MIXER,name='LINEOUT Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=9,iface=MIXER,name='LINEOUTL src LR'
; type=ENUMERATED,access=rw------,values=1,items=2
; Item #0 'Off'
; Item #1 'On'
: values=0
numid=10,iface=MIXER,name='LINEOUTR src LR'
; type=ENUMERATED,access=rw------,values=1,items=2
; Item #0 'Off'
; Item #1 'On'
: values=0
numid=5,iface=MIXER,name='OutputL Mixer DACL Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=6,iface=MIXER,name='OutputL Mixer DACR Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=7,iface=MIXER,name='OutputR Mixer DACL Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=8,iface=MIXER,name='OutputR Mixer DACR Switch'
; type=BOOLEAN,access=rw------,values=1
: values=on
numid=2,iface=MIXER,name='digital volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=63,step=0
: values=57
| dBscale-min=0.00dB,step=654.20dB,mute=1
numid=3,iface=MIXER,name='lineout volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=31,step=0
: values=28
| dBrange-
   rangemin=0,,rangemax=0
      | dBscale-min=0.00dB,step=0.00dB,mute=1
   rangemin=1,,rangemax=31
      | dBscale-min=-43.50dB,step=1.50dB,mute=1

numid=1,iface=MIXER,name='tx hub mode'
; type=ENUMERATED,access=rw------,values=1,items=2
; Item #0 'Off'
; Item #1 'On'
: values=1
cat@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
#获取对应的控制器配置的值
amixer -c $card_id cget $id
#设置对应的控制器配置的值
amixer -c $card_id cset $id $value

#例:获取card 0的声音数字音量大小
cat@lubancat:~$ amixer -c 0 cget numid=2
numid=2,iface=MIXER,name='digital volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=63,step=0
: values=57
| dBscale-min=0.00dB,step=654.20dB,mute=1
cat@lubancat:~$

1. values=1: 需要配置1个值
2. min=0 :可配置的最小值为0
3. max=63:可配置的最大值为63
4. values=57:当前的值为57

#设置card 0声音播放声音数字音量大小为50
cat@lubancat:~$ amixer -c 0 cset numid=2 50
numid=2,iface=MIXER,name='digital volume'
; type=INTEGER,access=rw---R--,values=1,min=0,max=63,step=0
: values=50
| dBscale-min=0.00dB,step=654.20dB,mute=1
cat@lubancat:~$

可以看到成功配置完成

配置声音播放输出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#例:获取card 0的声音播放的方式
cat@lubancat:~$ amixer -c 0 cset numid=1
numid=1,iface=MIXER,name='tx hub mode'
; type=ENUMERATED,access=rw------,values=1,items=2
; Item #0 'Off'
; Item #1 'On'
: values=1

1. values=1 : 需要配置1个值
2. Off :关闭
3. On  :打开
4. values=1:当前的播放方式为On(打开)

#如果card 0声音播放方式为Off,则需要配置为开
amixer -c 0 cset numid=1 1
amixer -c 0 cset numid=1 On
#以上两条命令的效果一样,选择其中一个就行

9.2.2. alsamixer

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

1
alsamixer

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

未找到图片

通过界面可以看到,下方列出的可配置的控制器,和上述amixer contents列出的可配置的控制器是一致的。图形化配置的方式会比较方便易上手,因此作者推荐alsamixer进行音频配置。

9.3. 音频播放

可以通过上述的 《文件传输与NFS网络文件系统》 方法将音频文件拷贝到鲁班猫板卡上。

9.3.1. 命令行

注意

命令行操作时要注意在桌面端切换成正确的输出设备

9.3.1.1. 音频播放

注意

在播放声音前请确认声卡控制器的配置,具体方法在上面。

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

#播放音频文件
aplay -Dhw:0 xxx.wav
  • -Dhw:0 :使用card 0作为播放设备

未找到图片

更多命令需要自己去探索

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

9.3.1.2. 多格式音频播放

如果需要播放除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 0播放mp3音频
play -d hw:0 xxx.mp3

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

#使用card 0播放flac音频
play -d hw:0 xxx.flac
未找到图片

9.3.2. 桌面端

9.3.2.1. 切换播放设备

未找到图片

9.3.2.2. 音频管理

Debian用户需要自行安装

1
2
#安装软件
sudo apt install pavucontrol

打开软件

未找到图片

可以根据需求对音频设备进行配置。

9.3.2.3. 播放音乐

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

打开方法

未找到图片

然后,可以把文件拖进VLC软件里进行播放。

小技巧

也可以直接在文件管理里直接双击音乐文件进行播放