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

如何修改采集摄像头画面到canvas的代码,实现屏幕内容共享到canvas

代码修改说明

你原有的HTML代码不需要做任何调整,仅需修改JS文件的核心媒体采集逻辑即可,修改后的完整可运行代码及关键调整点如下:

关键修改点

  • 替换媒体采集API:原来的getUserMedia是调用摄像头/麦克风的专用API,屏幕共享需使用getDisplayMedia接口,该接口返回Promise对象,符合现代JS异步处理规范。
  • 新增用户交互触发:浏览器安全策略要求屏幕共享必须由用户主动交互(点击按钮、点击页面等)触发,页面加载时自动调用会被直接拦截报错。
  • 原有渲染逻辑完全复用:你原有把video流同步绘制到canvas的draw逻辑、video的play事件监听逻辑都不需要调整,只要把屏幕共享的媒体流赋值给video的srcObject即可。

修改后完整JS代码

(function() {
  var canvas = document.getElementById('canvas'),
  context = canvas.getContext('2d'),
  video = document.getElementById('video'),
  vendorUrl = window.URL || window.webkitURL;

  // 点击页面触发屏幕共享,满足浏览器安全策略要求
  document.addEventListener('click', async function() {
    try {
      // 替换原getUserMedia逻辑,调用屏幕共享API
      const stream = await navigator.mediaDevices.getDisplayMedia({
        video: true,
        audio: false // 需要采集系统音频可改为true
      });
      
      // 原有流赋值逻辑保持不变
      if ('srcObject' in video) {
        video.srcObject = stream;
      } else {
        video.src = vendorUrl.createObjectURL(stream);
      }
      video.play();
    } catch (error) {
      // 用户取消共享或授权失败的错误处理
      console.log('共享失败:', error);
    }
  }, false);

  // 原有播放监听和绘制逻辑完全不变
  video.addEventListener('play', function() {
    setInterval(() => {
      draw(this, context, 400, 300);
    }, 100);
  }, false);

  function draw(video, context, width, height) {
    context.drawImage(video, 0, 0, width, height);
  }
})();

可选调整

如果需要自定义触发按钮,只需要在HTML的booth div里加一行<button id="startBtn">开启屏幕共享</button>,然后把JS里的点击事件绑定对象从document换成document.getElementById('startBtn')即可


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:27:04