2016-05-04 4 views
0

Я загружаю музыкальный файл с XMLHttpRequest, который я декодирую с помощью audioCtx.decodeAudioData(response).Audio API setValueCurveAtTime() Firefox

После этого, я создаю AudioBufferSourceNode который я соединяюсь через gainNode, чтобы audioCtx.destination

После этого, я хочу, чтобы трек, чтобы начать медленно, и увеличить скорость в 2 раза с помощью setValueCurveAtTime: source.playbackRate.setValueCurveAtTime(new Float32Array([0, 2]), audioCtx.currentTime, 3);

Я ожидаю, что трек начнется с playRate 0 и увеличится до 2, в течение 3 секунд. Это отлично работает в Chrome. Но в Firefox трек начинается с playRate из 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 В этом случае:

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

ответ

0

Некоторые старые реализации API Web Audio используют ближайший соседний вместо линейной интерполяции при прохождении значений кривой. linearRampToValueAtTime требует две точки в любое время, между которыми текущее значение может быть вычислено:

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 Да, это мое предположение. –