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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM