我尝试从浏览器创建音频流并将其发送到服务器。
以下是代码:
let recording = false;
let localStream = null;
const session = {
audio: true,
video: false
};
function start () {
recording = true;
navigator.webkitGetUserMedia(session, initializeRecorder, onError);
}
function stop () {
recording = false;
localStream.getAudioTracks()[0].stop();
}
function initializeRecorder (stream) {
localStream = stream;
const audioContext = window.AudioContext;
const context = new audioContext();
const audioInput = context.createMediaStreamSource(localStream);
const bufferSize = 2048;
// create a javascript node
const recorder = context.createScriptProcessor(bufferSize, 1, 1);
// specify the processing function
recorder.onaudioprocess = recorderProcess;
// connect stream to our recorder
audioInput.connect(recorder);
// connect our recorder to the previous destination
recorder.connect(context.destination);
}
function onError (e) {
console.log('error:', e);
}
function recorderProcess (e) {
if (!recording) return;
const left = e.inputBuffer.getChannelData(0);
// send left to server here (socket.io can do the job). We dont need stereo.
}
当触发函数start
时,可以在recorderProcess
中捕获样本
当函数stop
被触发时,浏览器中的麦克风图标会消失,但是......
除非我将if (!recording) return
放在recorderProcess
的开头,否则它仍会处理样本。
不幸的是它根本不是一个解决方案 - recordingProcess
仍在接收样本,如果我再次触发start
个函数,它将从前一个流中获取所有样本新的。
我的问题是:
如何在没有此类问题的情况下停止/开始录制?
或者如果它不是最佳解决方案
如何在stop
函数中完全删除流,以便随时安全地再次初始化它?
答案 0 :(得分:1)
recorder.disconnect()应该有帮助。
您可能需要考虑Chrome Canary中的新MediaRecorder功能,显示在https://webrtc.github.io/samples/src/content/getusermedia/record/(目前仅限视频),而不是WebAudio API。