本文使用WebRTC的功能,打开电脑上的摄像头,并且把摄像头预览到的图像显示出来。

纯网页实现,能支持除IE外的多数浏览器。手机浏览器也可用。

引入依赖

我们需要引入adapter-latest.js

  1. <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>

这个WebRTC adapter曾是WebRTC中的一部分,但现在被移出来了。

我们会用到它提供的功能。

html

我们在界面上先摆放一些控件。

  1. <div id="container">
  2. <video id="video-local" autoplay playsinline></video>
  3. <button id="showVideo">打开摄像头</button>
  4. <button id="stopVideo">关闭摄像头</button>
  5. <p>显示摄像头预览的内容,网页上由元素video来呈现。</p>
  6. <p>点击打开摄像头按钮后,浏览器会询问是否允许,请点击“允许”。</p>
  7. <div id="errorMsg"></div>
  8. <div id="tipMsg"></div>
  9. </div>
  • video 用来显示预览的视频
  • 两个button用来控制开启和关闭
  • 再放几个显示信息的地方

js

先设置一下,我们只使用视频

  1. const constraints = window.constraints = {
  2. audio: false,
  3. video: true
  4. };

在网页上显示一些信息,便于调试。

  1. function showErrMsg(msg, error) {
  2. const errorElement = document.querySelector('#errorMsg');
  3. errorElement.innerHTML += `<p>${msg}</p>`;
  4. if (typeof error !== 'undefined') {
  5. console.error(error);
  6. }
  7. }
  8. function showMsg(msg) {
  9. const msgEle = document.querySelector('#tipMsg');
  10. msgEle.innerHTML += `<p>-> ${msg}</p>`;
  11. console.log(msg);
  12. }

完整代码在main.js中。css可自行定义。

打开摄像头

