@jxstjh/jhvideo
Version:
HTML5 jhvideo base on MPEG2-TS Stream Player
211 lines (197 loc) • 6.07 kB
JavaScript
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);
}