zoukankan      html  css  js  c++  java
  • VUE用浏览器调用USB摄像头

    公司需求:

      在线上浏览器调用摄像头拍照上传

        本人实现 调用摄像头拍照以下代码  经测试  (Google Chrome  88.0.4324.182) 版本可用   各位可以试一试其他浏览器

      参考代码 https://www.jb51.net/article/193305.htm

    发布到服务器只能支持HTTPS的 HTTP类型的会报错 解决谷歌浏览器不支持HTTP的

      在浏览器地址栏中输入“chrome://flags/#unsafely-treat-insecure-origin-as-secure”,回车,如下图,将该选项置为Enabled,在输入框中输入需要访问的地址,多个地址使用“,”隔开,然后点击右下角弹出的Relaunch按钮,自动重启浏览器之后就可以在添加的http地址下调用摄像头和麦克风了。

      

    以下是调用摄像头代码 直接用就可以

    <template>
    <div class="camera_outer">
    <video id="videoCamera" :width="videoWidth" :height="videoHeight" autoplay></video>
    <canvas style="display:none;" id="canvasCamera" :width="videoWidth" :height="videoHeight"></canvas>
    <div v-if="imgSrc" class="img_bg_camera">
    <img :src="imgSrc" alt="" class="tx_img">
    </div>
    <div>
    <button @click="getCompetence()">打开摄像头</button>
    <button @click="stopNavigator()">关闭摄像头</button>
    <button @click="setImage()">拍照</button>
    </div>
    </div>
    </template>
    <script>
    export default {
    data() {
    return {
    videoWidth: 540,
    videoHeight: 410,
    imgSrc: '',
    thisCancas: null,
    thisContext: null,
    thisVideo: null,
    validTip: '验证中'
    }
    },
    computed: {},
    methods: {
    /*调用权限*/
    getCompetence() {
    var _this = this
    this.thisCancas = document.getElementById('canvasCamera')
    this.thisContext = this.thisCancas.getContext('2d')
    this.thisVideo = document.getElementById('videoCamera')
    // 旧版本浏览器可能根本不支持mediaDevices,我们首先设置一个空对象
    if (navigator.mediaDevices === undefined) {
    navigator.mediaDevices = {}
    }
    // 一些浏览器实现了部分mediaDevices,我们不能只分配一个对象
    // 使用getUserMedia,因为它会覆盖现有的属性。
    // 这里,如果缺少getUserMedia属性,就添加它。
    if (navigator.mediaDevices.getUserMedia === undefined) {
    navigator.mediaDevices.getUserMedia = function (constraints) {
    // 首先获取现存的getUserMedia(如果存在)
    var getUserMedia = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.getUserMedia
    // 有些浏览器不支持,会返回错误信息
    // 保持接口一致
    if (!getUserMedia) {
    return Promise.reject(new Error('getUserMedia is not implemented in this browser'))
    }
    // 否则,使用Promise将调用包装到旧的navigator.getUserMedia
    return new Promise(function (resolve, reject) {
    getUserMedia.call(navigator, constraints, resolve, reject)
    })
    }
    }
    var constraints = {
    audio: false,
    video: { this.videoWidth, height: this.videoHeight, transform: 'scaleX(-1)'}
    }
    navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
    // 旧的浏览器可能没有srcObject
    if ('srcObject' in _this.thisVideo) {
    _this.thisVideo.srcObject = stream
    } else {
    // 避免在新的浏览器中使用它,因为它正在被弃用。
    _this.thisVideo.src = window.URL.createObjectURL(stream)
    }
    _this.thisVideo.onloadedmetadata = function () {
    _this.thisVideo.play()
    }
    }).catch(err => {
    console.log(err)
    })
    },
    /*绘制图片*/
    setImage() {
    var _this = this
    // 点击,canvas画图
    _this.thisContext.drawImage(_this.thisVideo, 0, 0, _this.videoWidth, _this.videoHeight)
    // 获取图片base64链接
    var image = this.thisCancas.toDataURL('image/png')
    _this.imgSrc = image
    this.$emit('refreshDataList', this.imgSrc)
    },
    /*base64转文件*/
    dataURLtoFile(dataurl, filename) {
    var arr = dataurl.split(',')
    var mime = arr[0].match(/:(.*?);/)[1]
    var bstr = atob(arr[1])
    var n = bstr.length
    var u8arr = new Uint8Array(n)
    while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
    }
    return new File([u8arr], filename, {type: mime})
    },
    /*关闭摄像头*/
    stopNavigator() {
    this.thisVideo.srcObject.getTracks()[0].stop()
    }
    },
    mounted() {
    this.getCompetence()
    },
    beforeDestroy() {
    this.stopNavigator()
    }
    }

    </script>
    <style lang="scss" scoped>
    .camera_outer {
    position: relative;
    overflow: hidden;
    background-size: 100%;

    video, canvas, .tx_img {
    -moz-transform: scaleX(-1);
    -webkit-transform: scaleX(-1);
    -o-transform: scaleX(-1);
    transform: scaleX(-1);
    }

    .btn_camera {
    position: absolute;
    bottom: 4px;
    left: 0;
    right: 0;
    height: 50px;
    background-color: rgba(0, 0, 0, 0.3);
    line-height: 50px;
    text-align: center;
    color: #ffffff;
    }

    .bg_r_img {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    top: 0;
    }

    .img_bg_camera {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    top: 0;

    img {
    100%;
    height: 100%;
    }

    .img_btn_camera {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    height: 50px;
    line-height: 50px;
    text-align: center;
    background-color: rgba(0, 0, 0, 0.3);
    color: #ffffff;

    .loding_img {
    50px;
    height: 50px;
    }
    }
    }
    }
    </style>
    窗竹影摇书案上,野泉声入砚池中。 少年辛苦终身事,莫向光阴惰寸功
  • 相关阅读:
    linux 常用命令
    git 常见命令
    合并两个有序链表---python
    Code Contract for .NET
    Kruskal最小生成树算法
    逻辑-哲学
    停机问题
    逆向工程
    .net framework
    python 类库
  • 原文地址:https://www.cnblogs.com/qhantime/p/14446134.html
Copyright © 2011-2022 走看看