• Pygame 加载音频


    Python Learning:Pygame 加载音频

    Python 中自带的 winsound 模块

    winsound 模块中 Beep 方法可以调用系统的蜂鸣器,接受一个为 frequency 的频率参数(范围在 37 到 36727 之间)和一个 duration 的时长参数。频率太低就难以听到。

    def beep( freq, dura ):
        freq = math.floor( freq )
        winsound.Beep( freq, dura )
    

    另外 winsound 还提供了对 wav 文件的播放支持,可以使用 winsound.PlaySound( sound, flags ) 播放 wav 格式的音频(仅限 wav 格式)。

    pygame 模块

    播放声音可以使用 pygame 模块,其中的 mixer 子模块提供了一系列播放声音的 API,使用起来非常简单。

    Music 子模块

    import pygame, time, os
    mixer = pygame.mixer
    mixer.init( 11025 )
    music = mixer.music
    
    filename = 'mountain.mp3'
    def playMountain():
        music.load( filename )
        music.set_volume( 10 )
        music.play()
        while( music.get_busy() ):
            time.sleep( 1 )
        music.stop()
        
    playMountain()
    

    调用 mixer 的 init 方法进行初始化,然后获取 mixer 的 music 对象,load 方法用于加载音频文件(可以加载多种不同格式的音频文件,上述示例中加载的为 MP3 格式的文件),使用 music.play() 方法就可以开始加载音频了。

    但是需要注意的是,尽管此时 music 对象确实在加载音频(music.get_busy() 返回 True),但是如果没有上述代码中的循环语句,那么在执行这个 python 文件时是不会播放音乐的。原因在于音频文件是以流的形式播放的,需要使用 time.sleep( 1 ) 延迟脚本执行时间。

    mixer 中的 Sound 类

    另外 pygame.mixer 中提供了 Sound 类,用于加载声音:

    import pygame, time, os
    mixer = pygame.mixer
    mixer.init( 11025 )
    music = mixer.music
    
    path = os.path
    curr_dir = path.dirname( path.abspath( __file__ ) )
    
    def playSound( file_path ):
        sound = mixer.Sound( file_path )
        sound.set_volume( 5 )
        channel = sound.play()
        # print( sound.get_length() )
        # while channel.get_busy() :
            # time.sleep( 1 )
    
        sound.stop()
    
    try:
        file_path = path.join( curr_dir, 'mountain.mp3')
        playSound( file_path )
    finally:
        try:
            file_path = path.join( curr_dir, 'mountain.wav')
            playSound( file_path )
        finally:
            file_path = path.join( curr_dir, 'secosmic_lo.wav')
            playSound( file_path )
    

    pygame.mixer.Sound 的使用和 music 对象的使用方法类似,但是不需要设置循环也能够正常播放声音。

    需要注意的是,上述代码中,mountain.mp3 是从网易云中下载的一个轻音乐文件,mountain.wav 是直接把 MP3 后缀改成 wav 后缀,sscosmic_lo.wav 是 pygame 中提供的一个示例音频。mountain.mp3 和 mountain.wav 文件的播放都失败了,只有 wav 格式的 secosmic_lo.wav 能够正常播放。可见 Sound 也只能播放 wav 格式的文件。

    Reference

    1. 播放音乐:pygame.mixer.music
    2. StackOverFlow: Pygame, sounds don't play
  • 相关阅读:
    lua中获取nginx变量
    nginx与Lua执行顺序
    lua 发送消息到 Rabbitmq
    SpringCloudGetaway 允许跨域设置
    CentOS7 查看当前打开文件数
    lua 通过 stomp协议发送消息到 rabbitmq
    获取公网IPV4/IPV6的API
    SpringBoot 拦截器 统一日志 记录用户请求返回日志
    断点续传(上传)Java版
    Sprintboot 项目启动、停止脚本
  • 原文地址:https://www.cnblogs.com/brifuture/p/9785789.html
Copyright © 2020-2023  润新知