单击屏幕录制功能的 "Stop Capture" 按钮时弹出窗口没有消失
Pop up doesn't disappear when I click "Stop Capture" button of screen recording functionality
我遇到了弹出窗口的问题。当我 select“从桌面获取音频”并单击“开始录制”时,会出现另一个浏览器弹出窗口,询问我另一个决定(它是关于 select 屏幕和共享音频。我意识到如果我 select“共享音频”并单击蓝色按钮“共享”。它开始录制并出现一个模式:“网站正在共享屏幕和音频”但是如果我通过单击“停止捕获”按钮停止录制,“网站正在共享...”的模式仍然出现。有人可以帮助我或解释我是否可以在我单击“停止捕获”时消失该模式。谢谢。
codepen我留下了link,设计有点乱,但是有功能代码,谢谢
https://codepen.io/gian1599/pen/QWpabWK?editors=1011
图片:1, 2, 3。我把工作流程写得很仔细了,谢谢。
new Vue({
el: "#app",
vuetify: new Vuetify(),
data() {
return {
valueMicAudioToggle: false,
valueAudioToggle: false,
valuestopBtn: true,
valueCaptureBtn: false,
valueStart: false,
stream: "",
rec: ""
};
},
methods: {
startBtn() {
let blobs;
let blob;
const videoElement = document.getElementById("videoElement");
const startBtn = document.getElementById("startBtn");
const mergeAudioStreams = (desktopStream, voiceStream) => {
const context = new AudioContext();
const destination = context.createMediaStreamDestination();
let hasDesktop = false;
let hasVoice = false;
if (desktopStream && desktopStream.getAudioTracks().length > 0) {
// If you don't want to share Audio from the desktop it should still work with just the voice.
const source1 = context.createMediaStreamSource(desktopStream);
const desktopGain = context.createGain();
desktopGain.gain.value = 0.7;
source1.connect(desktopGain).connect(destination);
hasDesktop = true;
}
if (voiceStream && voiceStream.getAudioTracks().length > 0) {
const source2 = context.createMediaStreamSource(voiceStream);
const voiceGain = context.createGain();
voiceGain.gain.value = 0.7;
source2.connect(voiceGain).connect(destination);
hasVoice = true;
}
return hasDesktop || hasVoice
? destination.stream.getAudioTracks()
: [];
};
let voiceStream;
let desktopStream;
// const captureBtn = document.getElementById("captureBtn");
const download = document.getElementById("download");
const audioToggle = document.getElementById("audioToggle");
const micAudioToggle = document.getElementById("micAudioToggle");
const self = this;
const captureBtn = async () => {
download.style.display = "none";
const audio = audioToggle.checked || false;
const mic = micAudioToggle.checked || false;
desktopStream = await navigator.mediaDevices.getDisplayMedia({
video: true,
audio: audio
});
if (mic === true) {
voiceStream = await navigator.mediaDevices.getUserMedia({
video: false,
audio: mic
});
}
const tracks = [
...desktopStream.getVideoTracks(),
...mergeAudioStreams(desktopStream, voiceStream)
];
console.log("Tracks to add to stream", tracks);
self.stream = new MediaStream(tracks);
console.log("Stream", self.stream);
videoElement.srcObject = self.stream;
videoElement.muted = true;
blobs = [];
self.rec = new MediaRecorder(self.stream, {
mimeType: "video/webm; codecs=vp8,opus"
});
self.rec.ondataavailable = (e) => blobs.push(e.data);
self.rec.onstop = async () => {
// blobs.push(MediaRecorder.requestData());
blob = new Blob(blobs, { type: "video/webm" });
const url = window.URL.createObjectURL(blob);
download.href = url;
download.download = "test.webm";
download.style.display = "block";
};
this.valuestopBtn = false;
this.valueStart = true;
this.valueCaptureBtn = true;
this.valueAudioToggle = true;
this.valueMicAudioToggle = true;
// this.stopBtn = true
this.rec.start();
};
captureBtn();
},
// const startBtn = document.getElementById('startBtn')
// const stopBtn = document.getElementById('stopBtn')
stop() {
const videoElement = document.getElementById("videoElement");
// this.startBtn = true
// this.stopBtn = false
this.valueAudioToggle = false;
this.valueMicAudioToggle = false;
this.valueStart = false;
// this.stopBtn = true
this.valuestopBtn = true;
// const self = this
this.rec.stop();
this.stream.getTracks().forEach((s) => s.stop());
videoElement.srcObject = null;
this.stream = null;
}
}
});
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
<div id="app">
<div class="pointer video-list__container">
<video id="videoElement" autoplay controls loop muted />
</div>
<div>
<v-row>
<v-col class="d-flex justify-center" cols="6">
<v-checkbox id="audioToggle" :disabled="valueAudioToggle" label="Get Audio from Desktop" />
<!-- <input
id="audioToggle"
:disabled="valueAudioToggle"
type="checkbox"
>
<label for="audioToggle">Capture Audio from Desktop</label> -->
</v-col>
<v-col class="d-flex justify-center" cols="6">
<v-checkbox id="micAudioToggle" :disabled="valueMicAudioToggle" label="Get Audio from Microphone" />
<!-- <input
id="micAudioToggle"
:disabled="valueMicAudioToggle"
type="checkbox"
>
<label for="micAudioToggle">Capture Audio from Microphone</label> -->
</v-col>
</v-row>
<v-container>
<v-row>
<v-col class="d-flex justify-center" cols="12" />
<v-btn id="download" class="accent-3 blue px-10" :disabled="buttonStateDownload">
<a id="download1" align="center">Download</a>
</v-btn>
</v-col>
</v-row>
</v-container>
<v-container>
<v-row>
<v-col class="d-flex justify-center" cols="12" />
<v-col class="d-flex justify-center ml-0" cols="12">
<p id="message" />
</v-col>
</v-row>
</v-container>
</div>
<v-row>
<v-col class="d-flex justify-center" cols="6">
<v-btn id="startBtn" class="accent-3 blue" :disabled="valueStart" @click="startBtn">
Start Recording
</v-btn>
</v-col>
<v-col class="d-flex justify-center" cols="6">
<v-btn id="stopBtn" class="accent-3 blue" :disabled="valuestopBtn" @click="stop">
Stop Capture
</v-btn>
</v-col>
</v-row>
</div>
</div>
在您的 stop
函数中,您停止了 this.stream
上的所有曲目。这包括桌面流中的视频轨道,但仅包括合并音频流中的音轨。来自桌面和麦克风的原始、单独的音轨不会停止,因此就浏览器而言,它们仍然处于活动状态。
这是停止原始流的一种方法:
new Vue({
// ...
data () {
return {
// ...
individualAudioStreams: [],
// ...
}
},
methods: {
startBtn() {
// ...
const mergeAudioStreams = (desktopStream, voiceStream) => {
// ...
if (desktopStream && desktopStream.getAudioTracks().length > 0) {
// ...
this.individualAudioStreams.push(desktopStream)
}
if (voiceStream && voiceStream.getAudioTracks().length > 0) {
// ...
this.individualAudioStreams.push(voiceStream)
}
// ...
}
// ...
},
stop() {
// ...
this.individualAudioStreams.forEach(s => s.getTracks().forEach(t => t.stop()))
this.individualAudioStreams = []
// ...
}
},
})
我遇到了弹出窗口的问题。当我 select“从桌面获取音频”并单击“开始录制”时,会出现另一个浏览器弹出窗口,询问我另一个决定(它是关于 select 屏幕和共享音频。我意识到如果我 select“共享音频”并单击蓝色按钮“共享”。它开始录制并出现一个模式:“网站正在共享屏幕和音频”但是如果我通过单击“停止捕获”按钮停止录制,“网站正在共享...”的模式仍然出现。有人可以帮助我或解释我是否可以在我单击“停止捕获”时消失该模式。谢谢。
codepen我留下了link,设计有点乱,但是有功能代码,谢谢
https://codepen.io/gian1599/pen/QWpabWK?editors=1011
图片:1, 2, 3。我把工作流程写得很仔细了,谢谢。
new Vue({
el: "#app",
vuetify: new Vuetify(),
data() {
return {
valueMicAudioToggle: false,
valueAudioToggle: false,
valuestopBtn: true,
valueCaptureBtn: false,
valueStart: false,
stream: "",
rec: ""
};
},
methods: {
startBtn() {
let blobs;
let blob;
const videoElement = document.getElementById("videoElement");
const startBtn = document.getElementById("startBtn");
const mergeAudioStreams = (desktopStream, voiceStream) => {
const context = new AudioContext();
const destination = context.createMediaStreamDestination();
let hasDesktop = false;
let hasVoice = false;
if (desktopStream && desktopStream.getAudioTracks().length > 0) {
// If you don't want to share Audio from the desktop it should still work with just the voice.
const source1 = context.createMediaStreamSource(desktopStream);
const desktopGain = context.createGain();
desktopGain.gain.value = 0.7;
source1.connect(desktopGain).connect(destination);
hasDesktop = true;
}
if (voiceStream && voiceStream.getAudioTracks().length > 0) {
const source2 = context.createMediaStreamSource(voiceStream);
const voiceGain = context.createGain();
voiceGain.gain.value = 0.7;
source2.connect(voiceGain).connect(destination);
hasVoice = true;
}
return hasDesktop || hasVoice
? destination.stream.getAudioTracks()
: [];
};
let voiceStream;
let desktopStream;
// const captureBtn = document.getElementById("captureBtn");
const download = document.getElementById("download");
const audioToggle = document.getElementById("audioToggle");
const micAudioToggle = document.getElementById("micAudioToggle");
const self = this;
const captureBtn = async () => {
download.style.display = "none";
const audio = audioToggle.checked || false;
const mic = micAudioToggle.checked || false;
desktopStream = await navigator.mediaDevices.getDisplayMedia({
video: true,
audio: audio
});
if (mic === true) {
voiceStream = await navigator.mediaDevices.getUserMedia({
video: false,
audio: mic
});
}
const tracks = [
...desktopStream.getVideoTracks(),
...mergeAudioStreams(desktopStream, voiceStream)
];
console.log("Tracks to add to stream", tracks);
self.stream = new MediaStream(tracks);
console.log("Stream", self.stream);
videoElement.srcObject = self.stream;
videoElement.muted = true;
blobs = [];
self.rec = new MediaRecorder(self.stream, {
mimeType: "video/webm; codecs=vp8,opus"
});
self.rec.ondataavailable = (e) => blobs.push(e.data);
self.rec.onstop = async () => {
// blobs.push(MediaRecorder.requestData());
blob = new Blob(blobs, { type: "video/webm" });
const url = window.URL.createObjectURL(blob);
download.href = url;
download.download = "test.webm";
download.style.display = "block";
};
this.valuestopBtn = false;
this.valueStart = true;
this.valueCaptureBtn = true;
this.valueAudioToggle = true;
this.valueMicAudioToggle = true;
// this.stopBtn = true
this.rec.start();
};
captureBtn();
},
// const startBtn = document.getElementById('startBtn')
// const stopBtn = document.getElementById('stopBtn')
stop() {
const videoElement = document.getElementById("videoElement");
// this.startBtn = true
// this.stopBtn = false
this.valueAudioToggle = false;
this.valueMicAudioToggle = false;
this.valueStart = false;
// this.stopBtn = true
this.valuestopBtn = true;
// const self = this
this.rec.stop();
this.stream.getTracks().forEach((s) => s.stop());
videoElement.srcObject = null;
this.stream = null;
}
}
});
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
<div id="app">
<div class="pointer video-list__container">
<video id="videoElement" autoplay controls loop muted />
</div>
<div>
<v-row>
<v-col class="d-flex justify-center" cols="6">
<v-checkbox id="audioToggle" :disabled="valueAudioToggle" label="Get Audio from Desktop" />
<!-- <input
id="audioToggle"
:disabled="valueAudioToggle"
type="checkbox"
>
<label for="audioToggle">Capture Audio from Desktop</label> -->
</v-col>
<v-col class="d-flex justify-center" cols="6">
<v-checkbox id="micAudioToggle" :disabled="valueMicAudioToggle" label="Get Audio from Microphone" />
<!-- <input
id="micAudioToggle"
:disabled="valueMicAudioToggle"
type="checkbox"
>
<label for="micAudioToggle">Capture Audio from Microphone</label> -->
</v-col>
</v-row>
<v-container>
<v-row>
<v-col class="d-flex justify-center" cols="12" />
<v-btn id="download" class="accent-3 blue px-10" :disabled="buttonStateDownload">
<a id="download1" align="center">Download</a>
</v-btn>
</v-col>
</v-row>
</v-container>
<v-container>
<v-row>
<v-col class="d-flex justify-center" cols="12" />
<v-col class="d-flex justify-center ml-0" cols="12">
<p id="message" />
</v-col>
</v-row>
</v-container>
</div>
<v-row>
<v-col class="d-flex justify-center" cols="6">
<v-btn id="startBtn" class="accent-3 blue" :disabled="valueStart" @click="startBtn">
Start Recording
</v-btn>
</v-col>
<v-col class="d-flex justify-center" cols="6">
<v-btn id="stopBtn" class="accent-3 blue" :disabled="valuestopBtn" @click="stop">
Stop Capture
</v-btn>
</v-col>
</v-row>
</div>
</div>
在您的 stop
函数中,您停止了 this.stream
上的所有曲目。这包括桌面流中的视频轨道,但仅包括合并音频流中的音轨。来自桌面和麦克风的原始、单独的音轨不会停止,因此就浏览器而言,它们仍然处于活动状态。
这是停止原始流的一种方法:
new Vue({
// ...
data () {
return {
// ...
individualAudioStreams: [],
// ...
}
},
methods: {
startBtn() {
// ...
const mergeAudioStreams = (desktopStream, voiceStream) => {
// ...
if (desktopStream && desktopStream.getAudioTracks().length > 0) {
// ...
this.individualAudioStreams.push(desktopStream)
}
if (voiceStream && voiceStream.getAudioTracks().length > 0) {
// ...
this.individualAudioStreams.push(voiceStream)
}
// ...
}
// ...
},
stop() {
// ...
this.individualAudioStreams.forEach(s => s.getTracks().forEach(t => t.stop()))
this.individualAudioStreams = []
// ...
}
},
})