15. 音频播放

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

15.1. 接口概述

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

在野火ebfmp157 pro开发板上,iic2和sai2接口已经连接到WM8960音频编解码芯片上, 我们可以直接使用它来播放音频。

15.2. 数字音频技术

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

1

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

1

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

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

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

15.3. SAI总线接口

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

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

  • 帧最大为 32 个字

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

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

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

在STM32MP157 参考手册第55章(55 Serial audio interface (SAI))上,有对SAI接口的详细介绍, 它的功能框图如下所示:

1

15.4. 音频播放实验

15.4.1. 设备配置与工具安装

1.使能音频设备树插件

使能 /boot/uEnv.txt 文件下音频相关设备树插件内容(默认已经开启)。

1
dtoverlay=/usr/lib/linux-image-4.19.94-stm-r1/overlays/stm-fire-sound.dtbo

设置后重启开发板。

2.查看/dev/snd目录

1
2
3
root@npi:/home/debian# ls /dev/snd/
by-path  controlC0  pcmC0D0p  pcmC0D1c  timer
root@npi:/home/debian#
  • controlC0:用于声卡控制,C0 表示声卡 0。

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

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

  • timer :定时器

3.安装alsa-utils工具

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

1
sudo apt install alsa-utils -y

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

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

1
2
3
4
amixer sset 'Right Output Mixer PCM' on
amixer sset 'Left Output Mixer PCM' on
amixer sset Headphone 80,80
amixer sset Speaker 100,100

15.4.3. 播放WAV格式音乐

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

1
aplay xxx.wav

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

15.4.4. 录音

使用arecord进行录音

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

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

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

15.4.5. 保存声卡设置

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

1
alsactl store

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

1
alsactl restore

15.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即可播放各个格式的音频文件了

15.4.6.1. 播放音频测试

播放mp3音频格式文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
root@npi:/home/debian# play 01喊歌.mp3
play WARN alsa: can't encode 0-bit Unknown or not applicable

01喊歌.mp3:

 File Size: 14.1M     Bit Rate: 326k
  Encoding: MPEG audio    Info: 2010
  Channels: 2 @ 16-bit   Track: 6
Samplerate: 44100Hz      Album: 像草一样
Replaygain: off         Artist: 苏阳
  Duration: 00:05:45.96  Title: 喊歌

In:2.68% 00:00:09.29 [00:05:36.67] Out:410k  [  -===|==    ] Hd:0.1 Clip:0

播放flac音频格式文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
root@npi:/home/debian# play 02像草一样.flac
play WARN alsa: can't encode 0-bit Unknown or not applicable

02像草一样.flac:

 File Size: 48.6M     Bit Rate: 931k
  Encoding: FLAC          Info: 163 key(Don't modify):L64FU3W4YxX3ZFTmbZ+8/RaIO8sQsLP+T9qDFc8QjllS6iCM10lnQs5yDGzV/nPoTkhbxEyFCFYHggoX5zxE3TF9ox5WmGFlpNl+f26w5Pbxtj0ysWZ5KXYyAeGDWo1GwK3ecHwYnXqkbKZ3VQzIA4Ki0M0X5Sjb5M41IvM+dTegtvF9OT1Qzwtcee3XeMQW9+8t5vdlWhcqEJfS6I7gTENNm5kWGj3rnuARcTzNBA+L4N4BFHyv4EYz4bgOYmXjD18mT5nNvBYa7rhQOH1k9MqvBUqaZ4TpX1dx8dKJ58ZxMCXU2Bxdf3MNbJqKA06KM6nVZ10sXAb7SS8vi4v6ns71DouMmpkngHMVowD2v1ukYwSAGrvsE0KARrrLcqzCN9USa/t1tT3C0vdbO7JVCMQYvgDAVorMSfDVZHWzYFb/uoaH9yMlqXfiHtVteK4HhKiBw/5BsOHfljW3KjUUIsmpxa0/OLuJPTrEj2G3voY=
  Channels: 2 @ 16-bit   Track: 8
Samplerate: 44100Hz      Album: 像草一样
Replaygain: off         Artist: 苏阳
  Duration: 00:06:57.29  Title: 像草一样

In:0.96% 00:00:03.99 [00:06:53.30] Out:176k  [  ====|==    ] Hd:5.6 Clip:0

播放wav音频格式文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
root@npi:/home/debian# play 03和你在一起.wav
play WARN alsa: can't encode 0-bit Unknown or not applicable

03和你在一起.wav:

File Size: 46.2M     Bit Rate: 1.42M
Encoding: Signed PCM
Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
Duration: 00:04:19.61

In:1.36% 00:00:03.53 [00:04:16.08] Out:156k  [     -|=-    ]        Clip:0