2012-11-13 108 views
5

我正在玩一個構建像鼓機一樣播放節奏的python腳本。我用PyGame來處理音頻。但是,我在播放和聽到實際音頻之間遇到了顯着/不可接受的延遲。PyGame在播放聲音時有巨大的延遲

我粘貼下面的代碼到交互式解釋,然後一次又一次地執行的最後一行:

import pygame 
pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=4096) 
s = pygame.mixer.Sound('snare.wav') 
s.play(loops=0, maxtime=0, fade_ms=0) 

之間按下Enter鍵,聽到的聲音是我最好的猜測圍繞400ms的,確實的時間顯而易見且不可接受的。延遲大致與單擊VLC中的播放按鈕並等待音頻播放相同。

我已經在Windows和Ubuntu上都嘗試了這個,結果相同。我的電腦有點舊,英特爾酷睿i3 2.53GHz,但我認爲這不應該是一個問題。

我該怎麼辦?

在循環:

此代碼演示相同滯後。

for i in range(10): 
    print i 
    s.play(loops=0, maxtime=0, fade_ms=0) 
    sleep(2) 
+0

1)也許在解釋器本身的延遲?嘗試'raw_input(); s.play(loops = 0,maxtime = 0,fade_ms = 0)',然後再次按Enter。 2)圈套是從聲音文件的一開始就開始的嗎?如果您在Audacity中打開文件,開始和實際聲音之間有多少時間? –

+0

1)沒有區別。 2)實際的聲音確實在波形文件中立即開始。我也試過用其他wave文件。 –

+0

你可以發佈一個鏈接到聲音文件,我想用我的機器測試這個 –

回答

8

一個可能的解決方案是降低緩衝區的大小(例如512):

import pygame 
pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=512) 
s = pygame.mixer.Sound('snare.wav') 
s.play(loops=0, maxtime=0, fade_ms=0) 
1

我有同樣的問題在幾分鐘前,並有在This other thread

對我的作品的解決方案

它看起來像一個初始化問題,如果你首先啓動pygame(或者XD),pygame不能很好地獲得緩衝區。首先初始化混頻器init()和pre_init(),並從那裏實驗:

pygame.mixer.pre_init(44100, -16, 2, 512) 
pygame.mixer.init() 
pygame.init() 

這應該工作:)祝你好運!