【问题标题】:put live audio input data into array将实时音频输入数据放入数组
【发布时间】:2013-04-03 22:00:23
【问题描述】:

嘿,我正在使用 GetUserMedia() 来捕获来自用户麦克风的音频输入。同时,我想将捕获的值放入一个数组中,以便我可以使用它们进行操作。我正在使用以下代码,但问题是我的数组一直被值 128 填充(我现在在控制台中打印结果),我找不到我的错误。有人可以帮我找出我的错误吗?

//create a new context for audio input
context = new webkitAudioContext();
var analyser = null;
var dataarray = [];

getLiveInput = function() {
 navigator.webkitGetUserMedia({audio: true},onStream,onStreamError);
};

function onStream(stream) 
{
  var input = context.createMediaStreamSource(stream);
  analyser = context.createAnalyser();
  var str = new Uint8Array(analyser.frequencyBinCount);
  analyser.getByteTimeDomainData(str);
  for (var i = 0; i < str.length; i++) {
    var value = str[i];

    dataarray.push(value);
    console.log(dataarray)
  }//end for loop
}//end function

function onStreamError(e) {
  console.error('Streaming failed: ', e);
};

【问题讨论】:

    标签: arrays microphone web-audio-api getusermedia


    【解决方案1】:

    getByteTimeDomainData 返回的值是 8 位整数,从 0 到 255。128 是一半,基本意思是“没有信号”。相当于从-1到1的PCM音频数据中的0。

    但无论如何 - 有几个问题:

    首先,您永远不会将输入连接到分析仪。在调用analyser.getByteTimeDomainData() 之前,您需要input.connect(analyser)

    第二个问题不在于您的代码,而在于它只是一个实现问题。

    基本上,gotStream 函数只被调用一次 - 而getByteTimeDomainData 只返回 1024 个音频样本的数据(一秒的一小部分)。问题是,这一切都发生得如此之快,而且在创建流之后如此短的时间,还没有真正的输入。尝试将analyser.getByteTimeDomainData() 调用和随后的循环封装在 1000 毫秒 setTimeout 中,然后在您授予浏览器录制权限后立即对着麦克风吹口哨。您应该会看到 128 以外的一些值。

    这是一个例子:http://jsbin.com/avasav/5/edit

    【讨论】:

    • 您好,感谢您的回复。是的,我确实忘记将输入与分析器连接起来:(。问题是当我使用你的代码时,有时数组会停止填充。我怎样才能让它一直收集我的值?
    猜你喜欢
    • 2014-09-18
    • 2015-06-04
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2019-10-28
    • 2021-10-31
    相关资源
    最近更新 更多