You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firefox浏览器中如何检测屏幕共享选中窗口已关闭?

Firefox下检测屏幕共享窗口关闭的解决方案

在Firefox中使用getDisplayMedia捕获屏幕录制时,关闭选中的共享窗口不会触发MediaStreamTrack的ended、inactive等事件,这是Firefox特有的兼容性问题。以下是两种可行的解决方法:

方案1:轮询检查Track的readyState

定时检测MediaStreamTrack的readyState属性,当它变为"ended"时执行停止录制逻辑:

screenRecordingStream.value = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);

screenRecordingStream.value.getTracks().forEach((track) => {
    // 保留原有事件监听逻辑
    track.addEventListener('ended', handleTrackEnd);
    track.addEventListener('inactive', handleTrackInactive);

    // Firefox专属轮询检测
    const checkInterval = setInterval(() => {
        if (track.readyState === 'ended') {
            clearInterval(checkInterval);
            handleTrackEnd();
        }
    }, 1000); // 每秒检查一次,可按需调整间隔

    // 统一处理结束逻辑的辅助函数
    function handleTrackEnd() {
        if (isRecording.value) {
            completionStatus.value = true;
            stopMediaRecorder();
        }
    }

    function handleTrackInactive() {
        if (isRecording.value) {
            completionStatus.value = true;
            stopMediaRecorder();
        } else {
            changeMode(1);
        }
    }

    // 保留其他事件监听
    track.addEventListener('mute', () => console.log('Track muted'));
    track.addEventListener('unmute', () => console.log('Track unmuted'));
    track.addEventListener('overconstrained', () => console.log('Track overconstrained'));
    track.addEventListener('readyStateChange', () => console.log('Track ready state changed'));
});

方案2:监听MediaStream的removetrack事件

Firefox在共享窗口关闭时会将对应track从MediaStream中移除,可通过监听removetrack事件捕获该场景:

screenRecordingStream.value = await navigator.mediaDevices.getDisplayMedia(displayMediaOptions);

// 监听流的track移除事件
screenRecordingStream.value.addEventListener('removetrack', (event) => {
    const track = event.track;
    // 仅针对屏幕共享的音视频track处理
    if (track.kind === 'video' || track.kind === 'audio') {
        if (isRecording.value) {
            completionStatus.value = true;
            stopMediaRecorder();
        } else {
            changeMode(1);
        }
    }
});

// 保留原有track事件监听
screenRecordingStream.value.getTracks().forEach((track) => {
    track.addEventListener('ended', () => {
        if (isRecording.value) {
            completionStatus.value = true;
            stopMediaRecorder();
        }
    });
    // ...其他事件监听逻辑
});

注意事项

  • 轮询间隔建议设置在500-1000ms之间,平衡检测及时性和性能消耗。
  • 使用轮询时,需在录制正常停止或track结束时清除定时器,避免内存泄漏。
  • removetrack事件可能在其他场景触发,需通过track.kind判断确保逻辑准确性。

内容的提问来源于stack exchange,提问作者Bimal Kafle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:52:42