2012-11-13 15 views
5

Sto giocando con la costruzione di uno script python che riproduce ritmi come una drum machine. Ho usato PyGame per gestire l'audio. Tuttavia, ho riscontrato ritardi significativi/inaccettabili tra il richiamo del gioco e l'ascolto dell'audio reale.PyGame ha un enorme ritardo con la riproduzione dei suoni

ho incollato il seguente codice nell'interprete interattivo, e quindi eseguire più e più volte l'ultima riga:

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) 

Il tempo tra pressatura entrare e sentire l'audio è di mia ipotesi migliore intorno 400ms, e in effetti evidente e inaccettabile. Il ritardo è all'incirca lo stesso di quando clicco sul pulsante di riproduzione in VLC e attendo che l'audio venga riprodotto.

Ho provato questo su Windows e Ubuntu con lo stesso risultato. Il mio computer è un po 'vecchio, un Intel Core i3, 2.53 GHz, ma penso che questo non dovrebbe essere un problema.

Cosa posso fare a riguardo?

In un ciclo:

Questo codice illustra lo stesso ritardo.

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

1) Forse un ritardo nell'interprete stesso? Prova 'raw_input(); s.play (loops = 0, maxtime = 0, fade_ms = 0)', quindi premi di nuovo enter. 2) Il rullante inizia all'inizio del file audio? Se apri il file in Audacity, quanto tempo è tra l'inizio e il suono effettivo? –

+0

1) Nessuna differenza. 2) Il suono effettivo inizia immediatamente nel file wave. Inoltre ho provato con altri file wave. –

+0

potresti pubblicare un collegamento al file audio, vorrei testarlo con la mia macchina –

risposta

8

Una possibile soluzione è quella di diminuire la dimensione del buffer (ad esempio 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

Ho avuto lo stesso problema un paio di minuti fa, e non c'è una soluzione che funziona per me in This other thread

Sembra un problema di inizializzazione, pygame non ottiene bene i buffer se si avvia pygame prima (o XD). Inizializzare l'init mixer() e pre_init() prima, e sperimentare da lì:

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

che dovrebbe funzionare :) Buona fortuna!

Problemi correlati