通过getUserMedia开始取消初始化录音

时间:2015-11-27 09:46:52

标签: javascript webrtc audio-streaming

我尝试从浏览器创建音频流并将其发送到服务器。

以下是代码:

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函数中完全删除流,以便随时安全地再次初始化它?

1 个答案:

答案 0 :(得分:1)

recorder.disconnect()应该有帮助。

您可能需要考虑Chrome Canary中的新MediaRecorder功能,显示在https://webrtc.github.io/samples/src/content/getusermedia/record/(目前仅限视频),而不是WebAudio API。

相关问题