64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
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 };
|