我试图使用Vue 3将摄像头提要绑定到视频元素,但我似乎甚至无法使用基本示例.有人能告诉我我错过了什么吗?

import { ref, reactive } from 'vue'
let stream: any = reactive({})
let constraints = {
    audio: false,
    video: {
      width: { min: 1024, ideal: 1280, max: 1920 },
      height: { min: 576, ideal: 720, max: 1080 },
      facingMode: 'environment'
    }
  }
stream = await navigator.mediaDevices.getUserMedia(constraints)

然后在我的模板中,我try 了以下两种方法来绑定

<video :srcObject.prop="stream" width="300" height="200" autoplay></video>
<video :srcObject.prope.camel="stream" autoplay playsinline></video>

推荐答案

您的代码用getUserMedia()的结果覆盖了stream,这有效地从组件的上下文中删除了原始reactive()实例.

解决方案

stream设为ref而不是reactive,并将其value属性设置为getUserMedia()的结果.

此外,为了确保用户的资源仅在必要时激活,在组件的mounted钩子中调用getUserMedia(),并在beforeUnmount钩子中停止流.

<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue'

const stream = ref(null)
const constraints = {
  audio: false,
  video: {
    width: { min: 1024, ideal: 1280, max: 1920 },
    height: { min: 576, ideal: 720, max: 1080 },
    facingMode: 'environment',
  },
}

onMounted(async () => {
  stream.value = await navigator.mediaDevices.getUserMedia(constraints)
})

onBeforeUnmount(() => {
  stream.value.getTracks().forEach(track => track.stop())
})
</script>

<template>
  <video :srcObject="stream" width="300" height="200" autoplay></video>
</template>

demo

Vue.js相关问答推荐

在Nuxt项目中混合Scrolltrigger与Lenis

Vue.js 3 运行时挂载组件实例

如何在vue js模板中添加foreach和for循环

vuex 未知动作类型:addTodo

VeeValidate 4 字段验证状态

Vuetify grid layout - 如何填充网格中元素的高度

使用数组元素的计算(computed)属性

如何在 vue 的 scss 中使用深度 Select 器

从组件的 内的组件调用方法

如何只查看数组中的一个对象?

Vue 3 如何获取有关 $children 的信息

怎样1秒后自动隐藏VueJS中的元素

Axios-一次发出多个请求(vue.js)

Laravel 中的 VueJS 组件实现中的鼠标悬停

Vue.js 处理多次点击事件

如何在 Vue3 设置标签中定义组件名称?

为什么 Vue.js 使用 VDOM?

从 vue.js 中的 store 获得的计算(computed)属性的设置器

如何在 vue.js 中进行嵌入?

超过最大调用堆栈大小 Vuetify