0

编辑2:解决了。请参阅下面的答案。

编辑1:

我稍微改变了我的代码,添加了一个增益节点,移动了一个函数。我还发现如果我使用麦克风,它会起作用。仍然不适用于 USB 音频输入。任何想法?这是我当前的代码:

window.AudioContext = window.AudioContext || window.webkitAudioContext;

window.onload = function(){

  var audioContext = new AudioContext();
  var analyser = audioContext.createAnalyser();
  var gainNode = audioContext.createGain();

  navigator.mediaDevices.getUserMedia({ audio:true, video:false }).then(function(stream){ //MediaStream

    var source = audioContext.createMediaStreamSource(stream);
    source.connect(analyser);
    analyser.connect(gainNode);
    gainNode.connect(audioContext.destination);

    listen();

  });

  function listen(){

    analyser.fftSize = 256;
    var bufferLength = analyser.frequencyBinCount;
    var dataArray = new Uint8Array(bufferLength);
    var index = 0;

    function write(){
      requestAnimationFrame(listen);
      analyser.getByteTimeDomainData(dataArray);
      $('.monitor').html(JSON.stringify(dataArray) + ' -- ' + (index++));
    }

    write();
  }

}

旧/原始帖子:

我目前的代码是这样的,我目前通过USB音频接口连接了一个kewboard:我有信号,已经尝试过其他程序..所以:

window.AudioContext = window.AudioContext || window.webkitAudioContext;

window.onload = function(){

  var audioContext = new AudioContext();
  var analyser = audioContext.createAnalyser();

  navigator.mediaDevices.getUserMedia({ audio:true, video:false }).then(function(stream){ //MediaStream

    var source = audioContext.createMediaStreamSource(stream);
    source.connect(analyser);
    analyser.connect(audioContext.destination);

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

    function listen(){
      requestAnimationFrame(listen);
      analyser.getByteTimeDomainData(dataArray);
      $('.monitor').html(JSON.stringify(dataArray));
    }

    listen();

  });
}

当我弹奏键盘时,dataArray 根本没有变化。为什么?我对这件事很陌生,所以可能我做错了什么......

4

1 回答 1

1

好的,现在它正在工作。我当前的基本测试代码如下。Html 里面只有一个 div.monitor 可以写。目前在火狐上测试。我的硬件是键盘 > 混音器 > behringer UCA222 > 电脑 (usb)。我在弹奏键盘时得到数据,我现在很开心。

与原始代码有几个不同之处,但我认为最重要的是我正在全局保存媒体源(window.audiosource)。这里还有其他关于相关问题的帖子,例如:Chrome: onaudioprocess stops getting called after a while and this HTML5 Microphone capture stop after 5 seconds in Firefox

window.AudioContext = window.AudioContext || window.webkitAudioContext;

navigator.getUserMedia = (navigator.getUserMedia ||
                          navigator.webkitGetUserMedia ||
                          navigator.mozGetUserMedia ||
                          navigator.msGetUserMedia);

var audioContext = new (window.AudioContext || window.webkitAudioContext)();
var analyser = audioContext.createAnalyser();

if(navigator.getUserMedia){
  navigator.getUserMedia(
    { audio: true }
    ,function(stream){
      window.audiosource = audioContext.createMediaStreamSource(stream);
      audiosource.connect(analyser);
      listen();
    }
    ,function(err){ console.log('The following gUM error occured: ' + err); }
  );
}

function listen(){
  requestAnimationFrame(listen);

  analyser.fftSize = 256;
  var bufferLength = analyser.frequencyBinCount;
  var dataArray = new Uint8Array(bufferLength);
  analyser.getByteTimeDomainData(dataArray);
  $('.monitor').html(JSON.stringify(dataArray));
}
于 2015-10-04T11:49:56.153 回答