vue PC端调用多个摄像头笔记

该博客介绍了一个使用Vue.js实现的双摄像头拍照功能。通过navigator.mediaDevices API获取摄像头流,并在两个video元素中显示摄像头画面。同时,实现了拍照功能,将视频帧渲染到canvas并转换为base64格式的图片,支持下载和可能的上传操作。此外,还提供了开启、关闭摄像头的按钮控制。
摘要由CSDN通过智能技术生成

1、谷歌浏览器设置(设置)

 2、代码

 

<template>
  <div class="home">
    <div class="top"  >
      <div class="left" v-loading="loading">
        <h1>摄像头1</h1>
        <video ref="video1"  width="640" height="480"  autoplay style="background-color: black;"></video>
      </div>
      <div class="right" v-loading="loading">
        <h1>摄像头2</h1>
        <video ref="video2" width="640" height="480"  autoplay style="background-color: black;"></video>
      </div>
    </div>
    <div class="bottom">
      <div class="left">
        <h1>照片</h1>
        <!--canvas截取流-->
        <canvas ref="canvas1" width="640" height="480" style="background-color: black;"></canvas>
      </div>
      <div class="right">
        <h1>照片</h1>
        <!--canvas截取流-->
        <canvas ref="canvas2" width="640" height="480" style="background-color: black;"></canvas>
      </div>
    </div>
    <div class="btns">
       <el-button type="primary" @click="callCamera" style="margin-right: 10px"
      >开启摄像头</el-button
    >
    <!--关闭摄像头-->
    <el-button type="primary" @click="closeCamera">关闭摄像头</el-button>
    <el-button type="primary" @click="photograph">拍照</el-button>
    </div>
   
  </div>
</template>
<script>
export default {
  data() {
    return {
      loading:false,
      devicesIds: [], //摄像头数组
    };
  },
  created() {
    this.init();
  },
  methods: {
    //
    async init() {
      try {
        let devices = await navigator.mediaDevices.enumerateDevices();
        console.log(devices, "设备");
        devices.forEach((device) => {
          if (device.kind == "videoinput") {
            this.devicesIds.push(device.deviceId);
          }
        });
        console.log(this.devicesIds, "摄像头");
      } catch (error) {}
    },
    // 调用摄像头
    callCamera() {
      this.loading=true
      //console.log(this.devicesIds)
      this.devicesIds.forEach((item,index)=>{
        // H5调用电脑摄像头API
      navigator.mediaDevices
        .getUserMedia({
          video: {
            deviceId:{exact:item},
          },
        })
        .then((success) => {
          // console.log(success,'流')
          // 摄像头开启成功
          this.$refs[`video${index+1}`].srcObject = success;
          // 实时拍照效果
          this.$refs[`video${index+1}`].play();
          this.loading=false
        })
        .catch((error) => {
          console.error("摄像头开启失败,请检查摄像头是否可用!");
        });
      })
      
    },
    // 拍照
    photograph() {
       this.devicesIds.forEach((item,index)=>{
      let ctx = this.$refs[`canvas${index+1}`].getContext("2d");
      // 把当前视频帧内容渲染到canvas上
      ctx.drawImage(this.$refs[`video${index+1}`], 0, 0, 640, 480);
      // 转base64格式、图片格式转换、图片质量压缩---支持两种格式image/jpeg+image/png
      let imgBase64 = this.$refs[`canvas${index+1}`].toDataURL("image/jpeg", 0.7);

      /**------------到这里为止,就拿到了base64位置的地址,后面是下载功能----------*/

      // 由字节转换为KB 判断大小
      let str = imgBase64.replace("data:image/jpeg;base64,", "");
      let strLength = str.length;
      let fileLength = parseInt(strLength - (strLength / 8) * 2); // 图片尺寸  用于判断
      let size = (fileLength / 1024).toFixed(2);
      console.log(size); // 上传拍照信息  调用接口上传图片 .........
      // 保存到本地
      let ADOM = document.createElement("a");
      ADOM.href = imgBase64;
      ADOM.download = new Date().getTime() + ".jpeg";
      ADOM.click();
      })
    },
    // 关闭摄像头
    closeCamera() {
      if (!this.$refs["video"].srcObject) return;
      let stream = this.$refs["video"].srcObject;
      let tracks = stream.getTracks();
      tracks.forEach((track) => {
        track.stop();
      });
      this.$refs["video"].srcObject = null;
    },
  },
};
</script>
<style scoped lang='scss'>
.home{
  width: 100%;
  background: #ccc;
  .top,.bottom{
    display: flex;
    align-items: center;
    justify-content: space-around;
    text-align: center;
  }
  .btns{
    padding:40px 0;
    display: flex;
    align-items: center;
    justify-content: center;
  }
}
</style>

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
抱歉,我是一个语言模型AI,我没有能力调用摄像头录制视频。不过,您可以尝试使用WebRTC技术来实现在浏览器端调用摄像头录制视频。在Vue中,可以使用vue-webrtc库来实现。这个库提供了一些Vue组件,可以方便地实现WebRTC功能。以下是实现WebRTC录制视频的基本步骤: 1. 安装vue-webrtc库 运行以下命令: ``` npm install vue-webrtc --save ``` 2. 在Vue组件中导入vue-webrtc 在组件中引入vue-webrtc: ```javascript import { Webrtc } from 'vue-webrtc' ``` 3. 在组件中使用Webrtc元素 在组件的template中添加Webrtc元素,用于显示摄像头捕获的视频: ```html <template> <div> <webrtc :autoPlay="true"></webrtc> </div> </template> ``` 4. 实现录制视频功能 使用MediaRecorder API来录制视频: ```javascript let mediaRecorder = null let chunks = [] function startRecording() { const stream = this.$refs.webrtc.getStream() mediaRecorder = new MediaRecorder(stream) mediaRecorder.ondataavailable = function(e) { chunks.push(e.data) } mediaRecorder.onstop = function() { const blob = new Blob(chunks, { type: 'video/mp4' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = 'recording.mp4' a.click() chunks = [] } mediaRecorder.start() } function stopRecording() { mediaRecorder.stop() } ``` 这个例子中,我们使用MediaRecorder API来捕获摄像头视频,并将录制的数据保存到Blob对象中。最后,我们将Blob对象转换为URL,并创建一个链接,使用户可以下载录制的视频。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值