当前位置: 首页 > news >正文

React 中播放HLS 视频流 ,超简单的组件高度复用

一、封装HLS播放组件

直接上代码:

请先导入 hls.js 依赖 
封装的React组件,设置有错误捕捉无闪动继续加载画面

import React, { useEffect, useRef } from 'react';
import Hls from 'hls.js';
type HlsPlayerProps = {url?: string; // HLS m3u8 地址width?: number;height?: number;isLive?: boolean;
};const HlsPlayer: React.FC<HlsPlayerProps> = ({ url }) => {const videoRef = useRef<HTMLVideoElement>(null);const hlsRef = useRef<Hls | null>(null);const handleHlsError = (hls: Hls, data: any) => {console.error('HLS 播放错误', data);if (data.fatal) {switch (data.type) {case Hls.ErrorTypes.NETWORK_ERROR:console.warn('网络错误,尝试重新加载分片...');hls.startLoad(); // 继续加载,不 destroybreak;case Hls.ErrorTypes.MEDIA_ERROR:console.warn('媒体错误,尝试恢复...');hls.recoverMediaError(); // 恢复媒体解码break;default:console.error('不可恢复错误,停止播放');hls.destroy();break;}} else if (data.details === Hls.ErrorDetails.BUFFER_STALLED_ERROR) {console.warn('缓冲区无数据,尝试继续加载...');hls.startLoad(); // 直接恢复加载,不 destroy}};const initHls = () => {if (!url || !videoRef.current) return;if (hlsRef.current) {hlsRef.current.destroy();hlsRef.current = null;}if (Hls.isSupported()) {const hls = new Hls({});hls.loadSource(url);hls.attachMedia(videoRef.current);hls.on(Hls.Events.MANIFEST_PARSED, () => {videoRef.current?.play();});hls.on(Hls.Events.ERROR, (event, data) => handleHlsError(hls, data));hlsRef.current = hls;} else if (videoRef.current.canPlayType('application/vnd.apple.mpegurl')) {videoRef.current.src = url;videoRef.current.addEventListener('loadedmetadata', () => {videoRef.current?.play();});} else {console.error('当前环境不支持 HLS 播放');}};useEffect(() => {initHls();return () => {if (hlsRef.current) {hlsRef.current.destroy();hlsRef.current = null;}};}, [url]);// 如果没传 URL,显示加载占位if (!url) {return (<div style={{width: '100%',height: '100%',display: 'flex',justifyContent: 'center',alignItems: 'center',background: 'rgba(0,0,0,0.1)',color: '#999',fontSize: 14}}>正在加载视频...</div>);}return (<div style={{ width: '100%', height: '100%' }}><videoref={videoRef}style={{ width: '100%', height: '100%', objectFit: 'cover', }}autoPlaymutedloopplaysInline/></div>);
};export default HlsPlayer;

二、HLS组件播放使用


// 其中的videoUrl 就是HLS播放的视频流
<div style={{ width: '200ox', height: '200px' }}><HlsPlayer url={videoUrl}></HlsPlayer>
</div>

三、监控展示效果

直接播放画面

http://www.lryc.cn/news/620790.html

相关文章:

  • 2019 GPT2原文 Language Models are Unsupervised Multitask Learners - Reading Notes
  • 微美全息(WIMI.US)借区块链与聚类技术,开启物联网去中心化安全架构新纪元
  • C#WPF实战出真汁03--登录功能实现
  • 阿里云Spring Cloud架构分析
  • 无人机双目视觉设计要点概述!
  • .Net4.0 WPF中实现下拉框搜索效果
  • 4. 索引数据的增删改查
  • MyBatis Interceptor 深度解析与应用实践
  • Mybatis学习笔记(一)
  • 【密码学实战】基于SCTP的DTLS协议实验
  • springboot项目不同平台项目通过http接口AES加密传输
  • AR技术赋能电力巡检:智能化升级的“秘密武器”
  • MicroVM-as-a-Service 后端服务架构设计与实现
  • 顺序表插入删除
  • 常见的Jmeter压测问题
  • OpenCV 视频处理全解析
  • 力扣-295.数据流的中位数
  • 11、C 语言字符串函数总结
  • OpenCV 高斯模糊降噪
  • npm删除包
  • PyCharm性能优化与大型项目管理指南
  • C++:浅尝gdb
  • YouBallin正式上线:用Web3重塑创作者经济
  • 一种适用于 3D 低剂量和少视角心脏单光子发射计算机断层成像(SPECT)的可泛化扩散框架|文献速递-深度学习人工智能医疗图像
  • HTML <link rel=“preload“>:提前加载关键资源的性能优化利器
  • 【AAAI2025】计算机视觉|即插即用|FSTA:炸裂!这个即插即用模块,让你的SNN性能起飞!
  • DeepSeek补全IBM MQ 9.4 REST API 执行命令的PPT
  • 爬虫数据存储全攻略:从 Robots 协议到文件存储
  • 【深度学习新浪潮】VGGT待提升点分析及解决方案的思考
  • 基于大语言模型的爬虫数据清洗与结构化