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

Posted gcm123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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))

 

 

以上是关于React 基于antd+video.js实现m3u8格式视频播放及实时切换的主要内容,如果未能解决你的问题,请参考以下文章

H5播放m3u8 - <video><source src=“xx.m3u8“/></video> - 使用video.js+HLS插件

如何使用 video.js 在 m3u8 中选择频道

video.js支持m3u8格式直播

播放 video.js ustream m3u8 文件流

使用 Video JS 播放 M3U8 或 TS 直播

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