How to get FFT from audio tag in HTML5

audio, fft, html

Solution

It seems that createMediaSourceElement breaks if it's called before window.onload. There is a bug report about this issue: http://code.google.com/p/chromium/issues/detail?id=112368

There are currently two workarounds:

Wait the window load event before executing the whole javascript

window.addEventListener('load', function(){
  // your code
}, false);

or

Create the MediaElementSource in a setTimeout with 0 delay

setTimeout(function (){
  var streamingAudioSource = audioContext.createMediaElementSource(audioElement);
  var jsProcessor = audioContext.createJavaScriptNode(4096,1,1);
  // The rest of the code
}, 0);

Problem

I want to get the FFT data from an `<audio>` tag, but it doesn't work without any syntax error. Looking at the Web Audio API document, I write a sample code, here is my code: ``` <audio id="aud" controls="controls" src="test.mp3"></audio> <script type="text/javascript"> var audioElement = document.getElementById("aud"); var audioContext = new webkitAudioContext(); var streamingAudioSource = audioContext.createMediaElementSource(audioElement); var jsProcessor = audioContext.createJavaScriptNode(4096,1,1); jsProcessor.onaudioprocess = process; var analyser = audioContext.createAnalyser(); analyser.fftSize = 2048; //streaming:AudioSource->jsProcessor->analyser->destination streamingAudioSource.connect(jsProcessor); jsProcessor.connect(analyser); analyser.connect(audioContext.destination); //autoplay audioElement.play(); function process(event){ var freqByteData = new Uint8Array(analyser.frequencyBinCount); analyser.getByteFrequencyData(freqByteData); document.getElementById("info").innerHTML=freqByteData[1];//show data in div } </script> ``` My Chrome version is 20.0.1096.1 dev-m and I think it works well. Through process(), I'm trying to write down freqByteData, but it shows 0, and all of them are always 0. It must have something wrong of my code, and I want to know how to get frequency data from an audio tag.

Original source