【问题标题】:Trying to capture desktop image using getUserMedia and canvas尝试使用 getUserMedia 和画布捕获桌面图像
【发布时间】:2015-07-09 08:37:44
【问题描述】:

我正在制作一个 chrome 扩展,通过它我可以获取用户桌面的屏幕截图。我正在使用chrome.desktopCapture API 来获取选定窗口的流。 我正在动态创建视频元素。一旦它设置了它的源,我就调用了play() 方法。然后我创建了一个画布元素并用它来绘制视频图像。我也可以使用canvas.toDataURL() 获取 dataURL,但是当我打开这个 url 时,我看不到任何图像。即使在新捕获期间,此 URL 值也保持不变。

Manifest.json -

{
  "name": "Desktop Capture Example",
  "description": "Show desktop media picker UI",
  "version": "1",
  "manifest_version": 2,
  "background": {
     "persistent": false,
      "scripts": ["background.js"]
  },
    "browser_action": {
    "default_title": "Take a screen shot of Desktop!"
  },
  "permissions": [
    "desktopCapture"
  ]
}

Background.js -

var pending_request_id = null;

chrome.browserAction.onClicked.addListener(function() {

   pending_request_id = chrome.desktopCapture.chooseDesktopMedia(["screen", "window"],onAccessApproved);

});

function gotStream(stream) {
  console.log("Received local stream");
  var video = document.createElement('video');
  video.src = URL.createObjectURL(stream);
  video.play();
  var canvas = document.createElement('canvas');
  var ctx = canvas.getContext("2d");
  ctx.drawImage(video, 0, 0, 640, 480);
   var url = canvas.toDataURL();
  console.log(url);
  //localstream = stream;
  //stream.onended = function() { console.log("Ended"); };
}

function getUserMediaError() {
  console.log("getUserMedia() failed.");
}

function onAccessApproved(id) {
  if (!id) {
    console.log("Access rejected.");
    return;
  }
  navigator.webkitGetUserMedia({
      audio:false,
      video: { mandatory: { chromeMediaSource: "desktop",
                            chromeMediaSourceId: id } }
  }, gotStream, getUserMediaError);
}

【问题讨论】:

  • 你能显示 toDataURL() 的值吗?您的 gotStream 函数也应该只触发一次,您可能希望将视频元素转换为全局变量,然后调用快照函数,该函数将在获取 dataURL 之前将其绘制到画布上
  • toDataURL()的值:数据:图像/ PNG; BASE64,iVBORw0KGgoAAAANSUhEUgAAASwAAACWCAYAAABkW7XSAAAEYklEQVR4Xu3UAQkAAAwCwdm / 9HI83BLIOdw5AgQIRAQWySkmAQIEzmB5AgIEMgIGK1OVoAQIGCw / QIBARsBgZaoSlAABg + UHCBDICBisTFWCEiBgsPwAAQIZAYOVqUpQAgQMlh8gQCAjYLAyVQlKgIDB8gMECGQEDFamKkEJEDBYfoAAgYyAwcpUJSgBAgbLDxAgkBEwWJmqBCVAwGD5AQIEMgIGK1OVoAQIGCw / QIBARs ...此字符串重复9次由多个分隔 “/”跨度>
  • @Kaiido gotStream 函数只触发一次。让视频元素全球化也无济于事。
  • 在拍摄快照之前添加一个 setTimeout,你会明白我的意思。实际上,您甚至在将其绘制到视频上之前就已将其拍摄

标签: javascript html canvas google-chrome-extension google-chrome-app


【解决方案1】:

您必须等待视频实际加载流:像这样重写您的 gotStream:

function gotStream(stream) {
  console.log("Received local stream");
  var video = document.createElement('video');
  video.addEventListener('loadedmetadata',function(){
      var canvas = document.createElement('canvas');
      canvas.width = this.videoWidth;
      canvas.height = this.videoHeight;
      var ctx = canvas.getContext("2d");
      ctx.drawImage(this, 0, 0);
      var url = canvas.toDataURL();
      console.log(url);
      // will open the captured image in a new tab
      window.open(url);
    },false);
  video.src = URL.createObjectURL(stream);
  video.play();
  }

此外,为了获得更好质量的图像,您必须设置 getUserMedia() 调用的强制 maxHeight 和 maxWidth :

navigator.webkitGetUserMedia({
      audio:false,
      video: { mandatory: { chromeMediaSource: "desktop",
                            chromeMediaSourceId: id,
                            maxWidth: 4000,
                            maxHeight: 4000} }
  }, gotStream, getUserMediaError);

【讨论】:

  • 谢谢它的工作但图像大小始终为 300 * 150。如何解决这个问题?
  • 在画布之前设置画布的heightwidth 属性
  • 它有帮助,但生成的图像质量低。
  • 是的,它会延伸到 640x480,正如您在 OP 中所写的那样。如果你想要全尺寸,那么使用video.videoWidthvideo.videoHeight,你应该在强制对象中设置它
  • 谢谢!将画布宽度和高度设置为与该视频相同。
猜你喜欢
  • 2015-06-17
  • 2023-04-08
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多