2012-04-20 12 views
5

Ho sperimentato con il collegamento di un elemento audio all'audio audio web utilizzando createMediaElementSource e l'ho fatto funzionare ma una cosa che devo fare è cambiare la velocità di riproduzione dell'audio tag e non ho potuto farlo funzionare.Impostazione playbackRate su elemento audio collegato a web audio api

Se si tenta di eseguire il codice riportato di seguito, si noterà che funziona fino a quando non si annulla la riga in cui è stata impostata la velocità di riproduzione. Quando questa linea è nell'audio viene disattivata.

So che posso impostare la velocità di riproduzione su un AudioBufferSourceNode utilizzando source.playbackRate.value ma questo non è quello che mi piacerebbe fare, ho bisogno di impostare la velocità di riproduzione sull'elemento audio mentre è collegato al web audio api usando createMediaElementSource quindi non ho alcun AudioBufferSourceNode.

Qualcuno è riuscito a farlo?

var _source, 
    _audio, 
    _context, 
    _gainNode; 

_context = new webkitAudioContext(); 

function play(url) { 
    if (_audio) { 
     _audio.pause(); 
    } 
    _audio = new Audio(url); 
    //_audio.playbackRate = 0.6; 

    setTimeout(function() { 
     if (!_gainNode) { 
      _gainNode = _context.createGainNode(); 
      _gainNode.gain.value = 0.1; 
      _gainNode.connect(_context.destination); 
     } 

     _source = _context.createMediaElementSource(_audio); 
     _source.connect(_gainNode); 

     _audio.play(); 
    }, 0); 

} 

play("http://geo-samples.beatport.com/items/volumes/volume2/items/3000000/200000/40000/9000/400/60/3249465.LOFI.mp3"); 

setTimeout(function() { 
    _audio.pause(); 
}, 4000); 
+0

Strano, questo sembra funzionare per me in Chrome. http://jsfiddle.net/9gLKM/ - Chrome: versione 22.0.1229.94 m –

risposta

1

Quale browser stai utilizzando per testare questo? Sembra che questo non sia ancora stato implementato in Firefox, ma dovrebbe funzionare su Chrome.

Mozilla bug per l'attuazione playbackRate: https://bugzilla.mozilla.org/show_bug.cgi?id=495040

+0

Sto usando chrome. Firefox supporta il tag audio ma non supporta l'API audio web e il mio codice utilizza entrambe le tecnologie, quindi questo non funzionerebbe su Firefox. –

+0

In chrome il playbackRate funziona su un tag audio autonomo, ma quello che sto cercando di fare è farlo funzionare su un elemento audio che è connesso alla web audio api usando createMediaElementSource. Questa è la parte che non ho potuto ottenere lavorando. –

1

è necessario impostare la velocità di riproduzione dopo l'audio ha iniziato a giocare. L'unico modo portatile che ho trovato per fare questo lavoro, è di attendere fino ad ottenere un evento timeupdate con valida currentTime:

_audio.addEventListener('timeupdate', function(){ 
    _if(!isNaN(audio.currentTime)) { 
     _audio.playbackRate = 0.6; 
    } 
}); 

nota che il tasso di riproduzione non è attualmente supportato su Android e che Chrome (sul desktop) non supporta frequenze di riproduzione inferiori a 0,5.

+0

Questo sembra un bug. Dove specifica specifica che la velocità di riproduzione di un audio non può essere impostata fino a dopo la riproduzione iniziale? – idbehold

+0

Mentre leggo le specifiche (http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-playbackrate), l'intenzione è che '' DefaultPlaybackRate '' (ri) impostare il 'playbackRate'' non appena la riproduzione inizia. Dopo questo, la velocità di riproduzione può essere impostata dinamicamente usando '' playbackRate''. Dovendo farlo come ho scritto sopra è un po 'strano, ma ahimè - è l'unica cosa che funziona. Fidati di me :) (Sono l'autore corrente di https://github.com/Notalib/LYT e ho dedicato circa 40 ore a questo problema da solo.) – mzedeler

+0

Che dire dell'impostazione ['defaultPlaybackRate'] (http: // www. w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-defaultplaybackrate)? – idbehold