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资源可能无法使用。若已开启对应资源,忽略以下步骤。
方法参考如下:
添加Sound设备树插件,以使系统支持Sound功能,如下:
# 以鲁班猫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
检查板卡上的音频设备资源示例,仅供参考:
7.3.3. Pygame库安装¶
我们使用apt工具安装。
# 在终端中输入如下命令,安装Pygame库:
sudo apt -y install python3-pygame
等等安装完成后即可。
7.4. 测试代码¶
测试代码如下:
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再回车,程序即可结束。 如程序异常终止,会导致音频设备资源被占用,需要重启开发板才可再次使用。
实验现象如下:
自此使用pygame库测试音频功能结束。
更多关于Python Pygame库的使用,可参考 Pygame 教程 。 关于Pygame music,可参考 Pygame music 。