【问题标题】:Issue with HTML5 Audio Frequency Animation?HTML5 音频动画有问题吗?
【发布时间】:2015-05-19 19:50:32
【问题描述】:

这似乎只是 JS 中的 AnalyserNode 的问题(或者它在键盘和椅子之间......)。

基本上,我有一个正确设置的音频文件(正常情况下的流)。但是,一旦我尝试在它和目的地之间连接分析器节点,一切都会变得混乱。音频不输出,并且节点在 dataArray 中始终为 0 或未定义。在过去的 7-10 个小时里,我一直在研究这个问题(运气不同),并注意到大多数人在触发“canplay”事件后解决了这个问题,但这对我不起作用。任何帮助都会很可爱!

作为背景,这是一个 IceCast 流,虽然我认为它不会伤害/改变任何东西。

$(document).ready(function() {
var audio = new Audio();
audio.id = "audioStream";
audio.src = ; // Snipped our streaming link.
audio.autoplay = true;
audio.preload = "none";

document.body.appendChild(audio);
audio.addEventListener("canplay", function() {
    initAudio(audio);
});
});

function initAudio(audio) {
    window.AudioContext = window.AudioContext || window.webkitAudioContext;

    window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
        window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;

    var context = new AudioContext();
    var analyser = context.createAnalyser(); 
    analyser.smoothingTimeConstant = 0.85;

    var source = context.createMediaElementSource(audio); 
    source.connect(analyser);
    analyser.connect(context.destination);

    analyser.fftSize = 32;
    var bufferLength = analyser.frequencyBinCount;
    var dataArray = new Uint8Array(bufferLength);

    var visualisation = document.getElementById("bounceAnimation");
    var barSpacingPercent = 100 / bufferLength;
    for (var i = 0; i < bufferLength; i++) {
        var div = document.createElement('div');
        div.style["left"] = i * barSpacingPercent + "%";
        div.style["width"] = barSpacingPercent + "%";
        div.style["height"] = "5%";
        div.className = "lineDance";

        visualisation.appendChild(div);
    }
    var bars = visualisation.children;

    function draw(){
        requestAnimationFrame(draw);
        analyser.getByteFrequencyData(dataArray);

        for (i = 0; i < bars.length; i++) {
            bars[i].style["height"] = (dataArray[i] * -1) + '%';
            if(dataArray[i] != 0) {
                alert(dataArray[i]);
            }
        };
    }

    draw();
}

【问题讨论】:

  • 你能试试静态(可下载)MP3 文件吗?另外,你能试试不同的浏览器吗?
  • Analyzer 节点会要求 CORS 实现,不知道源链接;如果来自外部站点(跨源)并且他们的服务器不允许 CORS,您将无法使用 AudioContext(除非您使用自己的页面服务器作为流的代理)。
  • 不是分析器节点;它是 MediaElementAudioSource (createMediaElementSource)。

标签: javascript html5-audio web-audio-api


【解决方案1】:

你应该添加:

audio.crossOrigin = "匿名";

并使用 CORS 标头为您的流提供服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2012-08-25
    • 2013-03-11
    • 2011-03-14
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多