2016-05-04 23 views
0

XMLHttpRequestで音楽ファイルをロードしていますが、これは audioCtx.decodeAudioData(response)でデコードしています。Audio API setValueCurveAtTime()Firefox

一度行わ

、私はその後audioCtx.destination

に、私はトラックが遅い開始、およびsetValueCurveAtTimeを使用して2倍の速度を上げたい、私はgainNodeを介して接続AudioBufferSourceNodeを作成します。 source.playbackRate.setValueCurveAtTime(new Float32Array([0, 2]), audioCtx.currentTime, 3);

私は、トラックが0のplaybackRateで始まり、3秒の時間にわたって2に増加することを期待しています。これはChromeで完璧に機能します。しかしFirefoxでは、トラックはplaybackRateが1で始まり、3秒後にはすぐに2に切り替わります。これは別の問題であることを

注そしてWeb Audio API Firefox setValueCurveAtTime()

コード:私はこの行を交換する際に

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

同じことが起こります:

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

Wこれは:

答えて

0

Web Audio APIの古い実装の中には、カーブ値を調べるときに線形補間の代わりに最近隣を使用するものがあります。 linearRampToValueAtTimeは、現在の値を計算することができ、その間に任意の時点で2点を必要とします。

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

物事を単純化するために、あなたの代わりにあなたの代わりにランプポイントを追加することで、遷移時定数を定義することができ使用して、setTargetAtTimeを使用することができます。

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

再生率は0ですが、これはChromeの場合と同様に一時停止を模倣する必要があります。古い実装の場合: 'Chrome 46.0.2490は線形補間を使用します。以前のバージョンでは最近隣(MDN)を使用していますので、Firefoxも以前のバージョンを使用していると思いますか? – Pimmol

+0

@Pimmolはい、それは私の前提です。 –

関連する問題