我想从< audio>获得FFT数据.标记,但没有任何语法错误它不起作用.看一下Web Audio API文档,我写了一个示例代码,这是我的代码:
<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>
我的Chrome版本是20.0.1096.1 dev-m,我认为它运行良好.通过process(),我试着写下freqByteData,但它显示0,并且它们都是0.
我的代码必定有问题,我想知道如何从音频标签中获取频率数据.
解决方法
如果在window.onload之前调用createMediaSourceElement,它似乎会中断.有关此问题的错误报告:
http://code.google.com/p/chromium/issues/detail?id=112368
目前有两种解决方法:
在执行整个javascript之前等待窗口加载事件
window.addEventListener('load',function(){ // your code },false);
要么
在setTimeout中创建MediaElementSource,延迟为0
setTimeout(function (){ var streamingAudioSource = audioContext.createMediaElementSource(audioElement); var jsProcessor = audioContext.createJavaScriptNode(4096,1); // The rest of the code },0);