Chrome 扩展:后台脚本仅在第一次正常运行

Chrome Extension: Background script only functioning correctly for the first time

我正在开发一个 chrome 扩展程序,它可以接收来自麦克风和当前选项卡的音频。它第一次运行良好,但脚本在随后的运行中 运行 不正确(它运行但未达到预期)。

这是我的后台(非持久)脚本的代码:

const audioContext = new AudioContext();
const destination = audioContext.createMediaStreamDestination();

const body = document.getElementsByTagName('body')[0];

let chunks = [],
  tabStream,
  micStream,
  tabAudio,
  micAudio,
  output,
  audioConfig,
  text = '',
  micable = true,
  paused = false;

const constraints = {
  audio: true,
};

function getTabAudio() {
  chrome.tabCapture.capture(constraints, (_stream) => {
    // keep playing the audio in the background
    const audio = new Audio();
    audio.srcObject = _stream;
    audio.play();

    tabStream = _stream;
    tabAudio = audioContext.createMediaStreamSource(tabStream);
    tabAudio.connect(destination);

    output = new MediaStream();
    output.addTrack(destination.stream.getAudioTracks()[0]);

    recorder = new MediaRecorder(output);

    recorder.start();

    recorder.ondataavailable = (e) => {
      chunks.push(e.data);
      // call download when recorder state is inactive
      if (recorder.state == 'inactive') download();
    };
  });
}

// get mic audio
function getMicAudio() {
  navigator.mediaDevices.getUserMedia(constraints).then((mic) => {
    micStream = mic;
    micAudio = audioContext.createMediaStreamSource(micStream);
    micAudio.connect(destination);

    // get tab audio
    getTabAudio();
  });
}

// start recording the stream
function startRecord() {
  getMicAudio();
}

// stop record -> stop all the tracks
function stopRecord() {
  recorder.stop();

  micStream.getTracks().forEach((t) => t.stop());
  tabStream.getTracks().forEach((t) => t.stop());
  output.getTracks().forEach((t) => t.stop());

  micable = true;
  chunks = [];
}

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  switch (request.type) {
    case 'record':
      startRecord();
      break;
    case 'stop':
      stopRecord();
      break;
    case 'pause':
      pauseResumeRecord();
      break;
    case 'mute':
      muteMic();
      break;
    default:
      break;
  }
});

要使其再次运行,我必须从 chrome://extenions 页面刷新当前选项卡和扩展程序。

非常感谢任何帮助!
在此先感谢。

请查看后台页面控制台日志....可能存在需要您解决的错误...

去做 点击 chrome 右上角的扩展程序图标...管理扩展程序...在右上角启用开发者模式...打开检查视图背景页面

好的,所以我终于解决了!
答案是每次停止记录器时重新加载后台脚本。这样后台脚本变量将被重置为其默认值并且脚本将按预期工作。

这里是重置后台脚本的代码:

chrome.extension.getBackgroundPage().window.location.reload();