谷歌浏览器捕获屏幕

-

用到navigator.mediaDevices.getDisplayMedia    api,获取用户授权后,可以捕获屏幕

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <canvas></canvas>
  <video class="shot" muted autoplay width="300" height="200" crossOrigin="anonymous"></video>
  <img class="shotImg" alt="">
<script>
    var canvas = document.createElement('canvas');
    var img = document.querySelector('.shotImg');
    navigator.mediaDevices.getDisplayMedia({video:true}).then(stream => {
        console.log(stream, 'stream');
        let videoDom = document.querySelector('.shot');
        videoDom.srcObject = stream;
        img.width = videoDom.clientWidth;
        img.height = videoDom.clientHeight; 
        videoDom.onloadeddata = (() => {
          setInterval(() => {
            canvas.width = videoDom.clientWidth;
            canvas.height = videoDom.clientHeight;
            canvas.getContext('2d').drawImage(videoDom, 0, 0, canvas.width, canvas.height);
            var dataURL = canvas.toDataURL('image/png');
            img.src = dataURL;
          }, 200);
        })
    }).catch(error => {
        console.log(error);
    });
</script>
</body>
</html>

 录制视频

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <video class="shot" muted autoplay width="300" height="200" crossOrigin="anonymous"></video>
  <button id="start">录制开始</button>
  <button id="end">录制结束</button>
<script>
navigator.mediaDevices.getDisplayMedia({video:true}).then(stream => {
    let videoDom = document.querySelector('.shot');
    videoDom.srcObject = stream;
    createRecorder(stream);
}).catch(error => {
    console.log(error);
});
// 
start.addEventListener('click', () => {
  console.log('start');
  recorder.start();
});
end.addEventListener('click', () => {
  console.log('end');
  recorder.stop();
});
let recorder = null;
let i=0;
function createRecorder(stream) {
  recorder = new MediaRecorder(stream);
  // recorder.start(10000);
  // 如果 start 没设置 timeslice,ondataavailable 在 stop 时会触发
  recorder.ondataavailable = event => { 
    console.log(event);
    let blob = new Blob([event.data], { type: 'video/mp4' });
    saveMedia(blob);
  };
  recorder.onerror = err => {
    console.error(err);
  };
};
// 保存文件
function saveMedia(blob) {
  let reader = new FileReader();
  reader.onload = () => {
    let buffer = new Buffer(reader.result);
    console.log(buffer, 'buffer');
    // fs.writeFile('test'+i+'.mp4', buffer, {}, (err, res) => {
    //   if (err) return console.error(err);
    // });
    i++;
  };
  reader.onerror = err => console.error(err);
  reader.readAsArrayBuffer(blob);
};
</script>
</body>
</html>

-

原文地址:https://www.cnblogs.com/fqh123/p/15554539.html