MediaRecorder 音频块包括以前的录音

MediaRecorder audiochunks includes previous recording

提问人:user3628726 提问时间:10/23/2023 最后编辑:user3628726 更新时间:10/23/2023 访问量:33

问:

我有一段代码,用于仅录制音频,并在每次注册静音时将其发送到我的服务器。

这适用于第一次录制。

之后的每个录音都会将之前的录音附加到新录音中。

例:

音频1:你好,这是第1句。

音频2:你好,这是第1句。你好,这是第 2 句。

音频3:你好,这是句子1。你好,这是第 2 句。你好 这是第 3 句。

录音永远不会从头开始。

到目前为止,我的代码已简化:

var audioChunks = [];

function SendBlobToServer(blob) {
  //jquery post-request to server
}

function detectSilence(
  stream,
  onSoundEnd = _ => {},
  onSoundStart = _ => {},
  silence_delay = 500,
  min_decibels = -80
) {
  const ctx = new AudioContext();
  const analyser = ctx.createAnalyser();
  const streamNode = ctx.createMediaStreamSource(stream);
  streamNode.connect(analyser);
  analyser.minDecibels = min_decibels;

  const data = new Uint8Array(analyser.frequencyBinCount); // will hold our data
  let silence_start = performance.now();
  let triggered = false; // trigger only once per silence event

  function loop(time) {
    requestAnimationFrame(loop); // we'll loop every 60th of a second to check
    analyser.getByteFrequencyData(data); // get current data
    if (data.some(v => v)) { // if there is data above the given db limit
      if (triggered) {
        triggered = false;
        onSoundStart();
      }
      silence_start = time; // set it to now
    }
    if (!triggered && time - silence_start > silence_delay) {
      onSoundEnd();
      triggered = true;
    }
  }
  loop();
}

function onSilence() {
  console.log('silence');
  window.recorder.requestData();
}

function onSpeak() {
  console.log('speaking');
}

const ReadBlobContent = blob => {
  const reader = new FileReader();
  reader.readAsDataURL(blob);
  return new Promise(resolve => {
    reader.onloadend = () => {
      resolve(reader.result);
    };
  });
};

navigator.mediaDevices.getUserMedia({
  audio: true
}).then(stream => {
  window.recorder = new MediaRecorder(stream);

  window.recorder.onstart = function(e) {
    console.log("window.recorder.onstart");
    detectSilence(stream, onSilence, onSpeak);
  };

  window.recorder.onstop = function(e) {
    console.log("window.recorder.onstop");
  };

  window.recorder.ondataavailable = (e) => {
    if (window.recorder.state === "recording") {
      let blob = new Blob(audioChunks, {
        type: 'audio/mpeg-3'
      });

      ReadBlobContent(blob).then(res => SendBlobToServer(res.split(',')[1]));
    }
  };

  window.recorder.start();
  // do something else with the stream
}).catch(console.error);

我试着在最后一行做,但是那 损坏下一句的 blob 文件,使音频无法播放。audioChunks = []SendBlobToServer()

如何以正确的方式清除数组,而不必依赖使用和使用每个口语句子。我想在清除 .audiochunksrecorder.start()recorder.stop()audiochunks

javascript blob 音频流 web-audio-api 媒体记录器

评论


答: 暂无答案