import Hls from 'hls.js'; let hlsInstance: Hls | null = null; export const initHls = (monitorVideoUrl, monitorVideoRef) => { const url = monitorVideoUrl.value; const video = monitorVideoRef.value; if (!url || !video) return; // 销毁已有实例 if (hlsInstance) { try { hlsInstance.destroy(); } catch (e) { // ignore } hlsInstance = null; } if (Hls.isSupported()) { const hls = new Hls(); hls.loadSource(url); hls.attachMedia(video); hls.on(Hls.Events.MANIFEST_PARSED, () => { // 自动播放(若浏览器允许) try { video.play().catch(() => {}); } catch (e) {} }); hlsInstance = hls; } else if (video.canPlayType('application/vnd.apple.mpegurl')) { // Safari/原生支持 HLS video.src = url; video.addEventListener('loadedmetadata', () => { try { video.play().catch(() => {}); } catch (e) {} }); } else { //proxy?.$modal.msgWarning('当前浏览器不支持 HLS 播放'); ElMessage.error('当前浏览器不支持 HLS 播放'); } }; export const destroyHls = (monitorVideoRef) => { try { if (hlsInstance) { hlsInstance.destroy(); hlsInstance = null; } } catch (e) {} const video = monitorVideoRef.value; if (video) { // 清理原生 src,避免残留 try { video.pause(); video.removeAttribute('src'); // 对某些浏览器,需要调用 load() 来重置 media element if (typeof video.load === 'function') video.load(); } catch (e) {} } }; export default { initHls, destroyHls };