| import { useEffect, useRef } from 'react'; | |
| import Hls from 'hls.js'; | |
| interface HLSVideoProps { | |
| src: string; | |
| className?: string; | |
| } | |
| export default function HLSVideo({ src, className = '' }: HLSVideoProps) { | |
| const videoRef = useRef<HTMLVideoElement>(null); | |
| useEffect(() => { | |
| const video = videoRef.current; | |
| if (!video) return; | |
| if (Hls.isSupported()) { | |
| const hls = new Hls({ | |
| enableWorker: true, | |
| lowLatencyMode: false, | |
| }); | |
| hls.loadSource(src); | |
| hls.attachMedia(video); | |
| hls.on(Hls.Events.MANIFEST_PARSED, () => { | |
| video.play().catch(() => {}); | |
| }); | |
| return () => hls.destroy(); | |
| } else if (video.canPlayType('application/vnd.apple.mpegurl')) { | |
| video.src = src; | |
| video.addEventListener('loadedmetadata', () => { | |
| video.play().catch(() => {}); | |
| }); | |
| } | |
| }, [src]); | |
| return ( | |
| <video | |
| ref={videoRef} | |
| className={className} | |
| autoPlay | |
| loop | |
| muted | |
| playsInline | |
| /> | |
| ); | |
| } | |