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

拉杰·维尔玛(Rajat Verma)

我正在开发一个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

  • 我没有使用任何onInstalled监听器。

任何帮助深表感谢!
提前致谢。

拉杰·维尔玛(Rajat Verma)

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

PyQT5程序仅在第一次编译运行时返回错误

仅在当天第一次登录时运行 Linux 图形程序

如何制作仅在程序第一次启动时运行的设置序列

chrome扩展程序弹出窗口可以知道是否是第一次打开吗?

在Python中运行for循环:第一次正常运行,但其余运行未正常运行

Tkinter程序在第一次尝试时无法正常运行,重新启动后可以正常工作

第一次运行jstree

循环仅在第一次调用时运行一次,无限次运行

即使使用try / catch也不会捕获System.Web中的Null参考异常-仅在此代码的第一次运行时发生,后续运行正常

如何仅在第一次打开 excel 文件时运行宏

react-native run-ios 仅在安装 pod 后第一次运行

jQuery datepicker 仅在第一次执行时运行

NULL索引表键值错误仅在语句的第一次运行时引发

为什么我的regex函数仅在第一次运行?

嵌套 Do While 内循环仅在外循环的第一次迭代时运行

CSS Image Fade动画仅在第一次运行

丢失的数据包仅在第一次运行中发生

UITableView仅在第一次运行时以正确的顺序显示行

代码仅在第一次运行良好,然后崩溃(DOM)

Realm对象在写入之前被“无效”,仅在第一次运行时

MySQL 存储过程仅在第一次运行时返回结果

日期选择器引导程序仅在第一次工作

如何使事件仅在应用程序加载 Angular 8 的第一次发生

vim功能只能在第一次正常运行

仅在第一次或刷新时加载Javascript

动画仅在WPF中第一次出现

jQuery单击事件仅在第一次工作

如何使Django UpdateView仅在第一次使用?

for循环仅在第一次迭代时执行