为什么不设置视频元素srcObject在Vue.js App中不起作用

时间:2019-02-20 14:57:12

标签: javascript vue.js html5-video

考虑以下应用(简化代码)

<div id="app">
<video id="my-vid" autoplay></video>
</div>

JS

我正在用普通javascript(没有任何vue js属性绑定)设置document.getElementById("my-vid").objectSrc = stream媒体流(在询问用户通常的用户媒体等之后)。

它不起作用(浏览器不显示媒体流,但console.log仍显示有效的MediaStream对象。

但是,当我将视频元素移到外部时,它可以工作!

<div id="app">
</div>
<video id="my-vid" autoplay></video>

这可能是什么原因?

2 个答案:

答案 0 :(得分:1)

我猜正确的方法是

document.getElementById("video").srcObject = stream

我以这种方式使用它,效果很好。

<template>
  <div class="container">
    <video id="videotag" autoplay></video>
  </div>
</template>

<script>
export default {
  name: "video",
  components: {},
  mounted() {
     navigator.getUserMedia = navigator.getUserMedia ||
            navigator.webkitGetUserMedia ||
            navigator.mozGetUserMedia;

        // Start video camera
        navigator.getUserMedia({
                video: true,
                audio: false
            },
            function (stream) {
              document.getElementById('videotag').srcObject = stream
            },
            function (error) {
              console.error(error)
            }
        )
  }
};
</script>

答案 1 :(得分:1)

vue中,永远不要使用document.getElementById()。使用document.getElementById()可以做的任何事情,都可以使用ref进行。试试...

<div id="app">
   <video ref="myVid" autoplay></video>
</div>

然后在脚本中的Vue中...

var me = this;
// Start video camera
navigator.getUserMedia({
        video: true,
        audio: false
    },
    function (stream) {
        me.$refs.myVid.srcObject = stream
    },
    function (error) {
        console.error(error)
    }
)

这是因为DOM级别ID的作用域是整个页面(整个应用程序)。从您的小组件内部,您无法确定其他组件可能使用的ID,并且可能会发生冲突。引用只需要在您的组件中唯一即可。