react封装hls视频播放组件

react封装hls视频播放组件

基于hls.js封装的,需要安装依赖 yarn add hls.js || npm install --save hls.js

react封装的HlsPlayer组件:

import { useEffect, useRef } from 'react';
import Hls from 'hls.js';
import styles from './styles.less'

/**
 * @description: hls视频播放组件
 * @param {*} url:视频地址
 * @param {*} autoPlay:是否自动播放,默认false
 * @param {*} errorFn: 视频播放失败返回函数,返回失败信息
 * @return {*}
 */
const HlsPlayer = ({ url, autoPlay = false, errorFn }) => {
  const HlsDOM = useRef();

  useEffect(() => {
    const hls = new Hls();
    hls.loadSource(url);
    hls.attachMedia(HlsDOM.current);

    // 当HLS流的媒体清单被成功解析时
    hls.on(Hls.Events.MANIFEST_PARSED, () => {
      // 加载媒体清单文件
      hls.startLoad();
    });

    hls.on(Hls.Events.ERROR, (error) => {
      console.error('HLS流播放出错:', error);
      if (errorFn) errorFn(error)
    });

    return () => {
      // 销毁
      if (hls) {
        HlsDOM.current?.pause();
        hls.destroy();
      }
    }
  }, [url]);

  return (
    <div className={styles.normal}>
      <video
        className={styles.videoBox}
        ref={HlsDOM}
        autoPlay={autoPlay}
        controls
        muted={autoPlay}
      />
    </div>
  );
}

export default HlsPlayer

HlsPlayer组件样式:

.normal {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
  background: #000;
  transform-origin: 0 0;

  .videoBox {
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
}

HlsPlayer组件引用方式:

import HlsPlayer from '@/HlsPlayer'; // 组件存放地址
<HlsPlayer
  url='https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8' // 视频地址
  autoPlay={false} // 是否自动播放,默认false
  errorFn={(err)=>{console.log(err);}} // 视频播放失败返回函数
/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React 中,组件之间的通信可以通过 props 和事件来实现。如果需要封装两个相互调用的组件,可以将它们的状态和事件都抽离出来,放在一个共同的父组件中。 下面是一个简单的示例: ```jsx import React from 'react'; class ChildA extends React.Component { render() { return ( <div> <h1>Child A</h1> <button onClick={this.props.handleChildAClick}>Click me to update Child B</button> </div> ); } } class ChildB extends React.Component { render() { return ( <div> <h1>Child B</h1> <p>{this.props.message}</p> </div> ); } } class Parent extends React.Component { constructor(props) { super(props); this.state = { message: 'Initial message' }; this.handleChildAClick = this.handleChildAClick.bind(this); } handleChildAClick() { this.setState({ message: 'Updated message from Parent' }); } render() { return ( <div> <ChildA handleChildAClick={this.handleChildAClick} /> <ChildB message={this.state.message} /> </div> ); } } export default Parent; ``` 在这个示例中,ChildA 组件中有一个按钮,当用户点击后会触发 handleChildAClick 事件,这个事件在 Parent 组件中定义。当事件触发后,Parent 组件的状态会更新,然后传递给 ChildB 组件,ChildB 组件会根据新的状态来进行渲染。 使用这个组件时,只需要渲染 Parent 组件即可: ```jsx import React from 'react'; import Parent from './Parent'; function App() { return ( <Parent /> ); } export default App; ``` 这个示例中,ChildA 和 ChildB 组件是相互独立的,它们并不知道对方的存在。它们只是通过共同的父组件来进行通信。这样的设计可以使组件之间的耦合度更低,更容易维护和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值