HTML5 的调用摄像头拍照和获取视频流的方法

yumo6663个月前 (05-02)技术文章22

随着web功能越来越强大,我们很多时候需要在web页面来获取摄像头进行操作,原生html5提供了对摄像头的支持,需要用户的同意授权,下面是一个基于 HTML5 的调用摄像头拍照并上传后台的示例代码:

html复制代码<!DOCTYPE html>
<html>
<head>
    <title>拍照上传</title>
</head>
<body>
    <video id="video" style="width:300px;height:200px;"></video>
    <br>
    <button id="btn-start">启动摄像头</button>
    <button id="btn-stop">停止摄像头</button>
    <button id="btn-capture">拍照上传</button>
    <br>
    <canvas id="canvas"></canvas>
    <form id="form-upload" method="post" enctype="multipart/form-data">
        <input type="file" id="input-file" name="file"/>
    </form>

    <script type="text/javascript">
        var video = document.getElementById('video');
        var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');
        
        // 启动摄像头
        document.getElementById('btn-start').addEventListener('click', function() {
            navigator.mediaDevices.getUserMedia({
                video: true,
                audio: false
            }).then(function(stream) {
                video.srcObject = stream;
            }).catch(function(err) {
                console.log("启动摄像头失败:" + err);
            });
        });

        // 停止摄像头
        document.getElementById('btn-stop').addEventListener('click', function() {
            video.pause();
            video.srcObject.getTracks()[0].stop();
            video.srcObject = null;
        });

        // 拍照,并上传到后台
        document.getElementById('btn-capture').addEventListener('click', function() {
            canvas.width = video.videoWidth;
            canvas.height = video.videoHeight;
            ctx.drawImage(video, 0, 0);
            canvas.toBlob(function(blob) {
                var formData = new FormData();
                formData.append('file', blob, 'photo.jpg');
                postRequest('/upload', formData, function(res) {
                    alert(res.message);
                });
            }, 'image/jpeg');
        });

        // 发送 POST 请求
        function postRequest(url, data, callback) {
            var xhr = new XMLHttpRequest();
            xhr.open('POST', url, true);
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var res = JSON.parse(xhr.responseText);
                    callback(res);
                }
            };
            xhr.send(data);
        }
    </script>
</body>
</html>

上述代码主要分为以下几个部分:

  1. html5 的 <video> 元素用于显示摄像头数据流,我们可以通过 JavaScript API 控制调用摄像头、暂停和关闭。同时使用了 <canvas> 元素来缓存视频帧的图像数据。
  2. 页面中 btn-start 按钮通过 getUserMedia() 方法请求浏览器授权,并将摄像头数据流传给 <video> 元素进行播放。
  3. 点击 btn-capture 按钮时,通过 toBlob() 将缓存的图像数据转化为 Blob 对象,并封装到 FormData 中,以便发送给后台服务。
  4. postRequest() 函数用于发送包含文件数据的 POST 请求,其中 FormData 对象中的 key 是上传后台服务器处理时需要读取的参数名称,通常对应具体的后台业务逻辑。

最后,需要注意的是,在本地调试和开发时,特别是在 Windows 操作系统下使用 Chrome 浏览器访问时,可能会遇到摄像头不能正常运行的情况。这时可以打开地址栏,在目标请求前加上
--unsafely-treat-insecure-origin-as-secure="http://localhost:8080" 参数(其中端口号需替换成实际的本地服务端口),即可获得权限,进行摄像头使用。

相关文章

在平板电脑上使用Chrome观看视频的最佳技巧

平板电脑由于其便携性和较大的屏幕尺寸,成为了许多人观看视频的理想选择。配合功能强大的谷歌Chrome浏览器,你的视频观看体验可以更上一层楼。下面将分享一些在平板电脑上使用Chrome观看视频时的技巧。...

手把手教你用 Spring Boot+FFmpeg 实现 RTSP 视频流播放

你是否在互联网大厂的后端开发工作中,遇到过这样的难题?项目需要实现实时视频推流服务,并且要支持 RTSP 视频流的播放,但尝试了多种方法都效果不佳,不仅效率低,还频频出现兼容性问题,让开发进度严重受阻...

C# 开发超级视频播放器VLC代码开源

自主采用C# 开发视频播放器,效果如下;VLC多媒体播放器(最初命名为VideoLAN客户端)是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影...

实现浏览器播放rtsp视频流的解决方案

有同学问道:需要实时播放摄像头rtsp视频流,而浏览器不能直接播放,怎样解决?实现这个需求可以通过插件或者转码来实现。要实现这个目的,可以采用的方案非常得多,有商业的也有开源的,这里主要列举一些开源的...

Python Flask如何实播放视频流?深入浅出实现方案

本文致力于流式传输,这是一个有趣的功能,它使Flask应用程序能够长时间有效地将大型响应有效地分成小块。为了说明这一主题,我将向您展示如何构建实时视频流服务器!注意:本文有后续内容,Flask视频流再...

浏览器播放rtsp视频流解决方案(浏览器rtsp播放器)

最近项目中需要实时播放摄像头rtsp视频流,于是就专门做了些研究。而浏览器不能直接播放,只有通过插件或者转码来实现这个需求。要实现这个目的,可以采用的方案非常得多,有商业的也有开源的,这里主要列举一些...