7. 音频播放-Pygame

LubanCat-RK系列板卡中,LubanCat 2和LubanCat 1等带有音频rk809-codec。通过音频编解码芯片, 本章我们将使用Python-Pygame库的music模块,在鲁班猫板卡,编写测试代码进行音频播放实验。

7.1. Pygame库简介

Pygame是Python库中用于开发游戏的一种工具,或许这么说有点限制Pygame的用法。 Pygame不仅可以用于游戏开发,还可以用于显示处理,多媒体设备处理等等方面, 该库提供了许多多媒体、显示设备的操作功能。

7.2. 实验准备

7.2.1. 板卡上的Sound资源

以LubanCat 2为例:

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

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

cat@lubancat:~/sound$ ls /dev/snd/
by-path  controlC0  pcmC0D0c  pcmC0D0p  seq  timer

其中,controlC0是用于声卡的控制,如通道选择,麦克风的控制等,pcmC0D0c是用于录音的pcm设备,pcmC0D0p用于播放的pcm设备,seq是音序器,timer是定时器。

linux更多关于鲁班猫音频系统内容,参考 《音频》

7.2.2. 硬件连接

LubanCat 1和LubanCat 2板卡有耳机+麦克风接口,将耳机或其他播放设备与鲁班猫接口连接即可。

7.2.3. Pygame库安装

我们使用apt工具安装。

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

7.2.4. Pygame库使用

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

7.3. 测试代码

测试代码如下:

配套代码 ../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格式的播放支持是有限的
    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.3.1. 实验步骤

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

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

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

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

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

运行显示:

broken

7.3.2. 参考

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

关于Pygame music,可参考 Pygame music