桌面增加音频
This commit is contained in:
parent
3ce1c07383
commit
b958957ca5
@ -7,8 +7,15 @@
|
|||||||
<div
|
<div
|
||||||
v-if="isRemoteDesktopActive && !isDesktopCollapsed"
|
v-if="isRemoteDesktopActive && !isDesktopCollapsed"
|
||||||
class="desktop-overlay"
|
class="desktop-overlay"
|
||||||
|
@mousemove="handleOverlayMouseMove"
|
||||||
|
@mouseleave="handleOverlayMouseLeave"
|
||||||
>
|
>
|
||||||
<div class="overlay-header">
|
<div
|
||||||
|
class="overlay-header"
|
||||||
|
:class="{
|
||||||
|
'fullscreen-hidden': isFullscreen && !isFullscreenHeaderVisible,
|
||||||
|
}"
|
||||||
|
>
|
||||||
<div class="header-left">
|
<div class="header-left">
|
||||||
<svg
|
<svg
|
||||||
width="18"
|
width="18"
|
||||||
@ -28,6 +35,41 @@
|
|||||||
}}</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="header-right">
|
<div class="header-right">
|
||||||
|
<button
|
||||||
|
v-if="desktopStream"
|
||||||
|
class="header-btn"
|
||||||
|
:class="{ 'sound-enabled': isDesktopSoundEnabled }"
|
||||||
|
@click="toggleDesktopSound"
|
||||||
|
:title="isDesktopSoundEnabled ? '静音' : '开启声音'"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
v-if="isDesktopSoundEnabled"
|
||||||
|
width="16"
|
||||||
|
height="16"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
>
|
||||||
|
<polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5" />
|
||||||
|
<path d="M19.07 4.93a10 10 0 0 1 0 14.14" />
|
||||||
|
<path d="M15.54 8.46a5 5 0 0 1 0 7.07" />
|
||||||
|
</svg>
|
||||||
|
<svg
|
||||||
|
v-else
|
||||||
|
width="16"
|
||||||
|
height="16"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="2"
|
||||||
|
>
|
||||||
|
<polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5" />
|
||||||
|
<line x1="23" y1="9" x2="17" y2="15" />
|
||||||
|
<line x1="17" y1="9" x2="23" y2="15" />
|
||||||
|
</svg>
|
||||||
|
<span>{{ isDesktopSoundEnabled ? "出声" : "静音" }}</span>
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
v-if="desktopStream"
|
v-if="desktopStream"
|
||||||
class="header-btn"
|
class="header-btn"
|
||||||
@ -759,7 +801,10 @@ const isCameraActive = ref(false);
|
|||||||
const isCameraLocalSharing = ref(false);
|
const isCameraLocalSharing = ref(false);
|
||||||
const isCallActive = ref(false);
|
const isCallActive = ref(false);
|
||||||
const isFullscreen = ref(false);
|
const isFullscreen = ref(false);
|
||||||
|
const isFullscreenHeaderVisible = ref(false);
|
||||||
const isCallMuted = ref(false);
|
const isCallMuted = ref(false);
|
||||||
|
const isDesktopSoundEnabled = ref(false);
|
||||||
|
let fullscreenHeaderTimer: number | null = null;
|
||||||
const isDesktopCollapsed = ref(false);
|
const isDesktopCollapsed = ref(false);
|
||||||
const isDesktopShareCollapsed = ref(false);
|
const isDesktopShareCollapsed = ref(false);
|
||||||
const isCameraCollapsed = ref(false);
|
const isCameraCollapsed = ref(false);
|
||||||
@ -851,7 +896,7 @@ const bindDesktopVideo = async () => {
|
|||||||
if (videoRef.value.srcObject !== desktopStream.value) {
|
if (videoRef.value.srcObject !== desktopStream.value) {
|
||||||
videoRef.value.srcObject = desktopStream.value;
|
videoRef.value.srcObject = desktopStream.value;
|
||||||
}
|
}
|
||||||
videoRef.value.muted = true;
|
videoRef.value.muted = !isDesktopSoundEnabled.value;
|
||||||
videoRef.value.play().catch(() => {
|
videoRef.value.play().catch(() => {
|
||||||
message.warning("浏览器阻止了自动播放,请点击桌面画面恢复播放");
|
message.warning("浏览器阻止了自动播放,请点击桌面画面恢复播放");
|
||||||
});
|
});
|
||||||
@ -1045,6 +1090,13 @@ const toggleCallMuted = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const toggleDesktopSound = () => {
|
||||||
|
isDesktopSoundEnabled.value = !isDesktopSoundEnabled.value;
|
||||||
|
if (videoRef.value) {
|
||||||
|
videoRef.value.muted = !isDesktopSoundEnabled.value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const toggleFullscreen = async () => {
|
const toggleFullscreen = async () => {
|
||||||
if (!videoContainer.value) return;
|
if (!videoContainer.value) return;
|
||||||
try {
|
try {
|
||||||
@ -1064,6 +1116,35 @@ const toggleFullscreen = async () => {
|
|||||||
|
|
||||||
const handleFullscreenChange = () => {
|
const handleFullscreenChange = () => {
|
||||||
isFullscreen.value = !!document.fullscreenElement;
|
isFullscreen.value = !!document.fullscreenElement;
|
||||||
|
isFullscreenHeaderVisible.value = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleOverlayMouseMove = (event: MouseEvent) => {
|
||||||
|
if (!isFullscreen.value) return;
|
||||||
|
if (event.clientY < 80) {
|
||||||
|
isFullscreenHeaderVisible.value = true;
|
||||||
|
if (fullscreenHeaderTimer !== null) {
|
||||||
|
clearTimeout(fullscreenHeaderTimer);
|
||||||
|
fullscreenHeaderTimer = null;
|
||||||
|
}
|
||||||
|
} else if (
|
||||||
|
isFullscreenHeaderVisible.value &&
|
||||||
|
fullscreenHeaderTimer === null
|
||||||
|
) {
|
||||||
|
fullscreenHeaderTimer = window.setTimeout(() => {
|
||||||
|
isFullscreenHeaderVisible.value = false;
|
||||||
|
fullscreenHeaderTimer = null;
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleOverlayMouseLeave = () => {
|
||||||
|
if (!isFullscreen.value) return;
|
||||||
|
if (fullscreenHeaderTimer !== null) {
|
||||||
|
clearTimeout(fullscreenHeaderTimer);
|
||||||
|
fullscreenHeaderTimer = null;
|
||||||
|
}
|
||||||
|
isFullscreenHeaderVisible.value = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
const streamListener: EventListener = (event) => {
|
const streamListener: EventListener = (event) => {
|
||||||
@ -1103,6 +1184,10 @@ onUnmounted(() => {
|
|||||||
peer.off("call-started", callStartedListener);
|
peer.off("call-started", callStartedListener);
|
||||||
peer.off("media-ended", mediaEndedListener);
|
peer.off("media-ended", mediaEndedListener);
|
||||||
document.removeEventListener("fullscreenchange", handleFullscreenChange);
|
document.removeEventListener("fullscreenchange", handleFullscreenChange);
|
||||||
|
if (fullscreenHeaderTimer !== null) {
|
||||||
|
clearTimeout(fullscreenHeaderTimer);
|
||||||
|
fullscreenHeaderTimer = null;
|
||||||
|
}
|
||||||
stopDurationTimer();
|
stopDurationTimer();
|
||||||
desktopStream.value?.getTracks().forEach((track) => track.stop());
|
desktopStream.value?.getTracks().forEach((track) => track.stop());
|
||||||
cameraStream.value?.getTracks().forEach((track) => track.stop());
|
cameraStream.value?.getTracks().forEach((track) => track.stop());
|
||||||
@ -1154,6 +1239,11 @@ onUnmounted(() => {
|
|||||||
background: rgba(0, 0, 0, 0.9);
|
background: rgba(0, 0, 0, 0.9);
|
||||||
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
|
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
.overlay-header.fullscreen-hidden {
|
||||||
|
opacity: 0;
|
||||||
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header-left {
|
.header-left {
|
||||||
@ -1194,6 +1284,16 @@ onUnmounted(() => {
|
|||||||
border-color: #f5222d;
|
border-color: #f5222d;
|
||||||
color: #f5222d;
|
color: #f5222d;
|
||||||
}
|
}
|
||||||
|
.header-btn.sound-enabled {
|
||||||
|
background: rgba(0, 180, 42, 0.15);
|
||||||
|
border-color: #00b42a;
|
||||||
|
color: #00b42a;
|
||||||
|
}
|
||||||
|
.header-btn.sound-enabled:hover {
|
||||||
|
background: rgba(0, 180, 42, 0.25);
|
||||||
|
border-color: #00b42a;
|
||||||
|
color: #00d439;
|
||||||
|
}
|
||||||
|
|
||||||
.duration-text {
|
.duration-text {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
|||||||
@ -114,7 +114,7 @@ class Peer extends EventTarget {
|
|||||||
if (type === "desktop") {
|
if (type === "desktop") {
|
||||||
stream = await navigator.mediaDevices.getDisplayMedia({
|
stream = await navigator.mediaDevices.getDisplayMedia({
|
||||||
video: true,
|
video: true,
|
||||||
audio: false,
|
audio: true,
|
||||||
});
|
});
|
||||||
} else if (type === "camera") {
|
} else if (type === "camera") {
|
||||||
stream = await navigator.mediaDevices.getUserMedia({
|
stream = await navigator.mediaDevices.getUserMedia({
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user