18. 音频播放

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

18.1. 接口概述

i.IMX8M MINIl芯片上具有iic、sai和lcd fpc接口,其中iic和sai接口用来控制和播放音频, fpc接口用来播放视频。通过这些接口,用户可以把相关外设连接到芯片上,从而来实现音视频的播放。

18.2. 数字音频技术

现实生活中的声音是通过一定介质传播的连续的波,它可以由周期和振幅两个重要指 标描述。正常人可以听到的声音频率范围为 20Hz~20KHz。现实存在的声音是模拟量,这 对声音保存和长距离传输造成很大的困难,一般的做法是把模拟量转成对应的数字量保存, 在需要还原声音的地方再把数字量的转成模拟量输出,如下图:

1

模拟量转成数字量过程,一般可以分为三个过程,分别为采样、量化、编码。如下图:

1

用一个比源声音频率高的采样信号去量化源声音,记录每个采样点的值,最后如果 把所有采样点数值连接起来与源声音曲线是互相吻合的,只是它不是连续的。在图中两条 蓝色虚线距离就是采样信号的周期,即对应一个采样频率(F S ),可以想象得到采样频率越 高最后得到的结果就与源声音越吻合,但此时采样数据量越越大,一般使用 44.1KHz采样 频率即可得到高保真的声音。每条蓝色虚线长度决定着该时刻源声音的量化值,该量化值 有另外一个概念与之挂钩,就是量化位数。量化位数表示每个采样点用多少位表示数据范 围,常用有 16bit、24bit或 32bit,位数越高最后还原得到的音质越好,数据量也会越大。

WM8960,是一个低功耗、高质量的立体声多媒体数字信号编解码器,英文名字是Audio CODEC, 所以我们在音频驱动资料或者芯片手册的介绍中看到“CODEC”这个词语,一般说的都是音频编解码。 它内部集成了DAC和ADC,可以实现声音信号量化成数字量输出,也可以实现数字量音频数据转换为模拟量声 音驱动扬声器。这样使用 WM8960芯片解决了声音与数字量音频数据转换问题,并且通过 配置 WM8960 芯片相关寄存器可以控制转换过程的参数,比如采样频率,量化位数,增益、 滤波等等。

WM8960芯片是一个音频编解码器,但本身没有保存音频数据功能,它只能接收其它 设备传输过来的音频数据进行转换输出到扬声器,或者把采样到的音频数据输出到其它具 有存储功能的设备保存下来。该芯片与其他设备进行音频数据传输接口就是I2S协议的音频接口。

18.3. SAI总线接口

SAI 接口(串行音频接口)适用于许多立体声或单声道应用。例如,它可配置为支持 I2S 标准、LSB 或 MSB 对齐、PCM/DSP、TDM 和 AC’97 等协议。将音频模块配置为发 送器时,SAI 接口可提供 SPDIF 输出。SAI 通过两个完全独立的音频子模块来实现这种灵 活性和可配置性。每个模块都有自己的时钟发生器和 I/O 线控制器。SAI 可以配置为主模 式或配置为从模式。音频子模块既可作为接收器,又可作为发送器;既可与另一模块同步, 又可以不同步。SAI 可与其它 SAI 相连接来同步运行。

IMX8M MINI 的 SAI 是一个全双工、支持帧同步的串行接口,支持 I2S、AC97、TDM 和音频 DSP,SAI 主要特性如下:

  • 帧最大为 32 个字

  • 字大小可选择 8bit 或 32bit

  • 每个接收和发送通道拥有 32×32bit 的 FIFO

  • FIFO 错误以后支持平滑重启

在IMX8M MINI芯片手册第13章(Chapter Chapter 13 Multimedia)上,有对SAI接口的详细介绍, 它的功能框图如下所示:

1

其中,红框部分引脚就是sai接口进行数据传输时的相关引脚:

  • TX_DATA:数据发送

  • RX_DATA:数据接收

  • TX_BCLK:数据发送时钟

  • RX_BCLK:数据接收时钟

  • TX_SYNC:数据发送同步

  • RX_SYNC:数据接收同步

