【问题标题】:How to get FFT from audio tag in HTML5如何从 HTML5 中的音频标签获取 FFT
【发布时间】:2023-03-24 04:47:02
【问题描述】:

我想从<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。 我的代码一定有问题,我想知道如何从音频标签中获取频率数据。

【问题讨论】:

    标签: html audio fft


    【解决方案1】:

    如果在 window.onload 之前调用 createMediaSourceElement,它似乎会中断。有一个关于这个问题的错误报告:http://code.google.com/p/chromium/issues/detail?id=112368

    目前有两种解决方法:

    在执行整个 javascript 之前等待窗口加载事件

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

    在 setTimeout 中以 0 延迟创建 MediaElementSource

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

    【讨论】:

    • 得到它!非常感谢您。但是如果音频标签中有很多mp3,当我执行next()时它就不能正常工作了。
    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多