要打开摄像头,使用MediaDevices.getUserMedia()方法

  1. async function openCamera(e) {
  2. try {
  3. showMsg('正在打开摄像头');
  4. const stream = await navigator.mediaDevices.getUserMedia(constraints);
  5. showMsg('获取到了stream');
  6. gotStream(stream);
  7. e.target.disabled = true;
  8. } catch (err) {
  9. onErr(err);
  10. }

MediaDevices.getUserMedia()方法在用户允许后,按照请求,拿到stream。

stream可以包含视频或音频。前面的设定里,我们只使用视频。

如果用户拒绝了使用摄像头申请,或者申请的媒体不可用,即表现为被拒绝。

用户拒绝会报NotAllowedError,找不到符合要求的设备会报NotFoundError DOMException

方法的文档MediaDevices.getUserMedia()

显示视频

获取到stream后,让video显示视频

  1. function gotStream(stream) {
  2. const videoEle = document.querySelector('video');
  3. const videoTracks = stream.getVideoTracks();
  4. showMsg(`正在使用的设备: ${videoTracks[0].label}`);
  5. window.stream = stream;
  6. videoEle.srcObject = stream;
  7. }

document.querySelector('video')直接获取html上的video控件。

把stream直接交给videoEle.srcObject

停止视频流

要停止视频,我们可以从video元素入手,拿到stream,然后把里面的track停掉。

  1. function stopVideo(e) {
  2. showMsg("停止视频");
  3. const videoElem = document.querySelector('video');
  4. const stream = videoElem.srcObject;
  5. document.querySelector('#showVideo').disabled = false; // 允许开启
  6. if(stream == null) {
  7. return;
  8. }
  9. const tracks = stream.getTracks();
  10. tracks.forEach(function(track) {
  11. track.stop();
  12. });
  13. videoElem.srcObject = null;
  14. }

stream.getTracks()方法拿到所有的轨道(track),遍历一遍全部关掉。

最后,把videoElem.srcObject设置为null,它与前面的stream解除关联,方便将它释放。

参考 MediaStreamTrack-stop

小结

示例使用的WebRTC的功能。显示的是本地摄像头的视频,不涉及传输。拿到视频流后交给video来显示。

getUserMedia是示例中最关键的方法。以后的示例都会用到它。

参考

效果预览

完整的效果请参考

open-camera

WebRTC打开本地摄像头的更多相关文章

  1. 1.0.3-学习Opencv与MFC混合编程之---打开本地摄像头

    源代码:http://download.csdn.net/detail/nuptboyzhb/3961643 版本1.0.3新增内容 打开摄像头 Ø 新建菜单项,Learning OpenCV——&g ...

  2. h5 Video打开本地摄像头和离开页面关闭摄像头

    <div> <video id="video" style="width=100%; height=100%; object-fit: fill&quo ...

  3. Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  4. Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  5. H5混合开发二维码扫描以及调用本地摄像头

    今天主管给了我个需求,说要用混合开发,用H5调用本地摄像头进行扫描二维码,我之前有做过原生安卓的二维码扫一扫,主要是通过调用zxing插件进行操作的,其中还弄了个闪光灯.但是纯H5的没接触过,心里没底 ...

  6. 使用JS调用手机本地摄像头或者相册图片识别二维码/条形码

    接着昨天的需求,不过这次不依赖微信,使用纯js唤醒手机本地摄像头或者选择手机相册图片,识别其中的二维码或者是条形码.昨天,我使用微信扫一扫识别,效果超棒的.不过如果依赖微信的话,又怎么实现呢,这里介绍 ...

  7. iOS 打开本地 其他应用程序(URL Types)

    iOS 打开本地其他应用程序(URL Types) /*前言废话:Xcode是神奇的,是我所见到的编译器中最为神奇的,如:它可以同时运行两个甚至更多Project到我们模拟器上,可以同时使用一个模拟器 ...

  8. html JS 打开本地程序及文件

    在网页打开本地应用程序示例: 一.在本地注册表自定义协议:以自定义调用Viso为例 1.在HKEY_CLASSES_ROOT下添加项ZVISIO. 2.修改ZVISIO项下的"(默认)&qu ...

  9. 第五十六篇、OC打开本地和网络上的word、ppt、excel、text等文件

    iOS打开本地和网络上的word.ppt.excel.text等文件 iOS开发过程中可能需要预览一些文件,这些文件的格式可能有word.ppt.excel等文件格式.那么系统提供两个类去预览这些文件 ...

随机推荐

  1. Hive SQL的底层编译过程详解

    本文结构采用宏观着眼,微观入手,从整体到细节的方式剖析 Hive SQL 底层原理.第一节先介绍 Hive 底层的整体执行流程,然后第二节介绍执行流程中的 SQL 编译成 MapReduce 的过程, ...

  2. C++ 与 Visual Studio 2019 和 WSL(三)

    头文件 如果不小心修改了 Linux C/C++ 标准头文件,可以下面这样操作进行恢复: 项目 → 重新扫描解决方案

  3. 重学c#系列——list(十二)

    前言 简单介绍一下list. 正文 这里以list为介绍. private static readonly T[] s_emptyArray = new T[0]; public List() { t ...

  4. 改善深层神经网络-week3编程题(Tensorflow 实现手势识别 )

    TensorFlow Tutorial Initialize variables Start your own session Train algorithms Implement a Neural ...

  5. stm32学习笔记之串口通信

    在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...

  6. git merge远程合并

    当某个分支上的开发工作完成后需要将其合入主分支master 但是在提交合并前我们自己最好做一次衍合,目的是检测是否有冲突的风险,如果有应该在本分支先解决冲突然后在提交合并. 否则解决冲突的工作就全部转 ...

  7. 最大连续数列和 牛客网 程序员面试金典 C++ Python

    最大连续数列和 牛客网 程序员面试金典 C++ Python 题目描述 对于一个有正有负的整数数组,请找出总和最大的连续数列. 给定一个int数组A和数组大小n,请返回最大的连续数列的和.保证n的大小 ...

  8. hdu 1848 Fibonacci again and again (SG)

    题意: 3堆石头,个数分别是m,n,p. 两个轮流走,每走一步可以选择任意一堆石子,然后取走f个.f只能是菲波那契中的数(即1,2,3,5,8.....) 取光所有石子的人胜. 判断先手胜还是后手胜. ...

  9. 开发笔记----- python3 小甜点

    一.字典内容排序 1.根据 值大小排序,默认reverse=False:从小到大排序,True:从大到小排序.例: >>> dic1 = {'a1':4,'b1':12,'c1':1 ...

  10. (一)FastDFS 高可用集群架构学习---简介

    1.什么是FastDFS FastDFS 是余庆老师用c语言编写的一筐开源的分布式文件系统,充分考虑了冗余备份,负载均衡,线性扩容等机制,并注重高可用.高性能等指标,使用FastDFS可以很容易搭建一 ...