WebRTC打开本地摄像头
本文使用WebRTC的功能,打开电脑上的摄像头,并且把摄像头预览到的图像显示出来。
纯网页实现,能支持除IE外的多数浏览器。手机浏览器也可用。
引入依赖
我们需要引入adapter-latest.js
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
这个WebRTC adapter曾是WebRTC中的一部分,但现在被移出来了。
我们会用到它提供的功能。
html
我们在界面上先摆放一些控件。
<div id="container">
<video id="video-local" autoplay playsinline></video>
<button id="showVideo">打开摄像头</button>
<button id="stopVideo">关闭摄像头</button>
<p>显示摄像头预览的内容,网页上由元素video来呈现。</p>
<p>点击打开摄像头按钮后,浏览器会询问是否允许,请点击“允许”。</p>
<div id="errorMsg"></div>
<div id="tipMsg"></div>
</div>
- video 用来显示预览的视频
- 两个button用来控制开启和关闭
- 再放几个显示信息的地方
js
先设置一下,我们只使用视频
const constraints = window.constraints = {
audio: false,
video: true
};
在网页上显示一些信息,便于调试。
function showErrMsg(msg, error) {
const errorElement = document.querySelector('#errorMsg');
errorElement.innerHTML += `<p>${msg}</p>`;
if (typeof error !== 'undefined') {
console.error(error);
}
}
function showMsg(msg) {
const msgEle = document.querySelector('#tipMsg');
msgEle.innerHTML += `<p>-> ${msg}</p>`;
console.log(msg);
}
完整代码在main.js中。css可自行定义。
打开摄像头
要打开摄像头,使用MediaDevices.getUserMedia()
方法
async function openCamera(e) {
try {
showMsg('正在打开摄像头');
const stream = await navigator.mediaDevices.getUserMedia(constraints);
showMsg('获取到了stream');
gotStream(stream);
e.target.disabled = true;
} catch (err) {
onErr(err);
}
MediaDevices.getUserMedia()
方法在用户允许后,按照请求,拿到stream。
stream可以包含视频或音频。前面的设定里,我们只使用视频。
如果用户拒绝了使用摄像头申请,或者申请的媒体不可用,即表现为被拒绝。
用户拒绝会报NotAllowedError,找不到符合要求的设备会报NotFoundError DOMException。
方法的文档MediaDevices.getUserMedia()
显示视频
获取到stream后,让video显示视频
function gotStream(stream) {
const videoEle = document.querySelector('video');
const videoTracks = stream.getVideoTracks();
showMsg(`正在使用的设备: ${videoTracks[0].label}`);
window.stream = stream;
videoEle.srcObject = stream;
}
document.querySelector('video')
直接获取html上的video控件。
把stream直接交给videoEle.srcObject
。
停止视频流
要停止视频,我们可以从video元素入手,拿到stream,然后把里面的track停掉。
function stopVideo(e) {
showMsg("停止视频");
const videoElem = document.querySelector('video');
const stream = videoElem.srcObject;
document.querySelector('#showVideo').disabled = false; // 允许开启
if(stream == null) {
return;
}
const tracks = stream.getTracks();
tracks.forEach(function(track) {
track.stop();
});
videoElem.srcObject = null;
}
stream.getTracks()
方法拿到所有的轨道(track),遍历一遍全部关掉。
最后,把videoElem.srcObject
设置为null,它与前面的stream
解除关联,方便将它释放。
小结
示例使用的WebRTC的功能。显示的是本地摄像头的视频,不涉及传输。拿到视频流后交给video
来显示。
getUserMedia
是示例中最关键的方法。以后的示例都会用到它。
参考
效果预览
完整的效果请参考
open-camera
WebRTC打开本地摄像头的更多相关文章
- 1.0.3-学习Opencv与MFC混合编程之---打开本地摄像头
源代码:http://download.csdn.net/detail/nuptboyzhb/3961643 版本1.0.3新增内容 打开摄像头 Ø 新建菜单项,Learning OpenCV——&g ...
- h5 Video打开本地摄像头和离开页面关闭摄像头
<div> <video id="video" style="width=100%; height=100%; object-fit: fill&quo ...
- Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- H5混合开发二维码扫描以及调用本地摄像头
今天主管给了我个需求,说要用混合开发,用H5调用本地摄像头进行扫描二维码,我之前有做过原生安卓的二维码扫一扫,主要是通过调用zxing插件进行操作的,其中还弄了个闪光灯.但是纯H5的没接触过,心里没底 ...
- 使用JS调用手机本地摄像头或者相册图片识别二维码/条形码
接着昨天的需求,不过这次不依赖微信,使用纯js唤醒手机本地摄像头或者选择手机相册图片,识别其中的二维码或者是条形码.昨天,我使用微信扫一扫识别,效果超棒的.不过如果依赖微信的话,又怎么实现呢,这里介绍 ...
- iOS 打开本地 其他应用程序(URL Types)
iOS 打开本地其他应用程序(URL Types) /*前言废话:Xcode是神奇的,是我所见到的编译器中最为神奇的,如:它可以同时运行两个甚至更多Project到我们模拟器上,可以同时使用一个模拟器 ...
- html JS 打开本地程序及文件
在网页打开本地应用程序示例: 一.在本地注册表自定义协议:以自定义调用Viso为例 1.在HKEY_CLASSES_ROOT下添加项ZVISIO. 2.修改ZVISIO项下的"(默认)&qu ...
- 第五十六篇、OC打开本地和网络上的word、ppt、excel、text等文件
iOS打开本地和网络上的word.ppt.excel.text等文件 iOS开发过程中可能需要预览一些文件,这些文件的格式可能有word.ppt.excel等文件格式.那么系统提供两个类去预览这些文件 ...
随机推荐
- 搭载Dubbo+Zookeeper踩了这么多坑,我终于决定写下这篇!
大家好,我是melo,一名大二上软件工程在读生,经历了一年的摸滚,现在已经在工作室里边准备开发后台项目啦. 这篇文章我们不谈数据结构了,来谈谈入门分布式踩过的坑.感觉到了分布式这一层,由于技术更新迭代 ...
- 2.1 OOP & SOLID
OOP & SOLID Implementing DDD highly relies on the Object Oriented Programming (OOP) and SOLID pr ...
- Windows内核开发-10-监听对象
Windows内核开发-10-监听对象 Windows内核除了可以监听进程,线程.dll还可以监听特定的对象和注册表.这里先讲一下监听对象. 监听对象 内核提供了一种可以监听对特定的对象类型的句柄进行 ...
- 摘录:ddr3内存条时序概念
本文摘自:内存系列二:深入理解硬件原理 - 知乎 (zhihu.com),感谢作者! 上次虽然解决了小张的问题,却引发了他对内存原理的兴趣.这不他又来找我了,说我还欠他一个解释.这次我们约在一个咖啡馆 ...
- Manacher算法 求 最长回文子串
1 概述(扯淡) 在了解Manacher算法之前,我们得先知道什么是回文串和子串. 回文串,就是正着看反着看都一样的字符串.比如说"abba"就是一个回文串,"abbc& ...
- linux基本命令二
组管理与权限管理 文件/目录所有者 修改文件所有者 chown 用户名 文件名 创建文件所在组 groupadd 修改文件所在组 chgrp 组名 文件名 其他组:除文件的所有者和所在组的用 ...
- 三层组网AP上线外接DHCP
一.实验目的 在3-1的基础上增加DHCP的配置方法 二.实验仪器设备及软件 仪器设备:一台AC,四台AP,一台路由充当DHCP服务器 软件:ENSP 三.实验原理 四. 实验内容与步骤 1.三层 ...
- Jetbrains 系 IDE 编辑器的代码提示功能
著名的 Jetbrains 可谓编程界的一大福音,众多有名代码编辑器比如 ItelliJ IDEA.PHPStorm.WebStorm.PyCharm 等,均出自这家公司麾下. 对于中国的Java开发 ...
- Java 源码如何分析?
如何阅读源码?万事开头难,源码从哪里开始看?我也是刚对源码的阅读研究不深,但是可以谈谈自己的源码阅读感受. 刚开始吧,只是对某些代码的实现原理感到好奇,好奇是怎么实现这种功能,实现这种效果的,对其背后 ...
- [第二章]c++学习笔记3(构造函数)
成员函数的一种 (1)名字与类名相同,可以有参数,不能有返回值(void也不行) (2)作用是对对象初始化,如给成员变量赋初值 (3)如果定义类时没写构造函数,则编译器生成一个默认的无参数的构造函数( ...