Pygame(十八)音乐
没有声音的游戏是没有灵魂的.
游戏中怎么可以没有声音呢?
前情提要
本节提要
内容详情
这长长的一串,对比昨天的短小无力,感觉今天的工作是真的大.
内容详情
加载与播放
加载
pygame.mixer.music.load(filename/fileobject)
参数说明:
filename: 音乐文件的路径,可以是绝对路径,也可以是相对路径
fileobject: python文件操作句柄(不鼓励此种用法)
播放
pygame.mixer.music.play(loops = 0, start = 0.0)
参数说明:
loops: 重复播放设置,如果是-1无限重复.如果是0不重复.如果是loops>=1 则在播放一遍后复loops遍,总计loops+1遍
start: 设置播放的起点,不同的格式,设置逻辑会有区别,MP3与OGG格式的,单位是秒,MOD格式的单位是序号
注意:音乐已经在播放时,再次运行play()会中止上次的播放,重新操作
示例
# /usr/bin/python3
# Author: 爱编程的章老师
# @Time: 2021/1/16 0016
# E-mail: Bluesand2010@163.com
import pygame
import sys
def load_play():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Pygame中的声音")
# 加载音乐
pygame.mixer.music.load(r"F:\MyProject\PythonCode\Python教程\Pygame教学\18声音\src\music\海来阿木 - 点歌的人.mp3")
# 播放 不重复,从头开始
pygame.mixer.music.play()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if __name__ == '__main__':
load_play()
在测试的时候,记得修改文件路径.
这里为了方便,没有对文件路径单独设置变量
这里,pygame支持的文件格式有限,如果加载了不支持的格式,会报错
错误代码:
ModPlug_Load failed
加载错误
常见的支持的格式:
mp3, wav, flac
如果不加载,直接播放也会报错:
如果load ->play->load,会导致播放失效,重新加载以后,要重新播放
重复加载问题
def load_play04():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Pygame中的声音")
# 加载音乐
pygame.mixer.music.load(r"F:\MyProject\PythonCode\Python教程\Pygame教学\18声音\src\music\王琪-可可托海的牧羊人.flac")
# 播放 不重复,从头开始
pygame.mixer.music.play(-1, 10.0)
pygame.mixer.music.load(r"F:\MyProject\PythonCode\Python教程\Pygame教学\18声音\src\music\王琪-可可托海的牧羊人.flac")
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if __name__ == '__main__':
load_play04()
重复播放问题
# 重复播放问题
def load_play05():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Pygame中的声音")
# 加载音乐
pygame.mixer.music.load(r"F:\MyProject\PythonCode\Python教程\Pygame教学\18声音\src\music\王琪-可可托海的牧羊人.flac")
# 播放 不重复,从头开始
pygame.mixer.music.play(-1, 10.0)
pygame.time.delay(3000)
pygame.mixer.music.play(-1, 10.0)
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if __name__ == '__main__':
load_play05()
重复播放后面的播放命令会覆盖前一次的播放命令
重启
顾名思议:就是重新从头开始播放.会忽略play()时设置的start从头开始
pygame.mixer.music.rewind()
示例
def rewind():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Pygame中的声音")
# 加载音乐
pygame.mixer.music.load(r"F:\MyProject\PythonCode\Python教程\Pygame教学\18声音\src\music\王琪-可可托海的牧羊人.flac")
# 播放 不重复,从头开始
pygame.mixer.music.play(-1, 10.0)
pygame.time.delay(5000)
pygame.mixer.music.rewind()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if __name__ == '__main__':
rewind()
停止 和 淡出停止
就是停止播放.
pygame.mixer.music.stop()
如果没有先play(),直接用stop()不会报错
def stop():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Pygame中的声音")
# 加载音乐
pygame.mixer.music.load(r"F:\MyProject\PythonCode\Python教程\Pygame教学\18声音\src\music\王琪-可可托海的牧羊人.flac")
# 播放 不重复,从头开始
pygame.mixer.music.play(-1, 10.0)
pygame.mixer.music.stop()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
淡出停止
与停止相比,这个停止会有个淡出的过度效果
pygame.mixer.music.fadeout(time)
参数说明:
time: 淡出的时长,单位:ms
示例
def fadeout():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Pygame中的声音")
# 加载音乐
pygame.mixer.music.load(r"F:\MyProject\PythonCode\Python教程\Pygame教学\18声音\src\music\王琪-可可托海的牧羊人.flac")
# 播放 不重复,从头开始
pygame.mixer.music.play(-1, 10.0)
pygame.time.delay(5000)
pygame.mixer.music.fadeout(3000)
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
暂停 和 恢复暂停
与stop()的区别是,这个可以记录暂停的时间,以便后续用恢复暂停来继续播放.不会丢失播放进度
pygame.mixer.music.pause()
恢复暂停
从暂停状态中脱离出来,比上次暂停的位置继续 播放
pygame.mixer.music.unpause()
音量
音量分设置与获取
设置音量
pygame.mixer.music.set_volume(value)
参数说明:
value:要设置的音量大小,0-1之间的浮点数,(即按百分比设置音量)
注意:这个值并不会改变系统音量的大小,只是基于系统音量,再按百分比增减音量
获取音量
pygame.mixer.music.get_volume()
返回一个0-1之间的浮点数
如果不设置,默认值是:
示例:获取音量默认值:
def valume():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Pygame中的声音")
# 加载音乐
pygame.mixer.music.load(r"F:\MyProject\PythonCode\Python教程\Pygame教学\18声音\src\music\王琪-可可托海的牧羊人.flac")
# 播放 不重复,从头开始
pygame.mixer.music.play(-1, 10.0)
val = pygame.mixer.music.get_volume()
print(val)
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
效果图:
不知道这个值是怎么来的.
如果要对音量的大小做设置的时候,可以先自己手动初始化为1.0或者0.5 什么的,也好有个心里预期.
检测播放状态
检测音乐播放状态,当播放时,返回False当空闲时返回True
pygame.mixer.music.get_busy()
播放位置
播放位置也有设置播放位置与获取播放位置
获取播放位置
pygame.mixer.music.get_pos()
注意:
单位:ms
返回值并不是当前时间节点在整首音乐中的时长,而是从开始play以来的时长,当设置了start,这个时间等于当前的位置减去start的值以后的值
设置当前播放位置
pygame.mixer.music.set_pos(time)
参数说明:
time: 设置到,从当前播放位置开始 + time 时长后的位置开始.单位ms
注意:
不是所有格式的音乐都支持set_pos()方法,对于不支持的格式设置set_pos()会报错
set_pos()对不同的格式,处理逻辑也是不一样的.
set_pos()设置是相对位置,要想设置绝位置,可以先用rewind()一下,再调用set_pos()
播放停止时事件
播放停止时事件可分为设置事件与获取事件
获取事件:
pygame.mixer.music.get_endevent()
返回音乐播放结束时播放的事件,如果没有设置事件,则返回pygame.NOEVENT
设置事件
pygame.mixer.music.set_endevent()
pygame.mixer.music.set_endevent(type)
当有参数时,可以指定事件的类型
结束事件的定义与检测使用
# 播放停止时事件
def endevent():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Pygame中的声音")
# 加载音乐
pygame.mixer.music.load(r"F:\MyProject\PythonCode\Python教程\Pygame教学\18声音\src\music\海来阿木 - 点歌的人.mp3")
# 播放 不重复,从头开始
pygame.mixer.music.play()
MY_ENDEVENT = pygame.USEREVENT + 1 # 自定义事件类型
pygame.mixer.music.set_endevent(MY_ENDEVENT)
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == MY_ENDEVENT: # 检测事件类型,当播放结束时,会发起这个事件
print("播放结束")
这个方法的意义,在于我们可以第一时间获取到播放停止的消息,并且处理.
后记
这一节的内容比较丰富
不过,如果我们使用过一个音乐播放器的话,可以发现,这些方法基本都是一个音乐播放器的基本功能实现了.
因此,下一节,将制作一个我们自己专属的音乐播放器