2012-01-04 2 views
25

questo è come il suono viene "immagazzinata":Perché non riesco a riprodurre i suoni più di una volta utilizzando il tag audio HTML5?

<audio id = "hammer" src="res/sounds/Building/hammer.wav"></audio> 

Nel gioco vero e proprio (che io uso suoni per), io uso questo per riprodurre il suono:

function playSound(soundid) 
    { 
     document.getElementById(soundid).currentTime = 0; 
     document.getElementById(soundid).play(); 
    } 

Ma la riproduzione del suono solo la prima volta, e mai più! Ho provato a ripristinare il "currentTime" nella console a 0, ma ho letteralmente ottenere questo:

>document.getElementById("hammer").currentTime = 0 
0 
>document.getElementById("hammer").currentTime 
0.340... 

perché sta succedendo questo, come posso risolvere il problema?

+0

Forse è il file wav? Questo funziona perfettamente per me su Chrome: http://jsfiddle.net/xWFuq/. (Non importa il file audio, era il più breve che ero in grado di trovare.) – pimvdb

+0

Ma come può essere? Ad ogni modo, forse è colpa del mio computer, lo eseguirò su un server e lo testerò su un altro ... – corazza

+0

Non so; a volte il mio Chrome si rifiuta improvvisamente di suonare qualsiasi '

risposta

24

Vedere this slide e le tre diapositive precedenti di Evan Wallace and Justin Ardini's presentation on html5 game dev.

Per tutte le risorse per fare alcuni giochi impressionante, parte dei loro discorsi: http://madebyevan.com/gamedevclass/

audio continua a non funzionare in modo coerente in tutti i browser, che fin da oggi:

  • Un elemento deve essere ricaricato in Chrome o verrà riprodotto solo una volta
  • Un elemento non deve essere ricaricato in Firefox o ci sarà un ritardo
function playSoundEvent() { 
    if (window.chrome) elems[index].load() 
    elems[index].play() 
    index = (index + 1) % elems.length 
} 
+0

Grazie per le ottime informazioni! Verificherò questa funzione e probabilmente accetterò la tua risposta. – corazza

+1

(Non l'ho provato da solo, ma questi ragazzi sono padroni totali, quindi mi aspetterei che i loro contenuti fossero corretti :) – DTrejo

+0

Che dire di Safari? – DanC

0

Alcuni mesi prima ho dovuto affrontare lo stesso problema durante lo sviluppo di un Piano in HTML5. Quando un tasto è stato premuto ancora e ancora, ho dovuto interrompere, riavvolgere e riprodurre l'audio su ogni pressione dei tasti. Ho usato lo stesso codice scritto in questa domanda che ha funzionato in Firefox e Safari, ma non in Chrome. In Chrome non ha giocato di nuovo. Alla fine ho dovuto modificare il codice per farlo funzionare. Aggiunto un ascoltatore per l'evento onseeked, quindi impostare currentTime = 0 e nel gestore di eventi invocato play. Questo ha funzionato per me. Allo stesso modo ho dovuto aspettare l'evento di un'azione prima di dare l'azione successiva in molti posti. Era una vecchia versione di Chrome. Più tardi ho scoperto che anche alcune versioni dei browser supportano l'audio, il modo in cui ognuna supporta è leggermente diverso. Questa differenza non sarà visibile se inseriamo semplicemente un tag audio e riproduciamo l'audio, ma sperimenteremo quando proveremo a controllare l'audio usando Javascript. Comunque è tutto su versioni precedenti di Browser, è molto meglio in tutte le ultime versioni. Quindi, per favore controlla l'ultima versione di Chrome (anche il mio pianoforte funzionava con Chrome 10 senza la modifica del codice) e per quanto riguarda il formato audio, ti suggerirei di mantenere i file mp3 e ogg del tuo audio invece del singolo file wav.

4

Ho avuto questo problema di recente con un html5. Ha funzionato ovunque tranne il safari. L'uso di load() prima di chiamare play() ha risolto questo problema. Aiuta anche a fare in modo che gli effetti sonori non si sovrappongano a clicker pesanti quando i gestori di eventi attivano i suoni.

Here what I used 
<audio id="sound-one" preload="auto"> 
    <source src="http://myurl/foo.mp3"></source> 
    <source src="http://myurl/foo.ogg"></source> 
</audio> 


<a href="#" id="navigation-id">click here</a> 



Jquery 
$("#navigation-id") //this attached is to an element on the page 
.mouseover(function() { 
    sound-one.load();        
    sound-one.play(); 
    }); 
1

Per chiunque inciampa in questo post in futuro, il tag audio non è davvero un ottimo modo per fare audio di gioco.

Consiglio vivamente di prendere il tempo per imparare il WebAudio API invece.