javascript - 将视频流 JavaScript 代码传输到 React (ML5)

标签 javascript reactjs webcam tensorflow.js

我尝试将 ML5 图像分类示例( Link )中的代码转换为我的 React 组件,如下所示:

class App extends Component {
  video = document.getElementById('video');

  state = {
    result :null
  }

  loop = (classifier) => {
    classifier.predict()
      .then(results => {
        this.setState({result: results[0].className});
        this.loop(classifier) // Call again to create a loop
      })
  }

  componentDidMount(){
    ml5.imageClassifier('MobileNet', this.video)
      .then(classifier => this.loop(classifier))

  }
  render() {

    navigator.mediaDevices.getUserMedia({ video: true })
      .then((stream) => {
        this.video.srcObject = stream;
        this.video.play();
      })

    return (
      <div className="App">
        <video id="video" width="640" height="480" autoplay></video>
      </div>
    );
  }
}

export default App;

但是这不起作用。错误消息显示Unhandled Rejection (TypeError): Cannot set property 'srcObject' of null

我可以想象 video = document.getElementById('video'); 可能无法通过 id 获取元素。所以我尝试了

  class App extends Component {
  video_element = <video id="video" width="640" height="480" autoplay></video>;

  ...

  render() {
    ...
    return (
      <div className="App">
        {video_element}
      </div>
    );
  }
}

这也不起作用。我很困惑实现这个的正确方法是什么?

感谢任何帮助,谢谢!

最佳答案

我再次回答,重点是一个稍微不同的问题,而不是ref问题。

有一个巨大的问题,导致可怕的闪烁和由于异常而不断失败的 promise ......这是渲染方法中用户媒体的获取!

考虑一下,每次设置状态时,组件都会重新渲染。您有一个不断更新组件状态的循环,而该 promise 不断失败。

安装组件时需要获取用户媒体:

componentDidMount() {
  navigator.mediaDevices.getUserMedia({ video: true }).then(stream => {
    if (this.video.current) {
      this.video.current.srcObject = stream;
      this.video.current.play();
    }

    ml5.imageClassifier("MobileNet", this.video.current)
       .then(classifier => this.loop(classifier));
  });
}

你的渲染方法会短很多:

render() {
  return (
    <div className="App">
      <video ref={this.video} id="video" width="640" height="480" autoPlay />
    </div>
  )
}

关于javascript - 将视频流 JavaScript 代码传输到 React (ML5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54498424/

相关文章:

javascript - 动态生成html和js,生成意外的引用

javascript - 在reactjs中更新状态索引的问题

reactjs - 使用 react-select 和 react-hook-form 返回正确的值

ffmpeg 水平翻转网络摄像头到虚拟摄像机

javascript - 如何使用 JavaScript 检测实时网络摄像头的亮度

video-streaming - 流媒体实时网络摄像头

Javascript - 将 1/0 & 'true'/'false' & true/false 转换为 bool 值的好方法

javascript - JS 如果 className 重定向到该 className 中的链接

javascript - 有没有办法根据网页中的已知值计算 XPath?

reactjs - 如果我不在 willReceiveProps 中使用 setState 会有什么问题吗?