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
页面刷新当前选项卡和扩展程序。
- 我没有使用任何
onInstalled
听众。
非常感谢任何帮助!
在此先感谢。
请查看后台页面控制台日志....可能存在需要您解决的错误...
去做
点击 chrome 右上角的扩展程序图标...管理扩展程序...在右上角启用开发者模式...打开检查视图背景页面
好的,所以我终于解决了!
答案是每次停止记录器时重新加载后台脚本。这样后台脚本变量将被重置为其默认值并且脚本将按预期工作。
这里是重置后台脚本的代码:
chrome.extension.getBackgroundPage().window.location.reload();
我正在开发一个 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
听众。
非常感谢任何帮助!
在此先感谢。
请查看后台页面控制台日志....可能存在需要您解决的错误...
去做 点击 chrome 右上角的扩展程序图标...管理扩展程序...在右上角启用开发者模式...打开检查视图背景页面
好的,所以我终于解决了!
答案是每次停止记录器时重新加载后台脚本。这样后台脚本变量将被重置为其默认值并且脚本将按预期工作。
这里是重置后台脚本的代码:
chrome.extension.getBackgroundPage().window.location.reload();