简体   繁体   English

使用Web音频API分析来自麦克风的输入(将MediaStreamSource转换为BufferSource)

[英]Using web audio api for analyzing input from microphone (convert MediaStreamSource to BufferSource)

I am trying to get the beats per Minute (BPM) using the Web Audio Api like it is done in the following links ( http://joesul.li/van/beat-detection-using-web-audio/ or https://github.com/JMPerez/beats-audio-api/blob/gh-pages/script.js ) but from an audio stream (microphone). 我正在尝试使用Web音频Api获取每分钟(BPM)的节拍,就像在以下链接中所做的一样( http://joesul.li/van/beat-detection-using-web-audio/https:/ /github.com/JMPerez/beats-audio-api/blob/gh-pages/script.js ),但来自音频流(麦克风)。 Unfortunately, I don´t get it running. 不幸的是,我没有让它运行。 Does somebody know how I can convert the microphone MediaStreamSource to a BufferSource and continue like on the first linked Website? 有人知道我如何将麦克风MediaStreamSource转换为BufferSource并像在第一个链接的网站上那样继续吗? Here´s the Code I´ve come to this Point: 这是我现在要讲的代码:

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

    var OfflineContext = window.OfflineAudioContext || window.webkitOfflineAudioContext;
    var source = OfflineContext.createMediaStreamSource(stream);
    source.connect(OfflineContext);
    var offlineContext = new OfflineContext(2, 30 * 44100, 44100);

    offlineContext.decodeAudioData(stream, function(buffer) {
      // Create buffer source
      var source = offlineContext.createBufferSource();
      source.buffer = buffer;
      // Beats, or kicks, generally occur around the 100 to 150 hz range.
      // Below this is often the bassline.  So let's focus just on that.
      // First a lowpass to remove most of the song.
      var lowpass = offlineContext.createBiquadFilter();
      lowpass.type = "lowpass";
      lowpass.frequency.value = 150;
      lowpass.Q.value = 1;
      // Run the output of the source through the low pass.
      source.connect(lowpass);
      // Now a highpass to remove the bassline.
      var highpass = offlineContext.createBiquadFilter();
      highpass.type = "highpass";
      highpass.frequency.value = 100;
      highpass.Q.value = 1;
      // Run the output of the lowpass through the highpass.
      lowpass.connect(highpass);
      // Run the output of the highpass through our offline context.
      highpass.connect(offlineContext.destination);
      // Start the source, and render the output into the offline conext.
      source.start(0);
      offlineContext.startRendering();
    });
})
.catch(function(err) {
    /* handle the error */
    alert("Error");
});

Thank you! 谢谢!

Those articles are great. 这些文章很棒。 There are a few things wrong with your current approach: 您当前的方法存在一些问题:

  1. You don't need to decode the stream - you need to connect it to a web audio context with a MediaStreamAudioSourceNode, and then use a ScriptProcessor (deprecated) or an AudioWorker (not implemented everywhere yet) to grab the bits and do detection. 您不需要解码流-您需要将其连接到具有MediaStreamAudioSourceNode的Web音频上下文,然后使用ScriptProcessor(不建议使用)或AudioWorker(尚未在所有地方实现)来获取这些位并进行检测。 decodeAudioData takes an encoded buffer - ie the contents of an MP3 file - not a stream object. encodeAudioData采用编码缓冲区(即MP3文件的内容)而不是流对象。
  2. Keep in mind this is a STREAM, not a single file - you can't really just hand an entire song audio file to the beat detector. 请记住,这是一个流,而不是单个文件-您不能真正地将整个歌曲音频文件交给节拍检测器。 Well, you CAN - but if you're streaming, then you need to wait until the whole file comes in, which would be bad. 好吧,您可以-但是,如果要进行流式传输,则需要等待整个文件进入,这将是很糟糕的。 You'll have to work in chunks, and the bpm may change during the song. 您必须分块工作,歌曲中的bpm可能会改变。 So collect a chunk at a time - probably a second or more of audio at a time - to pass to the beat detection code. 因此,一次收集一个块-一次可能收集一秒钟或更多的音频-传递给节拍检测代码。
  3. Although it may be a good idea to lowpass-filter the data, it's probably not worthwhile to high-pass filter it. 尽管对数据进行低通滤波可能是个好主意,但对数据进行高通滤波可能不值得。 Remember that filters aren't brick wall filters - they don't slice out everything above or below their frequency, they just attentuate it. 请记住,滤波器不是砖墙滤波器-它们不会将频率之上或之下的所有内容都切掉,而只是对其进行衰减。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM