React 基于antd+video.js实现m3u8格式视频播放及实时切换

文档连接地址(官网看起麻烦,看中文别人整理好的)https://blog.csdn.net/a0405221/article/details/80923090

React项目使用 

安装依赖

npm install --save video.js

引入

 import ‘video.js/dist/video-js.min.css‘

 import videojs from ‘video.js‘

index.js (自己注释掉的可以不用)

import React from ‘react‘
import {
  Modal,
  Form,
  Col,
  Row,
  Input,
  Button,
  Card,
  Select,
  Table,
  message
} from ‘antd‘
import PropTypes from ‘prop-types‘
import styles from ‘./style.less‘
// import { arrayToTree } from ‘utils‘
import { connect } from ‘dva‘
// import { request } from ‘utils‘
import ‘video.js/dist/video-js.min.css‘
import videojs from ‘video.js‘
// const columnsOrg = [
//   {
//     title: ‘名称‘,
//     dataIndex: ‘nodeName‘,
//     key: ‘id‘
//   }
// ]
// const FormItem = Form.Item
// const { Option } = Select
// const { TextArea } = Input
// const formItemLayout = {
//   labelCol: {
//     xs: { span: 6 },
//     sm: { span: 6 }
//   },
//   wrapperCol: {
//     xs: { span: 18 },
//     sm: { span: 18 }
//   }
// }
class TaskScheduling extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      // data: {},
      // fileList: [],
      // id: null,
      url: ‘‘
    }
  }
  componentDidMount(url, bool) {
    const { location } = this.props
    this.getEvent(location.state.id)
    var myVideo = videojs(‘myVideo‘, {
      bigPlayButton: true,
      textTrackDisplay: false,
      posterImage: false,
      errorDisplay: false
    })
    myVideo.play()
    if (url) {
      this.setState({
        url
      })
      if (/\.m3u8$/.test(url)) { //判断视频地址格式
        myVideo.src({
          src: url,
          type: ‘application/x-mpegURL‘
        })
      } else {
        myVideo.src(url)
      }
      myVideo.load() //重载
      myVideo.play()//播放
    }
    if (bool === false) {
      myVideo.pause() //暂停
      // myVideo.dispose() //销毁
    }
  }
  componentWillUnmount() {
    if (this.player) {
      this.player.dispose()
    }
  }
  // handleSubmit = () => {
  //   const { form } = this.props
  //   form.validateFields((err, formValue) => {
  //     if (err) {
  //       return
  //     }
  //     const { taskScheduling } = this.props
  //     const { postType } = taskScheduling
  //     const { data } = this.state
  //     if (postType) {
  //       this.props.dispatch({
  //         //提交
  //         type: ‘taskScheduling/eventPost‘,
  //         payload: {
  //           ...formValue,
  //           id: data.id,
  //           taskId: data.taskId,
  //           procInstId: data.procInstId,
  //           taskKey: data.taskKey,
  //           userId: data.userId
  //         }
  //       })
  //     } else {
  //       this.props.dispatch({
  //         //归档
  //         type: ‘taskScheduling/processingFiling‘,
  //         payload: {
  //           ...formValue,
  //           id: data.id,
  //           taskId: data.taskId,
  //           procInstId: data.procInstId,
  //           taskuser: ‘‘,
  //           taskKey: data.taskKey,
  //           userId: data.userId
  //         }
  //       })
  //     }
  //   })
  // }
  // 关闭
  // hideModal() {
  //   this.props.dispatch({
  //     type: ‘taskScheduling/taskSchedulingUpdate‘,
  //     payload: {
  //       visible: false,
  //       formVisible: false,
  //       postType: false,
  //       taskSchedulingData: []
  //     }
  //   })
  // }
  // showModal(item) {
  //   this.props.dispatch({
  //     type: ‘taskScheduling/taskSchedulingUpdate‘,
  //     payload: {
  //       ...item
  //     }
  //   })
  //   if (item.postType) {
  //     this.props.dispatch({
  //       type: ‘taskScheduling/getUsers‘,
  //       payload: {
  //         id: Number(this.state.id)
  //       }
  //     })
  //   }
  //   if (item.visible === false) {
  //     this.componentDidMount(‘‘, item.visible)
  //   }
  // }

  // getEvent = async _id => {
  //   let data = {
  //     id: _id
  //   }
  //   const res = await request(‘/activiti/api/sgEvent/getSgEvent‘, {
  //     data
  //   })
  //   if (res.success) {
  //     this.setState({
  //       data: res.data || {},
  //       fileList: res.data.fileList,
  //       id: res.data.id
  //     })
  //   }
  // }

  render() {
    const { form, taskScheduling } = this.props
    const { data, fileList, url } = this.state
    const {
      visible,
      // formVisible,
      // postType,
      // userData,
      // taskSchedulingData
    } = taskScheduling
    // const { getFieldDecorator } = form
    // let dataTree = arrayToTree(taskSchedulingData, ‘id‘, ‘parentId‘)
    return (
      <Row className="custom-style">
        {/* <Col span={8}>
          <Card
            extra={
              <Button
                type="primary"
                onClick={() => this.showModal({ visible: true })}
              >
                视频调看
              </Button>
            }
          >
            <Form>
              <Row>
                <Col span={20}>
                  <FormItem label="工单编号" {...formItemLayout}>
                    {getFieldDecorator(‘eventCode‘, {
                      initialValue: data.eventCode
                    })(<Input disabled />)}
                  </FormItem>
                </Col>
                <Col span={20}>
                  <FormItem label="网格名称" {...formItemLayout}>
                    {getFieldDecorator(‘gridName‘, {
                      initialValue: data.gridName
                    })(<Input disabled />)}
                  </FormItem>
                </Col>
                <Col span={20}>
                  <FormItem label="事件地址" {...formItemLayout}>
                    {getFieldDecorator(‘address‘, {
                      initialValue: data.address
                    })(<Input disabled />)}
                  </FormItem>
                </Col>
                <Col span={20}>
                  <FormItem label="事件内容" {...formItemLayout}>
                    {getFieldDecorator(‘eventDesc‘, {
                      initialValue: data.eventDesc
                    })(<TextArea disabled />)}
                  </FormItem>
                </Col>
                <Col span={20}>
                  <FormItem label="照片" {...formItemLayout}>
                    {getFieldDecorator(‘code‘, {})(
                      <div className={styles.formImg}>
                        {fileList.map((_item, index) => {
                          return (
                            <img
                              key={index}
                              src={`http://10.0.202.47/static${_item}`}
                              alt="事件图像"
                            />
                          )
                        })}
                      </div>
                    )}
                  </FormItem>
                </Col>
              </Row>
              <Row className={styles.buttonPosition}>
                <Button
                  type="primary"
                  onClick={() => this.showModal({ formVisible: true })}
                >
                  处理并归档
                </Button>
                <Button
                  type="primary"
                  onClick={() =>
                    this.showModal({ formVisible: true, postType: true })
                  }
                >
                  提交
                </Button>
              </Row>
            </Form>
          </Card>
        </Col> */}
        <Col span={15} offset={1}>
          <Card
            title={<span>视频调度</span>}
            style={{
              visibility: visible ? ‘visible‘ : ‘hidden‘
            }}
          >
            <div className={styles.video}>
              {/* <Table
                style={{
                  width: 260
                }}
                rowKey="id"
                className="table-tree"
                pagination={false}
                columns={columnsOrg}
                dataSource={dataTree}
                onRow={record => {
                  return {
                    onClick: () => {
                      let id = record.id.split(‘-‘)
                      if (record.nodeType === ‘6‘) {
                        this.props
                          .dispatch({
                            type: ‘taskScheduling/queryEquipment‘,
                            payload: {
                              id: Number(id.slice(-1))
                            }
                          })
                          .then(res => {
                            this.componentDidMount(res.data.url)
                          })
                      } else {
                        message.info(‘只能选择设备查看‘)
                      }
                    }
                  }
                }}
              /> */}
              <div
                style={{
                  minWidth: 700
                }}
              >
                <video
                  id="myVideo"
                  class="video-js vjs-default-skin vjs-big-play-centered"
                  controls
                  preload="auto"
                  data-setup="{}"
                  style={{
                    width: ‘40vw‘,
                    height: 500
                  }}
                >
                  <source id="source" src={url} type="application/x-mpegURL" />
                </video>
              </div>
            </div>
            <Row>
              <Button
                style={{
                  float: ‘right‘,
                  margin: 10
                }}
                type="primary"
                onClick={() => {
                  this.showModal({ visible: false })
                }}
              >
                关闭
              </Button>
            </Row>
          </Card>
        </Col>
        {/* <Modal
          title="事件处理"
          visible={formVisible}
          onOk={this.handleSubmit}
          onCancel={() => this.hideModal()}
        >
          <Form>
            {postType && (
              <FormItem label="处理人" {...formItemLayout}>
                {getFieldDecorator(‘taskuser‘, {})(
                  <Select>
                    {userData.map((item, index) => {
                      return (
                        <Option key={index} value={item.id}>
                          {item.userName}
                        </Option>
                      )
                    })}
                  </Select>
                )}
              </FormItem>
            )}
            <FormItem label="处理意见" {...formItemLayout}>
              {getFieldDecorator(‘comment‘, {})(<TextArea />)}
            </FormItem>
          </Form>
        </Modal> */}
      </Row>
    )
  }
}
TaskScheduling.propTypes = {
  form: PropTypes.object,
  dispatch: PropTypes.func,
  taskSchedulingData: PropTypes.object
}

export default connect(({ taskScheduling }) => ({
  taskScheduling
}))(Form.create()(TaskScheduling))

原文地址:https://www.cnblogs.com/gcm123/p/11320160.html

时间: 2024-10-14 00:33:26

React 基于antd+video.js实现m3u8格式视频播放及实时切换的相关文章

React video.js实现m3u8格式视频播放及实时切换

先安装: npm install --save video.js 导入 import videojs from 'video.js' import "video.js/dist/video-js.css"; constructor(props) { super(props); this.state = { current_url : '/001.m3u8', } this.player= null } componentDidMount   方法下 this.player = vide

video.js支持m3u8格式直播

为什么要使用video.js? 1. PC端浏览器并不支持video直接播放m3u8格式的视频 2. 手机端各式各样的浏览器定制的video界面风格不统一,直接写原生的js控制视频兼容性较差 3. video.js解决以上两个问题,还可以有各种视频状态接口暴露,优化体验 核心代码: <!DOCTYPE html> <html> <head> <title>videojs支持hls直播实例</title> <link href=".

解决问题video.js 播放m3u8格式的文件,根据官方的文档添加videojs-contrib-hls也不行的原因解决了

想播放hls协议的就是m3u8文件,video.js原生不支持,官方有个插件videojs-contrib-hls 直接进入即可: <script src="__PUBLIC__/lib/video-js/videojs-contrib-hls.min.js"></script> 今天纠结了一天,调试到最后发现原来是跨域的问题: 如果使用阿里云OSS存储的话(别的服务器设置头部可访问即可),在跨域设置中做如下设置即可: 跨域问题:https://help.ali

