Pygame(十八)音乐

Pygame(十八)音乐

没有声音的游戏是没有灵魂的.

游戏中怎么可以没有声音呢?

前情提要

Pygame(十八)音乐

; 本节提要

内容详情

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()会中止上次的播放,重新操作

示例


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支持的文件格式有限,如果加载了不支持的格式,会报错

Pygame(十八)音乐
错误代码:
ModPlug_Load failed
加载错误
常见的支持的格式:
mp3, wav, flac

如果不加载,直接播放也会报错:

Pygame(十八)音乐
如果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()

效果图:

Pygame(十八)音乐
不知道这个值是怎么来的.

如果要对音量的大小做设置的时候,可以先自己手动初始化为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("播放结束")

这个方法的意义,在于我们可以第一时间获取到播放停止的消息,并且处理.

后记

这一节的内容比较丰富
不过,如果我们使用过一个音乐播放器的话,可以发现,这些方法基本都是一个音乐播放器的基本功能实现了.

因此,下一节,将制作一个我们自己专属的音乐播放器

Original: https://blog.csdn.net/weixin_41810846/article/details/112723358
Author: 爱编程的章老师
Title: Pygame(十八)音乐

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/782146/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球