7. 音频播放

在我们鲁班猫部分板卡上,带有音频Codec。通过音频编解码芯片,我们可以使用鲁班猫板卡 进行音频播放。

重要

注:在做本节实验前,请确保您的鲁班猫板卡上有音频Codec芯片,才可进行本节实验。 如 鲁班猫I.MX6ULL MINI 板卡上就没有搭载音频Codec芯片,不能做音频功能实验。 鲁班猫I.MX6ULL Pro 板则搭载音频Codec芯片了,可做本节实验。

7.1. 音频实验

在一些场景中,我们期望通过一些简单的方式,去使用鲁班猫板卡进行音频的播放。 那么我们可以用Python来编写一些代码来实现。

7.2. Pygame库

7.2.1. Pygame库简介

Pygame是Python库中用于开发游戏的一种工具,或许这么说有点限制Pygame的用法。 Pygame不仅可以用于游戏开发,还可以用于显示处理,多媒体设备处理等等方面, 该库提供了许多多媒体、显示设备的操作功能。 我们可以在鲁班猫板卡上安装Python-Pygame库,并通过编写一些测试代码来使用该库进行音频播放。

7.3. 实验准备

7.3.1. 添加Sound资源

在板卡上的部分资源可能默认未被开启,在使用前请根据需要修改 /boot/uEnv.txt 文件, 可添加对应设备树插件的加载,重启系统,以在系统中添加对应资源。

如本节实验中,通常情况下在鲁班猫系统中默认使能 Sound 的功能, 如大家发现Sound的设备树插件未加载,请做相应修改。

同时如果大家在使用中发现Sound功能引脚被复用或有冲突,请要将对应占用Sound引脚资源的设备树插件取消加载, 否则Sound资源可能无法使用。若已开启对应资源,忽略以下步骤。

方法参考如下:

broken

添加Sound设备树插件,以使系统支持Sound功能,如下:

broken
# 以鲁班猫i.MX6ULL Pro板卡Sound设备树插件内容为例:
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-sound.dtbo

如若运行代码时出现“Device or resource busy”或者运行代码卡死等等现象, 请按上述情况检查并按上述步骤操作。

如出现 Permission denied 或类似字样,请注意用户权限,大部分操作硬件外设的功能,几乎都需要root用户权限,简单的解决方案是在执行语句前加入sudo或以root用户运行程序。

# 在终端中输入如下命令,可以查看到显示设备资源:
ls /dev/snd/

# 输入lsmod,可以看到对应的音频Codec驱动也已被加载:
lsmod

检查板卡上的音频设备资源示例,仅供参考:

broken broken

7.3.2. 硬件连接

硬件连接小节,需要大家根据自身开发环境等情况对本章内容进行参考调整。

将耳机或其他播放设备与鲁班猫板卡连接即可。

7.3.3. Pygame库安装

我们使用apt工具安装。

# 在终端中输入如下命令,安装Pygame库:
sudo apt -y install python3-pygame

等等安装完成后即可。

7.3.4. Pygame库使用

安装好对应的库之后,我们就可以利用安装好的Pygame库编写一下测试代码。

关于Linux音频系统相关内容,参考 《Linux 音频》

7.4. 测试代码

测试代码如下:

配套代码 io/sound/sound_test.py文件内容
 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
49
50
51
52
53
54
55
56
57
58
59
60
""" pygame 音频播放测试 """
import sys
import time
import threading

if len(sys.argv) == 2:
    m_filename = sys.argv[1]
else:
    print(
        """使用方法:
    python3 sound_test.py <music_name.mp3>
    example: python3 sound_test.py test.mp3"""
    )
    sys.exit()

import pygame

exitright = 'e'

def get_quitc():
    '获取退出字符'
    # 全局变量
    global exitright
    # 获取用户输入
    exitright = input("输入字母q后,按下回车以退出播放\n")

try:
    # 初始化音频设备
    pygame.mixer.init()
    # 检查音频设备初始化情况
    if pygame.mixer.get_init() is None:
        raise RuntimeError('音频资源未正确初始化,请检查音频设备是否可用',)
    # 加载音频文件,此处未播放mp3文件,因为pygam对MP3格式的播放支持是有限的,在Debian Linux中播放文件异常mp3可能会导致程序崩溃
    pygame.mixer.music.load(m_filename)
    # 设置音量为50%
    pygame.mixer.music.set_volume(0.2)
    # 播放音频文件1次
    pygame.mixer.music.play(0)

    # 开启子线程,等待用户输入退出字符
    quitthread = threading.Thread(target=get_quitc,daemon=True)
    quitthread.start()
    # 获取音频播放状态,如果正在播放,等待播放完毕
    while pygame.mixer.music.get_busy():
        # 空闲延时,释放cpu
        if exitright in ('q','Q'):
            raise
        time.sleep(1)
except pygame.error as e:
    print("执行程序时出现异常:",e,"\n等待音频资源被释放")
    # 尝试停止播放
    pygame.mixer.music.stop()
    # 等待音频资源空闲
    while pygame.mixer.music.get_busy():
        time.sleep(1)
finally:
    # 卸载初始化的音频设备
    print("退出播放")
    pygame.mixer.quit()
    sys.exit()

代码功能已经在注释中详细给出。

7.4.1. 实验步骤

在测试代码前,请先将配套代码文件夹io\sound\下,各格式的test音频文件与代码放置在同一目录下,再运行程序。

测试代码会播放用户指定音频文件。

# 在终端中输入如下命令:
python3 sound_test.py test.mp3
# 或
python3 sound_test.py test.wav
# 或
python3 sound_test.py test.ogg

pygame库导入时加载的资源比较多,所以会稍等一会才有实验现象。 程序正常运行后,大家就可以在播放设备中听到播放的音频啦~

在音乐播放过程中,如要退出,请按终端打印的提示信息操作,在终端输入q再回车,程序即可结束。 如程序异常终止,会导致音频设备资源被占用,需要重启开发板才可再次使用。

实验现象如下:

broken

自此使用pygame库测试音频功能结束。

更多关于Python Pygame库的使用,可参考 Pygame 教程 。 关于Pygame music,可参考 Pygame music