我正在构建一个简单的语音聊天应用。我决定使用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个空数组:(
答案 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对象。
函数startUserMedia
是navigator.getUserMedia
的回调函数,该函数告诉浏览器提示用户是否允许使用所需的媒体设备(在本例中为麦克风)。在用户授予权限之前,不会执行回调。变量recorder
在startUserMedia
中初始化,因此我们必须等待用户授予权限才能使用Recorder对象的API。然而,process
试图在短暂的延迟后记录,无论是否给予许可。这导致了上述竞争条件。
编辑:当然,您可以通过增加setTimeout(process, 1500)
给自己更多时间做出反应。
最后两个笔记:
1.确保您使用的是Chrome!
2.我将行recorder.stop()
和recorder.clear()
添加到process
。如果没有这些行,您会发现第一次加载页面时录制的音频会被添加到下一个录音中。