使用JavaScript访问设备摄像头拍视频并截图

如何使用相机

要访问用户的相机(和/或麦克风),我们使用JavaScript MediaStream API。该API允许通过流访问这些设备捕获的视频和音频。

第一步是检查浏览器是否支持此API:

if (
  "mediaDevices" in navigator &&
  "getUserMedia" in navigator.mediaDevices
) {
  // ok, browser supports it
}

在现代浏览器中,支持是不错的(当然没有Internet Explorer)。

捕获视频流

为了捕获由摄像机生成的视频流,我们使用对象的getUserMedia方法mediaDevices

该方法接收一个对象,该对象具有我们请求的媒体类型(视频或音频)以及一些要求。首先,我们可以通过{video: true}从摄像机获取视频。

const videoStream = await navigator.mediaDevices.getUserMedia({ video: true });

此呼叫将询问用户是否允许访问摄像机。如果用户拒绝,它将引发异常并且不返回流。因此,必须在try / catch块内完成处理这种情况。

使用JavaScript访问设备摄像头拍视频并截图_第1张图片

请注意,它会返回Promise,因此您必须使用async / await或then块。

视频要求

我们可以通过传递有关所需分辨率以及最小和最大限制的信息来改善视频的要求:

const constraints = {
  video: {
    width: {
      min: 1280,
      ideal: 1920,
      max: 2560,
    },
    height: {
      min: 720,
      ideal: 1080,
      max: 1440,
    },
  },
};

const videoStream = await navigator.mediaDevices.getUserMedia(constraints);

这样,流以正确的宽度和高度比例进入。如果它是处于纵向模式的手机,则需要进行尺寸反转。

在页面上显示视频

好的,既然有了流,我们该如何处理?

我们可以将视频显示在页面上的video元素中:

// considering there is a
//  
// tag in the page
const video = document.querySelector("#video");
const videoStream = await navigator.mediaDevices.getUserMedia(constraints);
video.srcObject = videoStream;

注意标记中的autoplay属性video。没有它,您需要调用video.play()以实际开始显示图像。

访问手机的前后摄像头

默认情况下getUserMedia将使用系统的默认视频录制设备。如果手机带有两个摄像头,则使用前置摄像头。

要访问后置摄像头,我们必须facingMode: "environment"在视频要求中包括:

const constraints = {
  video: {
    width: { ... },
    height: { ... },
    facingMode: "environment"
  },
};

默认值为facingMode: "user",即前置摄像头。

请注意,如果要更改已播放视频的摄像机,则需要先停止当前流,然后再用其他摄像机的流替换它:

videoStream.getTracks().forEach((track) => {
  track.stop();
});

截屏

您可以做的另一件很酷的事情是捕获视频的图像(屏幕快照)。

您可以在画布上绘制当前视频帧,例如:

// considering there is a
// 
// tag in the page
const canvas = document.querySelector("#canvas");
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
canvas.getContext("2d").drawImage(video, 0, 0);

您还可以在img元素中显示画布内容。

在本教程创建的示例中,我添加了一个按钮,该按钮可从画布动态创建图像并将其添加到页面。就像是:

const img = document.createElement("img");
img.src = canvas.toDataURL("image/png");
screenshotsContainer.prepend(img);

结论

完整的源代码在这里:https : //github.com/doug2k1/javascript-camera

你可能感兴趣的:(javaScript,自然语言处理)