html页面引用video.js播放m3u8格式视频

//head里面的内容,我是采用cdn引用的方式,因为项目太小 //只粘贴了不分代码,都是主要的,只要视频没问题,如果不能播放,建议换一个视频源,代码绝对没问题 都可以播放,下面video样式那里,一共三层, <head> <meta charset="utf-8" /> <title>二级造价</title> <script src="https://cdn.bootcss.com/vue/2.5.20/vue.min.

vue使用video.js解决m3u8视频播放格式

今天被这个关于m3u8视频播放不了搞了一下午,这个项目所有的视频流都是m3u8格式的,后台给我们返回的都是m3u8格式的视频流,解决了好长时间,看了好多博客,只有这个博客给我点启发,去解决这个问题,请查看.会使用两种方法来解决这个问题 第一种方法 1.在vue中安装下面这些插件 1 2 cnpm install  video.js --save ccnp  install videojs-contrib-hls --save 网上有说video.js版本太高不能使用,不能使用7以上的版本,用5版

vue.js+video.js+videojs-contrib-hls支持PC端播放m3u8格式的视频

最近项目中PC需要支持m3u8格式的视频播放 项目框架是vue.js 参考网上教程npm video.js 和  videojs-contrib-hls 项目本地测试OK 打包上线插件内报错 所以最后不得了当外部js 引入 才解决 同时需要引入video.js.css样式 classl类名改为 如图 video.js初始化写在mounted内 如此可以正常的播放m3u8格式的视频了 原文地址:https://www.cnblogs.com/xk-one/p/9243323.html

直播视频和m3u8格式、flv格式

插件: 1.video.js videojs-flash.js 可以播放rtmp直播流 2. hls.js 在html页面上可以播放m3u8格式的视频,但在react node项目上不行. 3.尝试用videojs-contrib-hls和@videojs/http-streaming失败. 4.尝试用ReactPlayer,应该可以,还未进行~ 原文地址:https://www.cnblogs.com/byayn/p/11179219.html

html5 video.js 使用及兼容所有浏览器

http://www.itnose.net/detail/6076396.html 一.准备材料 video.js下载: http://www.videojs.com/ 二.代码 引入相关文件: 贴入html代码: <video id="example_video_1" class="video-js" width="640" height="410" controls="controls" auto

vue播放rtmp、hls m3u8格式视频

选用Video.js作为视频播放库,如果要支持hls m3u8还需要videojs-contrib-hls组件的支持. 安装Video.js npm install --save video.js 安装videojs-contrib-hls npm install --save videojs-contrib-hls 创建一个vue的播放组件 src/components/VideoPlayer/index.vue <template> <div> <video ref=&q