2016-05-04 6 views
0

Ich lade eine Musikdatei mit einer XMLHttpRequest, die ich mit audioCtx.decodeAudioData(response) dekodieren.Audio API setValueCurveAtTime() Firefox

Ist das erledigt, erstelle ich eine AudioBufferSourceNode, die ich durch eine gainNode verbinden, zu audioCtx.destination

Danach möchte ich die Strecke langsam zu starten, und die Geschwindigkeit zu erhöhen, 2x setValueCurveAtTime mit: source.playbackRate.setValueCurveAtTime(new Float32Array([0, 2]), audioCtx.currentTime, 3);

Ich erwarte, dass die Spur mit einem playbackRate von 0 beginnt und in 3 Sekunden auf 2 ansteigt. Das funktioniert perfekt in Chrome. Aber in Firefox startet der Track mit einem playbackRate von 1 und nach 3 Sekunden wechselt er sofort zu 2. Also ohne Übergang.

Beachten Sie, dass dies ein anderes Problem ist dann Web Audio API Firefox setValueCurveAtTime()

Code:

let audioCtx = new AudioContext(); 
let url ='http://mdn.github.io/decode-audio-data/viper.ogg'; 

loadBuffer(url); 

function loadBuffer(url) { 
    console.log('loading buffer...'); 

    let request = new XMLHttpRequest(); 

    request.open('GET', url, true); 
    request.responseType = 'arraybuffer'; 

    request.addEventListener('load', (e) => { 
     decodeAudioData(e.target.response); 
    }); 

    request.send(); 
} 

function decodeAudioData(response) {; 
    audioCtx.decodeAudioData(response).then((decodedBuffer) => { 
     console.log(`Decoding audio done`); 

     let source = audioCtx.createBufferSource(); 
     source.buffer = decodedBuffer; 

     let gainNode = audioCtx.createGain(); 
     source.connect(gainNode); 
     gainNode.connect(audioCtx.destination); 

     source.start(0); 
     source.playbackRate.setValueCurveAtTime(new Float32Array([0, 2]), audioCtx.currentTime, 3); 
    }); 
} 

Demo

Das gleiche passiert, wenn ich diese Zeile ersetzen:

source.playbackRate.setValueCurveAtTime(new Float32Array([0, 2]), audioCtx.currentTime, 3); 

W its this:

source.playbackRate.value = 1; 
source.playbackRate.linearRampToValueAtTime(2, audioCtx.currentTime + 3); 

Antwort

0

Einige ältere Implementierungen der Web Audio-API verwenden beim Durchlaufen von Kurvenwerten den nächsten Nachbarn anstelle der linearen Interpolation. linearRampToValueAtTime erfordert zwei Punkte jederzeit zwischen denen der Stromwert berechnet werden kann:

source.playbackRate.linearRampToValueAtTime(1, audioCtx.currentTime); 
source.playbackRate.linearRampToValueAtTime(2, audioCtx.currentTime + 3); 

Dinge zu vereinfachen, können Sie stattdessen setTargetAtTime nutzen könnten, mit denen Sie ständig eine Übergangszeit festlegen können statt Rampe Punkte hinzufügen zu müssen:

source.playbackRate.setTargetAtTime(2, audioCtx.currentTime, 3); // To 2, now, over 3 secs. 
+0

Bei der Wiedergabegeschwindigkeit von 0 sollte dies wie in Chrome eine Pause nachahmen. Für ältere Implementierungen: 'Chrome 46.0.2490 verwendet lineare Interpolation; frühere Versionen benutzen den nächsten Nachbarn '(MDN) Also, ich nehme an, Firefox benutzt auch eine frühere Version? – Pimmol

+0

@ Pimmol Ja, das ist meine Annahme. –