簡體   English   中英

如何使用 pygame 播放 mp3?

[英]How can I play an mp3 with pygame?

import pygame
file = 'some.mp3'
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(file)
pygame.mixer.music.play()

這會輸出“進程已完成,退出代碼為 0”,但它不播放任何內容。 我該如何解決這個問題?

play 函數開始播放音樂,但立即返回。 然后你的程序就結束了,pygame 對象會自動銷毀,這會導致音樂停止。

正如您所評論的,如果您在退出之前等待它,它確實會播放音樂 - 因為這樣 pygame 對象在 while 循環完成之前不會被銷毀。

while pygame.mixer.music.get_busy(): 
    pygame.time.Clock().tick(10)

音樂停止是因為它是一個異步事件,這意味着它將繼續與腳本一起播放。 然后,腳本立即停止,不給音樂機會開始。 如前所述,您可以使用

while pygame.mixer.music.get_busy(): 
  pygame.time.Clock().tick(10)

然而,更好的是pygame.event.wait() ,因為它會等待所有異步事件結束。

這是一個超級簡單的方法。

import pygame
file = 'some.mp3'
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load(file)
pygame.mixer.music.play()
pygame.event.wait()

我從thepythongamebook.com找到了一個很好的解決方案:

pygame.mixer.pre_init(44100, -16, 2, 2048) # setup mixer to avoid sound lag

pygame.init()

pygame.mixer.init()

pygame.mixer.music.load('music_01.mp3')

pygame.mixer.music.play(-1)

試試這個。

import pygame

def pmusic(file):
    pygame.init()
    pygame.mixer.init()
    clock = pygame.time.Clock()
    pygame.mixer.music.load(file)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        print("Playing...")
        clock.tick(1000)

def stopmusic():
    pygame.mixer.music.stop()


def getmixerargs():
    pygame.mixer.init()
    freq, size, chan = pygame.mixer.get_init()
    return freq, size, chan


def initMixer():
    BUFFER = 3072  # audio buffer size, number of samples since pygame 1.8.
    FREQ, SIZE, CHAN = getmixerargs()
    pygame.mixer.init(FREQ, SIZE, CHAN, BUFFER)

try:
    initMixer()
    file = 'C:\\data\\03.mp3'
    pmusic(file)
except KeyboardInterrupt:  # to stop playing, press "ctrl-c"
    stopmusic()
    print("\nPlay Stopped by user")
except Exception:
    print("unknown error")

print("Done")

由於您導入的方式,音頻似乎無法播放。 下面的代碼按預期播放聲音。 除了它使用from pygame import mixer import pygame而不是import pygame之外,這里沒有任何變化。 這可能是因為 Pygame 是一個包,但我不確定。

from pygame import mixer

file = 'some.mp3'
mixer.init()
mixer.music.load(file)
mixer.music.play()

PyGame有 2 個不同的播放聲音和音樂的模塊, pygame.mixer模塊和pygame.mixer.music模塊。 該模塊包含用於加載 Sound 對象和控制播放的類。 文檔中解釋了差異:

音樂播放和常規聲音播放之間的區別在於音樂是流式播放的,而不是一次真正加載。 混音器系統一次僅支持單個音樂流。

如果要播放mp3文件,則需要對模塊進行初始化。 使用pygame.mixer.music.load加載文件。 調用pygame.mixer.music.play()開始播放音樂流。 最后,您必須等待文件播放。
使用pygame.mixer.music.get_busy()測試是否正在混合聲音。 循環不斷地查詢混音器的狀態。
在循環中,您需要通過pygame.time.delaypygame.time.Clock.tick延遲時間。 此外,您還需要處理應用程序循環中的事件。 分別參見pygame.event.get() pygame.event.pump()

對於游戲的每一幀,您都需要對事件隊列進行某種調用。 這確保您的程序可以在內部與操作系統的其余部分進行交互。

import pygame
pygame.init()

pygame.mixer.music.load('my_music.mp3')
pygame.mixer.music.play()

clock = pygame.time.Clock()
while pygame.mixer.music.get_busy():
    clock.tick(60)
    pygame.event.poll()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM