Recorderjs:缓冲区始终为空

时间:2013-12-06 00:12:16

标签: javascript audio buffer html5-audio recorder

我正在构建一个简单的语音聊天应用。我决定使用NodeJS,但我无法理解为什么缓冲区总是空的。

我正在使用https://github.com/mattdiamond/Recorderjs

我的代码如下所示:

var audio_context;
var recorder;

function startUserMedia(stream) {
    var input = audio_context.createMediaStreamSource(stream);    
    input.connect(audio_context.destination);    
    recorder = new Recorder(input);
}

function process() {
 recorder.record();

 setTimeout(function() {
    recorder.getBuffer(function(data) {
        console.log(data);
    });
 }, 3000);
}

window.onload = function init() {
try {
  window.AudioContext = window.AudioContext || window.webkitAudioContext;
  navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
  window.URL = window.URL || window.webkitURL;

  audio_context = new AudioContext;
} catch (e) {
    console.log(e);
}

navigator.getUserMedia({audio: true}, startUserMedia);

setTimeout(process, 1500); 
};

问题是当执行getBuffer回调时,数据总是包含2个空数组:(

1 个答案:

答案 0 :(得分:1)

我稍微更改了process中的代码,以便更容易看到发生了什么。

function process() {
  console.log('Entered process');
  console.log(recorder);
  recorder && recorder.record();

  setTimeout(function() {
    console.log('Trying to get buffer');
    recorder.stop();
    recorder.getBuffer(function(data) {
      console.log(data);
      createDownloadLink();
      recorder.clear();
    });
  }, 3000);
}

我还在startUserMedia的开头添加了一行:

console.log('Initializing');

当您访问该页面时,Chrome会要求您允许使用您的麦克风。如果您在控制台中打印“已输入的进程”之前允许使用麦克风,则一切都应正常工作。您将看到消息“正在初始化”以及记录器对象,后跟“已输入的进程”。您的阵列不会为空,并且播放器应出现在页面上,允许您收听录音。

但是,如果在“初始化”之前在控制台中输入“已输入的进程”(意味着您不允许足够快地使用麦克风),则会返回两个空数组。请注意,console.log(recorder)现在返回'undefined'而不是Recorder对象。

函数startUserMedianavigator.getUserMedia的回调函数,该函数告诉浏览器提示用户是否允许使用所需的媒体设备(在本例中为麦克风)。在用户授予权限之前,不会执行回调。变量recorderstartUserMedia中初始化,因此我们必须等待用户授予权限才能使用Recorder对象的API。然而,process试图在短暂的延迟后记录,无论是否给予许可。这导致了上述竞争条件。

编辑:当然,您可以通过增加setTimeout(process, 1500)给自己更多时间做出反应。

最后两个笔记:
1.确保您使用的是Chrome!
2.我将行recorder.stop()recorder.clear()添加到process。如果没有这些行,您会发现第一次加载页面时录制的音频会被添加到下一个录音中。