JavaScript调用摄像头拍照和录制视频的完整示例

1. 引言

在现代的Web应用程序中,许多功能要求用户能够使用摄像头进行拍照和录制视频。通过JavaScript,我们可以实现这些功能,使用户可以直接在浏览器中使用设备的摄像头。本文将介绍如何使用JavaScript调用摄像头进行拍照和录制视频,并提供完整的代码示例。

2. 摄像头调用

2.1 检测浏览器支持

在开始调用摄像头之前,我们需要先检测用户所使用的浏览器是否支持相关API。可以使用navigator.mediaDevices.getUserMedia方法来检测。

if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
  // 浏览器支持摄像头调用
} else {
  // 浏览器不支持摄像头调用
}

2.2 获取摄像头输入

一旦确认浏览器支持摄像头调用,我们可以通过navigator.mediaDevices.getUserMedia方法获取摄像头输入流。这个方法返回一个Promise对象,我们可以使用then函数来处理成功回调。

navigator.mediaDevices.getUserMedia({ video: true })
  .then(function(stream) {
    // 获取摄像头输入流成功
  })
  .catch(function(error) {
    // 获取摄像头输入流失败
  });

2.3 显示摄像头预览

获取到摄像头输入流后,我们可以将其绑定到Video元素上,从而显示摄像头的预览。示例代码如下:

<video id="preview" autoplay></video>
var videoElement = document.getElementById("preview");
videoElement.srcObject = stream;

2.4 拍照功能

通过CanvasdrawImage方法,我们可以将当前视频帧绘制到Canvas上。然后,将Canvas上的图像转换为DataURL,并赋值给Image元素,即可实现拍照功能。示例代码如下:

<canvas id="canvas"></canvas>
<img id="photo" alt="Photo" />
<button id="takePhotoButton">拍照</button>
var canvasElement = document.getElementById("canvas");
var context = canvasElement.getContext("2d");
var imageElement = document.getElementById("photo");
var takePhotoButton = document.getElementById("takePhotoButton");

takePhotoButton.addEventListener("click", function() {
  context.drawImage(videoElement, 0, 0, canvasElement.width, canvasElement.height);
  imageElement.src = canvasElement.toDataURL("image/png");
});

2.5 录制视频

要实现视频录制功能,我们可以使用MediaRecorder API。该API允许我们将摄像头输入流录制为视频文件,并提供相应的事件来处理开始、暂停和结束录制等操作。示例代码如下:

点击拍照 则自动下载

点击开始录制 则开始录制视频 再点击结束录制 自动渲染录制的视频和下载

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>JavaScript调用摄像头拍照、录制</title>
</head>
<body>
<video id="preview" autoplay></video>
<canvas id="canvas" style="display: none;"></canvas>
<img id="photo" alt="Photo" style="display: none;"/>
<button id="takePhotoButton">拍照</button>

<video id="recording" controls style="display: none;"></video>
<button id="startRecordingButton">开始录制</button>
<button id="stopRecordingButton">停止录制</button>

<script>
    if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        navigator.mediaDevices.getUserMedia({video: true})
            .then(function (stream) {
                var videoElement = document.getElementById("preview");
                var canvasElement = document.getElementById("canvas");
                var context = canvasElement.getContext("2d");
                var imageElement = document.getElementById("photo");
                var takePhotoButton = document.getElementById("takePhotoButton");

                videoElement.srcObject = stream;

                takePhotoButton.addEventListener("click", function () {
                    context.drawImage(videoElement, 0, 0, canvasElement.width, canvasElement.height);
                    imageElement.src = canvasElement.toDataURL("image/png");
                    imageElement.style.display = "block";

                    // 下载图片
                    var link = document.createElement('a');
                    link.href = imageElement.src
                    link.download =`图片-${new Date().getTime()}.png`; // 设置下载文件的文件名
                    link.click();

                });

                var recordingElement = document.getElementById("recording");
                var startRecordingButton = document.getElementById("startRecordingButton");
                var stopRecordingButton = document.getElementById("stopRecordingButton");

                var mediaRecorder;

                startRecordingButton.addEventListener("click", function () {
                    var chunks = [];
                    mediaRecorder = new MediaRecorder(stream);

                    mediaRecorder.ondataavailable = function (e) {
                        chunks.push(e.data);
                    };

                    mediaRecorder.onstop = function () {
                        var blob = new Blob(chunks, {type: "video/webm"});
                        recordingElement.src = URL.createObjectURL(blob);

                        // 下载视频
                        var link = document.createElement('a');
                        link.href = URL.createObjectURL(new Blob(chunks, {type: "video/mp4"})); //这里可以修改格式 比如我修改为mp4
                        link.download =`视频-${new Date().getTime()}.mp4`; // 设置下载文件的文件名
                        link.click();
                    };

                    mediaRecorder.start();
                    recordingElement.style.display = "block";

                });

                stopRecordingButton.addEventListener("click", function () {
                    mediaRecorder.stop();
                });
            })
            .catch(function (error) {
                console.error("获取摄像头输入流失败:", error);
            });
    } else {
        console.error("浏览器不支持摄像头调用");
    }
</script>
</body>
</html>

效果:

JavaScript调用摄像头拍照和录制视频

4. 结论

通过JavaScript,我们可以方便地调用摄像头进行拍照和录制视频。本文介绍了如何检测浏览器支持、获取摄像头输入流、显示预览、拍照和录制视频,并提供了完整的示例代码。开发者可以根据实际需求,进一步扩展这些功能,以实现更多有趣的应用。

正文到此结束
评论插件初始化中...
Loading...