javascript - iOS 中的 React 视频重新渲染问题

标签 javascript reactjs html5-video

我正在开发 React 应用程序,其中有 20 多个步骤,每个步骤都使用新源重新渲染视频组件。我遇到的问题是,iOS 浏览器(safari 和 chrome)在重新渲染视频几次后会停止播放。

import React, {Component} from "react";
import PropTypes from "prop-types";
import LoadingPoster from "assets/images/loading_video_poster.jpg";

export default class Video extends Component {
  static propTypes = {
    videoUrl: PropTypes.string.isRequired
  };

  constructor(props) {
    super(props);
    this.state = {
      videoUrl: this.props.videoUrl
    };
  }

  onVideoError = (e) => {
    console.log('error', e.target.error.code);
  };

  render = () => {
    return (
        <video
          key={this.props.videoUrl}
          onError={this.onVideoError}
          muted
          loop
          autoPlay
          playsInline
          preload="auto"
          className="workout_page__exercise__video"
          poster={LoadingPoster}
          src={this.state.videoUrl}
        >
          Videos are not supported
        </video>
    );
  }
}

onError 上,我看到该错误的代码为 3。

编辑:

我尝试了 MEDIA_ERR_DECODE on HTML5 video in iOS UIWebView after many plays 的教程:

import React, {Component} from "react";
import PropTypes from "prop-types";
import LoadingPoster from "assets/images/loading_video_poster.jpg";

export default class Video extends Component {
  static propTypes = {
    videoUrl: PropTypes.string.isRequired
  };

  constructor(props) {
    super(props);
    this.state = {
      videoUrl: ''
    };
  }

  shouldComponentUpdate(nextProps, nextState){
    return nextProps === this.props
  }

  componentDidMount = () => {

    this.refs.video.src= "";
    this.refs.video.load();
    this.refs.videoWrapper.removeChild(this.refs.video);

    setTimeout(() => {
      let clone = this.refs.video.cloneNode();
      clone.classList.add('clone');
      clone.src = this.props.videoUrl;
      clone.load();
      this.refs.videoWrapper.appendChild(clone);
      console.log('added', this.refs.videoWrapper);
    }, 100)

  };

  onVideoError = (e) => {
    console.log('error', e.target.error.code);
  };

  render = () => {
    return (
      <div ref={'videoWrapper'}>
        <video
          key={this.props.videoUrl}
          onError={(e) => this.onVideoError(e)}
          muted
          loop
          autoPlay
          playsInline
          preload="auto"
          className="workout_page__exercise__video"
          poster={LoadingPoster}
          src={this.state.videoUrl}
          ref={'video'}
        >
          Videos are not supported
        </video>
      </div>
    );

  }
}

还是没有成功

什么可能导致此问题以及如何正确解决此问题?

最佳答案

解决方案是在卸载之前删除视频

import React, {Component} from "react";
import PropTypes from "prop-types";
import LoadingPoster from "assets/images/loading_video_poster.jpg";

export default class Video extends Component {
  static propTypes = {
    videoUrl: PropTypes.string.isRequired
  };

  componentWillUnmount() {
    this.refs.video.src = '';
    this.refs.video.load();
  }

  render = () => {
    return (
      <video
        key={this.props.videoUrl}
        autoPlay
        muted
        loop
        playsInline
        preload="auto"
        className="workout_page__exercise__video"
        poster={LoadingPoster}
        src={this.props.videoUrl}
        ref={'video'}
      >
        Videos are not supported
      </video>
    );
  }
}

关于javascript - iOS 中的 React 视频重新渲染问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51499951/

相关文章:

javascript - $.mobile.changePage() 更改页面没有数据(白屏)?

javascript - html5 视频不能在 android webview 中播放,但可以在(移动)chrome 中播放

javascript - 单击事件调用未引用的函数

javascript - 从后端获取谷歌地图的数据

javascript - 具有隔离作用域的 angular.js 指令

reactjs - 有没有人有办法在通过 url 之前删除 id? react Axios

Reactjs 与 LinkedStateMixin 并使用多个选项进行选择

php - 制作视频 "watch page"

javascript - 指令到指令通信: controller empty ( ={ } )- AngularJS

javascript - 启用 CSP 时应避免哪些与 eval() 相关的函数?