2012-11-13 16 views
5

Bawię się przy tworzeniu skryptu python, który odtwarza rytmy takie jak automat perkusyjny. Użyłem PyGame do obsługi dźwięku. Jednakże odczuwam znaczące/niedopuszczalne opóźnienia między wywołaniem gry a słyszeniem faktycznego dźwięku.PyGame ma ogromne opóźnienie w odtwarzaniu dźwięków

I wklejony następujący kod do interaktywnego interpretera, a następnie wykonać ostatnią linię znowu i znowu:

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) 

Czas pomiędzy prasowaniem wejść i słysząc dźwięk jest moim najlepszym przypuszczeniem około 400ms, a nawet zauważalne i niedopuszczalne. Opóźnienie jest w przybliżeniu takie samo, jak po kliknięciu przycisku odtwarzania w VLC i oczekiwaniu na odtwarzanie dźwięku.

Próbowałem tego w systemie Windows i Ubuntu z tym samym wynikiem. Mój komputer jest nieco stary, Intel Core i3, 2.53GHz, ale myślę, że to nie powinno stanowić problemu.

Co mogę z tym zrobić?

w pętli:

Ten kod demonstruje samą lag.

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

1) Może opóźnienie samego tłumacza? Spróbuj 'raw_input(); s.play (pętle = 0, maxtime = 0, fade_ms = 0)', a następnie naciśnij enter ponownie. 2) Czy werbel zaczyna się na samym początku pliku dźwiękowego? Jeśli otworzysz plik w Audacity, ile czasu upływa między początkiem a faktycznym dźwiękiem? –

+0

1) Bez różnicy. 2) Rzeczywisty dźwięk zaczyna się natychmiast w pliku wave. Próbowałem również z innymi plikami wave. –

+0

czy mógłbyś zamieścić link do pliku dźwiękowego, chciałbym przetestować to z moją maszyną? –

Odpowiedz

8

Możliwym rozwiązaniem jest, aby zmniejszyć rozmiar bufora (przykład 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

miałem ten sam problem kilka minut temu, a tam rozwiązanie, które działa na mnie w This other thread

Wygląda na to, że problem z inicjalizacją, pygame nie otrzymuje buforów, jeśli najpierw zainicjujesz pygame (lub XD). Zainicjuj najpierw mikser init() i pre_init(), a następnie eksperymentuj:

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

To powinno zadziałać :) Powodzenia!