18.4. 音频播放实验

18.4.1. 设备配置与工具安装

1.使能音频设备树插件

使能 /boot/uEnv.txt 文件下音频相关设备树插件内容。

1
dtoverlay=/usr/lib/linux-image-5.4.47-imx8mm/freescale/overlays/imx8mm-fire-sounnd.dtbo

设置后重启开发板。

注意: 在开发板启动时,大家可能在启动log里面,看到一直有打印”No soundcards found.”。 这其实是由于音频驱动没有编译进内核引起的。在检查声卡设备的时候,音频驱动模块尚没加载进内核。

2.查看/dev/snd目录

1
2
root@lubancat:~# ls /dev/snd
by-path  controlC0  pcmC0D0c  pcmC0D0p  timer
  • controlC0:用于声卡控制,C0 表示声卡 0。

  • pcmC0D0c:用于录音的 pcm 设备,其中的“COD0”表示声卡0中的设备0,最后面的“c”是 capture 的缩写,表示录音。

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

  • timer :定时器

4.安装alsa-utils工具

alsa-utils是alsa的一个工具包,里面包含有声卡测试和音频编辑的工具,比如alsactl、alsamixer、amixer、aplay等。

1
sudo apt install alsa-utils -y

18.4.2. 使用amixer设置声卡(音量、喇叭)

第一次使用声卡之前一定要先使用 amixer 设置声卡,打开耳机和喇叭,并且设置喇叭和耳 机音量,输入如下命令:

1
2
3
4
5
amixer sset 'Right Output Mixer PCM' on
amixer sset 'Left Output Mixer PCM' on
#如果播放没有声音,请适当调大耳机音量
amixer sset Headphone 100,100
amixer sset Speaker 100,100

18.4.3. 播放WAV格式音乐

网上搜索一首自己喜欢的wav格式歌曲,拷贝到开发板后,使用以下命令即可播放:

1
aplay xxx.wav

如果没有网络环境,则可以先进行录音,生成wav文件后再进行播放

18.4.4. 录音

使用arecord进行录音

1
arecord -f cd -d 10 test.wav
  • -f 是设置录音质量,cd表示录音质量为 cd 级别

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

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

18.4.5. 保存声卡设置

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

1
alsactl store

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

1
alsactl restore

18.4.6. 播放各个格式音频文件

alsa-utils只能播放wav格式的音频,若想要播放其他格式音频推荐使用sox播放器。

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

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

在野火linux开发板上可用以下命令安装sox,libsox-fmt-all包含各个格式的解码器。

1
sudo apt install sox libsox-fmt-all

安装完软件之后,将想要使用的播放音频文件拷贝到开发板,使用play即可播放各个格式的音频文件了

18.4.6.1. 播放音频测试

播放mp3音频格式文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
debian@lubancat:~$ play example.mp3

example.mp3:

File Size: 3.78M     Bit Rate: 128k
Encoding: MPEG audio
Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
Duration: 00:03:56.22

In:1.69% 00:00:03.99 [00:03:52.22] Out:176k  [======|======] Hd:0.3 Clip:0
Aborted.

播放flac音频格式文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
debian@lubancat:~$ play example.flac

example.flac:

File Size: 22.1M     Bit Rate: 781k
Encoding: FLAC
Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
Duration: 00:03:46.58

In:9.80% 00:00:22.20 [00:03:24.38] Out:979k  [======|======] Hd:0.9 Clip:0

播放wav音频格式文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
debian@lubancat:~$ play example.wav

example.wav:

File Size: 43.5M     Bit Rate: 1.54M
Encoding: Signed PCM
Channels: 2 @ 16-bit
Samplerate: 48000Hz
Replaygain: off
Duration: 00:03:46.58

In:3.92% 00:00:08.87 [00:03:37.70] Out:426k  [-=====|====- ] Hd:0.2 Clip:0