webrtc实现简单的移动摄像头调用

navigator.mediaDevices.getUserMedia()函数打开摄像头并输出流
videoEle.srcObject将流媒体数据输出到video中
 

 

 

代码:

复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>webRTC摄像头调用</title>
  <script src="https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>
  <style>
    #video {
      width: 100%;
      max-height: 500px;
      background-color: black;
      transform: rotateY(180deg); /*镜像翻转 解决前置摄像头镜像问题*/
    }

    #errorMsg {
      background-color: chocolate;
      margin-bottom: 4px;
    }

    #tipMsg {
      background-color: cyan;
      margin-bottom: 4px;
    }
  </style>
</head>

<body>
  <div id="container">
    画面:<br>
    <video id="video" autoplay playsinline></video><br>
    <p>
      <button id="showVideo">打开前置摄像头</button>
    </p>
    <p>
      <button id="stopVideo">关闭摄像头</button>
    </p>
    <p>点击打开摄像头按钮后,浏览器会询问是否允许,请点击“允许”。</p>
    <div id="tipMsg"></div>
    <div id="errorMsg"></div>
  </div>
  <script>
    const constraints = window.constraints = {
      audio: false,
      video: {
        // facingMode: 'environment', //后置摄像头
        facingMode: 'user', //前置摄像头
      },
    };

    function showErrMsg(msg, error) {
      const errorElement = document.querySelector('#errorMsg');
      errorElement.innerHTML += `<div>-> ${msg}</div>`;
      if (typeof error !== 'undefined') {
        console.error(error);
      }
    }

    function showMsg(msg) {
      const msgEle = document.querySelector('#tipMsg');
      msgEle.innerHTML += `<div>-> ${msg}</div>`;
      console.log(msg);
    }

    //打开摄像头
    async function openCamera(e) {
      try {
        showMsg('正在打开摄像头');
        const stream = await navigator.mediaDevices.getUserMedia(constraints);
        showMsg('获取到了stream');
        gotStream(stream);
        e.target.disabled = true;
      } catch (err) {
        showErrMsg('没有摄像头设备')
      }
    }

    //将视频流输出到video
    function gotStream(stream) {
      const videoEle = document.querySelector('#video');
      const videoTracks = stream.getVideoTracks();
      showMsg(`正在使用的设备: ${videoTracks[0].label}`);
      window.stream = stream;
      videoEle.srcObject = stream;
    }

    //停止视频流
    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;
    }

    //点击打开前置摄像头
    $('#showVideo').click((e) => {
      openCamera(e)
    })
    //点击关闭摄像头
    $('#stopVideo').click(e => {
      stopVideo(e)
    })
  </script>
</body>

</html>
复制代码

 

posted @   herry菌  阅读(474)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
历史上的今天:
2016-11-29 css随笔记(持续更新)
点击右上角即可分享
微信分享提示