【问题标题】:HTML5 Audio: createMediaElementSource breaks audio outputHTML5 音频:createMediaElementSource 中断音频输出
【发布时间】:2016-08-28 22:14:41
【问题描述】:

我正在学习 webgl,我正在通过 this 教程从 mp3 文件中提取频率,以便将它们可视化。

我让它在给定一个 mp3 文件的地方工作。但是如果我尝试用createMediaElementSource连接AudioContext的分析仪来获取频率数据,就不行了。

Fiddle

JS:

window.onload = function(e) {       
    document.getElementById('music-files').addEventListener('change', selectMusic, false);
}

var musicFiles = [];
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var audio;
var audioSrc;
var analyser;
var bufferLength;
var dataArray;

function selectMusic(e) {   
    musicFiles = e.target.files;    
}

function getFreq(){
    requestAnimationFrame(getFreq);
    analyser.getByteFrequencyData(dataArray);
    console.log(">>>>>>>>>>>>>>>");
    console.log(dataArray[240])
}

function play(){    
    var num = Math.floor(Math.random()*musicFiles.length);
    console.log("playing=" + num);
    var musicFile = URL.createObjectURL(musicFiles[num]); 
    $("#music").attr("src", musicFile);
    document.getElementById('music').play();

    audio = document.getElementById('music');
    audioSrc = audioCtx.createMediaElementSource(audio);    
    analyser = audioCtx.createAnalyser();
    audioSrc.connect(analyser);
    bufferLength = analyser.frequencyBinCount;
    dataArray = new Uint8Array(bufferLength);
    getFreq();
}

function stop(){
    document.getElementById('music').pause();
}

如果你看一下小提琴,你可以选择一个 mp3 文件并点击播放,它会在浏览器控制台中记录一个频段但没有声音(至少在我的电脑上),这可能意味着它正在播放歌曲但没有声音。但是,如果您在下面评论这些行,它会播放歌曲并且我可以听到。

Fiddle with commented code

/*audioSrc = audioCtx.createMediaElementSource(audio);  
    analyser = audioCtx.createAnalyser();
    audioSrc.connect(analyser);
    bufferLength = analyser.frequencyBinCount;
    dataArray = new Uint8Array(bufferLength);
    getFreq();*/



我的设置:Windows 10/Chrome52

对此问题的任何建议表示赞赏。谢谢。

【问题讨论】:

  • 它是否说明了浏览器控制台中的 CORS 限制?
  • 不。它没有说任何关于 CORS 的内容。

标签: html5-audio web-audio-api


【解决方案1】:

没有声音,因为当您在元素上创建MediaElementSource 时,它​​会断开输出。 (这可以让您分析或处理音频,而不会输出未经处理。)您需要做的就是:

audioSrc.connect(audioCtx.destination);

在您将 audioSrc 连接到分析仪之后。

【讨论】:

  • 非常感谢。这个小虫子搞砸了一个非常愉快的星期六晚上。
  • 试过了,但在我的情况下没有帮助 - 仍然没有声音
  • @DataGreed,如果您使用的是 scriptProcessor 或类似的东西,请记住将 inputBuffer 中的数据复制到 outputBuffer。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 2014-11-16
相关资源
最近更新 更多