UNPKG

@jxstjh/jhvideo

Version:

HTML5 jhvideo base on MPEG2-TS Stream Player

211 lines (197 loc) 6.07 kB
import { Decoder, tools, Reader } from './EBML.js' // Generate four random hex digits. function S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1) }; // Generate a pseudo-GUID by concatenating random hexadecimal. export const guid = () => { return (S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4()) } // 开启横屏 function setOrientation(){ if ("orientation" in screen) { screen.orientation.lock("landscape-primary"); } } // 关闭横屏 function unsetOrientation() { if ("orientation" in screen) { screen.orientation.lock("portrait-primary"); } } // 全屏工具方法 export const openFullscreen = (element, isMobile) => { if (element.requestFullscreen) { element.requestFullscreen(); isMobile && setOrientation(); return; } else if (element.mozRequestFullScreen) { element.mozRequestFullScreen(); isMobile && setOrientation(); return } else if (element.msRequestFullscreen) { element.msRequestFullscreen(); isMobile && setOrientation(); return } else if (element.webkitRequestFullscreen) { element.webkitRequestFullScreen(); isMobile && setOrientation(); return } } //退出全屏方法 export const exitFullScreen = (isMobile) => { if (document.exitFullscreen) { document.exitFullscreen(); isMobile && unsetOrientation(); return } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); isMobile && unsetOrientation(); return } else if (document.msExitFullscreen) { document.msExiFullscreen(); isMobile && unsetOrientation(); return } else if (document.webkitCancelFullScreen) { document.webkitCancelFullScreen(); isMobile && unsetOrientation(); return } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); isMobile && unsetOrientation(); return } } export const filterAisleIdChart = (aisleId) => { const arr = aisleId.split('#') if (arr.length > 1) { return arr[0] } else { return aisleId } } export const replaceStreamNO = (channel, streamNo) => { streamNo = Number(streamNo) channel = String(channel) const reg = new RegExp('#[0-9]') const metched = reg.test(channel) if (metched) { return channel.replace(reg, `#${streamNo}`) } else { return channel + `#${streamNo}` } } // 获取当前格式化时间字符串 export const getNowDate = () => { let date = new Date() let Y = date.getFullYear() let M = date.getMonth() + 1 let D = date.getDate() M = M < 10 ? `0${M}` : M D = D < 10 ? `0${D}` : D const H = date.getHours() const m = date.getMinutes() const s = date.getSeconds() return `${Y}${M}${D}${H}${m}${s}` } // 获取当前格式化时间字符串 export const getDateStrBySize = (data, size) => { let date = new Date(data) let Y = date.getFullYear() let M = date.getMonth() + 1 let D = date.getDate() M = M < 10 ? `0${M}` : M D = D < 10 ? `0${D}` : D let H = date.getHours() let m = date.getMinutes() let s = date.getSeconds() H = H < 10 ? `0${H}` : H m = m < 10 ? `0${m}` : m s = s < 10 ? `0${s}` : s switch (size) { case 'xs': return `${H}:${m}` case 'sm': return `${H}:${m}` case 'md': return `${M}-${D} ${H}:${m}` case 'lg': return `${Y}-${M}-${D} ${H}:${m}` default: } } export const formatStrDate = (data) => { const d = new Date(data) let Y = d.getFullYear() let M = d.getMonth() + 1 let D = d.getDate() M = M < 10 ? `0${M}` : M D = D < 10 ? `0${D}` : D let H = d.getHours() let m = d.getMinutes() let s = d.getSeconds() H = H < 10 ? `0${H}` : H m = m < 10 ? `0${m}` : m s = s < 10 ? `0${s}` : s return `${Y}-${M}-${D} ${H}:${m}:${s}.000` } // 时间轴循环方法 export const throttle = (func, wait = 16, opts = { noStart: false, noEnd: false }) => { let context, args, result; let timeout = null; let previous = 0; const later = function () { previous = opts.noStart ? 0 : +new Date(); timeout = null; result = func.apply(context, args); if (!timeout) { context = args = null; } }; return function () { const now = +new Date(); if (!previous && opts.noStart) { previous = now; } const remaining = wait - (now - previous); context = this; args = arguments; if (remaining <= 0 || remaining > wait) { clearTimeout(timeout); timeout = null; previous = now; result = func.apply(context, args); if (!timeout) { context = args = null; } } else if (!timeout && !opts.noEnd) { timeout = setTimeout(later, remaining); } return result; } } export function getSeekableBlob(inputBlob, mimeType, callback) { const reader = new Reader(); const decoder = new Decoder(); const tool = tools; const fileReader = new FileReader(); fileReader.onload = function (e) { const ebmlElms = decoder.decode(this.result) ebmlElms.forEach(function (element) { reader.read(element) }) reader.stop() const refinedMetadataBuf = tool.makeMetadataSeekable( reader.metadatas, reader.duration, reader.cues ) const body = this.result.slice(reader.metadataSize) const newBlob = new Blob([refinedMetadataBuf, body], { type: mimeType }) callback(newBlob) } fileReader.readAsArrayBuffer(inputBlob); }