Web Audio Offline Context and Analyser Node

2019-01-29 06:36发布

Is it possible to use the Analyser node in the offlineAudioContext to do frequency analysis?

I found out that ScriptProcessor 's onaudioprocess event still fires in the offlineAudioContext and this was the only event source I could use to call getByteFrequencyData of the Analyser Node. As below:

var offline = new offlineAudioContext(1, buffer.length, 44100);
var bufferSource = offline.createBufferSource();
bufferSource.buffer = buffer;

var analyser = offline.createAnalyser();
var scp = offline.createScriptProcessor(256, 0, 1);

bufferSource.connect(analyser);
scp.connect(offline.destination); // this is necessary for the script processor to start

var freqData = new Uint8Array(analyser.frequencyBinCount);
scp.onaudioprocess = function(){
    analyser.getByteFrequencyData(freqData);
    console.log(freqData);
   // freqData is always the same.
};

bufferSource.start(0);
offline.startRendering();

The problem here is that freqData array is always the same and never changes. Seem like as if it is only analysing one section of the buffer.

Am I doing anything wrong here? Or the Analyser is not intended to be used in the offlineContext.

And here is the fiddle with the same code.

2条回答
混吃等死
2楼-- · 2019-01-29 07:02

The analyser isn't really intended to be used in the offlineContext; in fact, it was originally named "RealtimeAnalyser". But even more importantly, right now you won't get consistent functionality from script processors in offline contexts, either.

查看更多
我只想做你的唯一
3楼-- · 2019-01-29 07:25

An alternative is to use the suspend and resume methods available for an OfflineAudioContext. After suspending, you can use your analyser node to get the desired time and/or frequency domain data. Since the context is stopped, this works just fine. If you're going to do this several times, you'll need to schedule a stop for the next time before resuming.

Unfortunately, AFAIK, only Chrome has implemented suspend for an OfflineAudioContext

查看更多
登录 后发表回答