vue3 开启摄像头,并进行拍照

注意:由于调用摄像头需要使用权限,只能在本地运行,线上需用 https 域名才可以使用。

核心API

navigator.mediaDevices.getUserMedia

简单来说就是 向用户请求获得媒体输入的许可,返回一个MediaStream,我们可以使用MediaStream与video组件绑定输出摄像头拍摄的视频,也能记录麦克风的音频

代码实现

<template>
  <div class="main">
    <!-- 画笔控件 用来拍照 -->
    <canvas style="display: none" ref="canvasDom"/>
    <!-- 播放器,用来播放拍摄的视频 -->
    <video v-if="!imgurl" class="camera_video" ref="videoDom"/>
    <!--  显示照片  -->
    <img v-else :src="imgurl"/>
    <br/>
    <button @click="takePhoto">{{ imgurl ? "重拍" : "拍照" }}</button>
  </div>
</template>


<script setup>
import {ref, onMounted} from "vue";
// canvas控件对象
const canvasDom = ref(null);
// video 控件对象
const videoDom = ref(null);
// 照片路径
const imgurl = ref(null);


const openCamera = () => {
  // 检测浏览器是否支持mediaDevices
  if (navigator.mediaDevices) {
    navigator.mediaDevices
        // 开启视频,关闭音频
        .getUserMedia({audio: false, video: true})
        .then((stream) => {
          // 将视频流传入viedo控件
          videoDom.value.srcObject = stream;
          // 播放
          videoDom.value.play();
        })
        .catch((err) => {
          console.log(err);
        });
  } else {
    window.alert("该浏览器不支持开启摄像头,请更换最新版浏览器");
  }
};

// 拍照
const takePhoto = () => {
  // 如果已经拍照了就重新启动摄像头
  if (imgurl.value) {
    imgurl.value = null;
    openCamera()
    return;
  }

  // 设置画布大小与摄像大小一致
  canvasDom.value.width = videoDom.value.videoWidth;
  canvasDom.value.height = videoDom.value.videoHeight;
  // 执行画的操作
  canvasDom.value.getContext("2d").drawImage(videoDom.value, 0, 0);
  // 将结果转换为可展示的格式
  imgurl.value = canvasDom.value.toDataURL("image/webp");
  // 关闭摄像头
  stop();
}


// 关闭摄像头
const stop = () => {
  let stream = videoDom.value.srcObject;
  if (!stream) return;
  let tracks = stream.getTracks();
  tracks.forEach((x) => {
    x.stop();
  });

};

// 打开摄像头
onMounted(() => {
  openCamera();
});
</script>

<style scoped>
.main {
  width: 800px;
  height: 500px;
  margin: auto auto;
}

.camera_video {
  width: 100%;
  height: 100%;
  border: 2px black solid;
}
</style>

参考链接

Vue 使用 navigator.mediaDevices.getUserMedia 调用本地摄像头实现录像以及拍照功能
https://blog.csdn.net/XH_jing/article/details/117415496

https://jsrun.net/5j6Kp/edit

官方文档
https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值