15. 音频播放¶
音视频是人类在日常生活里面使用非常广泛的信息获取方式,它的本质就是声音和图像信息的采集、存储和回放。 本章我们来介绍音视频播放的相关基础概念,并且给大家演示如何在开发板上进行音视频的播放。
15.1. 接口概述¶
STM32MP157芯片上具有iic、sai,这些接口用来控制和播放音频,通过这些接口, 用户可以把相关外设连接到芯片上,从而来实现音视频的播放。
在野火ebfmp157 pro开发板上,iic2和sai2接口已经连接到WM8960音频编解码芯片上, 我们可以直接使用它来播放音频。
15.2. 数字音频技术¶
现实生活中的声音是通过一定介质传播的连续的波,它可以由周期和振幅两个重要指 标描述。正常人可以听到的声音频率范围为 20Hz~20KHz。现实存在的声音是模拟量,这 对声音保存和长距离传输造成很大的困难,一般的做法是把模拟量转成对应的数字量保存, 在需要还原声音的地方再把数字量的转成模拟量输出,如下图:
模拟量转成数字量过程,一般可以分为三个过程,分别为采样、量化、编码。如下图:
用一个比源声音频率高的采样信号去量化源声音,记录每个采样点的值,最后如果 把所有采样点数值连接起来与源声音曲线是互相吻合的,只是它不是连续的。在图中两条 蓝色虚线距离就是采样信号的周期,即对应一个采样频率(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接口的详细介绍, 它的功能框图如下所示:
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
|