html5调用摄像头使用Getusermedia和canvas

本文介绍了如何使用HTML5的getUserMedia API获取用户摄像头的视频流,并结合Canvas元素实现实时捕获及加水印保存图像的功能。用户许可后,通过constraints指定音频和视频设备,然后在successCallback中处理视频流,利用canvas进行帧图像的绘制和处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



Navigator.getUserMedia()方法提醒用户需要使用音频(0或者1)和(0或者1)视频输入设备,比如相机,屏幕共享,或者麦克风。如果用户给予许可,successCallback回调就会被调用,MediaStream对象作为回调函数的参数。如果用户拒绝许可或者没有媒体可用,errorCallback就会被调用,类似的,PermissionDeniedError 或者NotFoundError对象作为它的参数。注意,有可能以上两个回调函数都不被调用,因为不要求用户一定作出选择(允许或者拒绝)。

语法:

navigator.getUserMedia ( constraints, successCallback, errorCallback );

function(stream) {
   var video = document.querySelector('video');
   video.src = window.URL.createObjectURL(stream);
   video.onloadedmetadata = function(e) {
      // Do something with the video here.
   };

}

参数

constraints 

MediaStreamConstaints对象指定了请求使用媒体的类型,还有每个类型的所需要的参数。具体细节请参见MediaDevices.getUserMedia() 方法下面的constraints部分。

在一个html页面调用js,首先完成compositionComplete,调用snapShot,采用Getusermedia,采集视频流,然后使用cavas画出一帧图像。并加水印保存到ICMS

示例代码:

//页面加载时必须完成一下动作,调用snapShot函数

this.compositionComplete = function () {
                this.Visible.beginCameraDocVisible(true);
                this.Visible.waitingCameraDocVisible(false);
                this.Visible.endCameraDocVisible(false);
                setTimeout(self.snapShot, 50);
            };


//页面一打开,便调出摄像头,getUserMedia,采集视频流

 this.snapShot = function () {
                self.video.loop = self.video.muted = true;
                self.video.load();

                var constraints = {
                    //audio: true,
                    video: {
                        facingMode: "environment",
                        width: 800,
                        height: 800
                    }
                };

                navigator.mediaDevices.getUserMedia(constraints)
                .then(function (stream) {
                    self.mediaStream = stream;

                    console.info("after  mediaStream");
                    var deferred = $.Deferred();
                    self.video.oncanplay = function (e) {
                        console.info("after  oncanplay");
                        setTimeout(function () {
                            self.video.play();
                            self.canvas.width = self.video.videoWidth;
                            self.canvas.height = self.video.videoHeight;
                        }, 500);

                        setTimeout(function () { deferred.resolve(e); }, 2000);
                    };

                    console.info("before window.URL.createObjectURL");
                    self.video.src = window.URL.createObjectURL(stream);
                    console.info("after  window.URL.createObjectURL");

                    return deferred.promise();

                })
                .then(function (e) {

                    //return self.TakePhoto();
                })
                .then(function () {
                    //self.SelectPhoto();

                })
                .catch(function (e) {
                    self.stop();
                    self.FailToAccessCamera();
                })
                ;

            };

      //开始拍照,使用drawImage画布画图,并用fillText把水印加上,此时相机不可用,画布可用

         this.TakePhoto = function () {
                var context = self.canvas.getContext('2d');
                context.drawImage(self.video, 0, 0, self.canvas.width, self.canvas.height);
                //
                context.font = "italic 20px sans-serif";
                context.fillText("*****", 0, self.canvas.height - 10);
                context.fillText(new Date().Format("yyyy-MM-dd HH:mm:ss"), 0, self.canvas.height - 30);
                self.Visible.video(false);
                self.Visible.canvas(true);
            };


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值