Socket
Socket
Sign inDemoInstall

bonc-htmlplayer

Package Overview
Dependencies
Maintainers
5
Versions
70
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

bonc-htmlplayer - npm Package Compare versions

Comparing version 1.0.41 to 5.0.0

dist/h265Page/libffmpeg_264_265(1).js

2

package.json
{
"name": "bonc-htmlplayer",
"version": "1.0.41",
"version": "5.0.0",
"description": "东方国信的html播放器内核",

@@ -5,0 +5,0 @@ "main": "./dist/BoncH5Player.js",

// import './libffmpeg_264_265.js';
import WebGLPlayer from './webgl';
import localRecorder from '../util/webmdownload/webmdownload';
import WebGLPlayer from "./webgl";
import localRecorder from "../util/webmdownload/webmdownload";
// import AudioPlayer from './audioplayer/audioplayer';
import AudioPlayer from './audio';
import ByteArray from '../util/ByteArray';
import AudioPlayer from "./audio";
import ByteArray from "../util/ByteArray";
class H265CanvasPlayer {
constructor(app, option) {
this.app = app;
this.pts = 0;
this.canvasId = option.canvasId;
this.audioId = option.audioId;
this.app.node = document.getElementById(this.canvasId);
var audioNode = document.getElementById(this.audioId);
this.recoder = new localRecorder(app);
this.bufferArray = []
this.info = {
_timeStempAudio: 0,
audioseg: 0
};
this.isStart = false
this.modulestart = null;
this.initialized = false
this.naltypeObj = {}
this.worker = new Worker("./h265Page/libffmpeg_264_265.js");
if (audioNode) {
this.nalsbonAudioarr = new Proxy(this.bufferArray, {
get(target, property) {
return target[property]
},
set(target, property, value) {
target[property] = value;
loadNextBuffer()
return true;
}
}); // 音频数据队列
// 对 this.nalsbonAudioarr 的push方法做监听
constructor(app, option) {
this.app = app;
this.pts = 0;
this.canvasId = option.canvasId;
this.audioId = option.audioId;
this.app.node = document.getElementById(this.canvasId);
var audioNode = document.getElementById(this.audioId);
this.recoder = new localRecorder(app);
this.bufferArray = [];
this.info = {
_timeStempAudio: 0,
audioseg: 0,
};
this.isStart = false;
this.modulestart = null;
this.initialized = false;
this.naltypeObj = {};
if (audioNode) {
this.nalsbonAudioarr = new Proxy(this.bufferArray, {
get(target, property) {
return target[property];
},
set(target, property, value) {
target[property] = value;
loadNextBuffer();
return true;
},
}); // 音频数据队列
// 对 this.nalsbonAudioarr 的push方法做监听
this.audioPlayer = new AudioPlayer({
audioNode,
nalsbonAudioarr: this.bufferArray,
info: this.info
});
var loadNextBuffer = this.audioPlayer.loadNextBuffer
this.audioPlayer = new AudioPlayer({
audioNode,
nalsbonAudioarr: this.bufferArray,
info: this.info,
});
var loadNextBuffer = this.audioPlayer.loadNextBuffer;
}
// import('./libffmpeg_264_265.js').then(res=>{})
self.Module = {
locateFile: function (wasm) {
return wasm;
},
};
// console.log("加载libffmpeg_264_265.js");
var scriptNode = document.createElement("script");
// wuyage edit 之前路径是./libffmpeg_264_265.js
scriptNode.src = "./h265Page/libffmpeg_264_265.js";
document.querySelector("body").appendChild(scriptNode);
// Module.onRuntimeInitialized = () => {
setTimeout(() => {
// console.log("进setTimeout");
var _this = this;
this.videoCallback = Module.addFunction(function (
addr_y,
addr_u,
addr_v,
stride_y,
stride_u,
stride_v,
width,
height,
pts,
id
) {
let size =
width * height +
(width / 2) * (height / 2) +
(width / 2) * (height / 2);
let data = new Uint8Array(size);
let pos = 0;
for (let i = 0; i < height; i++) {
let src = addr_y + i * stride_y;
let tmp = Module.HEAPU8.subarray(src, src + width);
tmp = new Uint8Array(tmp);
data.set(tmp, pos);
pos += tmp.length;
}
// import('./libffmpeg_264_265.js').then(res=>{})
self.Module = {
locateFile: function (wasm) {
return wasm;
}
for (let i = 0; i < height / 2; i++) {
let src = addr_u + i * stride_u;
let tmp = Module.HEAPU8.subarray(src, src + width / 2);
tmp = new Uint8Array(tmp);
data.set(tmp, pos);
pos += tmp.length;
}
var scriptNode = document.createElement('script');
// wuyage edit 之前路径是./libffmpeg_264_265.js
scriptNode.src = './h265Page/libffmpeg_264_265.js'
document.querySelector('body').appendChild(scriptNode)
for (let i = 0; i < height / 2; i++) {
let src = addr_v + i * stride_v;
let tmp = Module.HEAPU8.subarray(src, src + width / 2);
tmp = new Uint8Array(tmp);
data.set(tmp, pos);
pos += tmp.length;
}
var obj = {
data: data,
width,
height,
};
// 处理音频
if (!_this.isStart) {
_this.isStart = true;
_this.app.dispatch("startSuccess");
}
// 调用webgl对解码后的数据进行渲染,本方法对webgl二次封装
// let dataTeime=new Date().getTime();
_this.displayVideoFrame(obj);
// let jiange=new Date().getTime()-dataTeime;
// console.log('渲染时间:'+jiange+'\n' )
},
"v");
// Module.onRuntimeInitialized = () => {
setTimeout(()=>{
var _this = this;
this.videoCallback = Module.addFunction(function (addr_y, addr_u, addr_v, stride_y, stride_u, stride_v, width, height, pts, id) {
let size = width * height + (width / 2) * (height / 2) + (width / 2) * (height / 2)
let data = new Uint8Array(size)
let pos = 0
for (let i = 0; i < height; i++) {
let src = addr_y + i * stride_y
let tmp = Module.HEAPU8.subarray(src, src + width)
tmp = new Uint8Array(tmp)
data.set(tmp, pos)
pos += tmp.length
}
for (let i = 0; i < height / 2; i++) {
let src = addr_u + i * stride_u
let tmp = Module.HEAPU8.subarray(src, src + width / 2)
tmp = new Uint8Array(tmp)
data.set(tmp, pos)
pos += tmp.length
}
for (let i = 0; i < height / 2; i++) {
let src = addr_v + i * stride_v
let tmp = Module.HEAPU8.subarray(src, src + width / 2)
tmp = new Uint8Array(tmp)
data.set(tmp, pos)
pos += tmp.length
}
var obj = {
data: data,
width,
height
}
// 处理音频
if (!_this.isStart) {
_this.isStart = true;
_this.app.dispatch('startSuccess')
}
// 调用webgl对解码后的数据进行渲染,本方法对webgl二次封装
// let dataTeime=new Date().getTime();
_this.displayVideoFrame(obj);
// let jiange=new Date().getTime()-dataTeime;
// console.log('渲染时间:'+jiange+'\n' )
})
this.modulestart = Module._openDecoder(1, this.videoCallback, 0);
this.modulestart = Module._openDecoder(1, this.videoCallback, 0);
this.modulestart = Module._openDecoder(1, this.videoCallback, 0);
// }
}, 2000);
}
// }
},2000)
handleAudio() {
this.audioPlayer.loadNextBuffer(this.bufferArray);
}
playBuffer(videoBuffer) {
// debugger
// console.log("this.modulestart:" + this.modulestart);
//当this.modulestart=0时,解码器初始化成功
if (this.modulestart !== 0) {
// console.log("this.modulestart:"+this.modulestart)
return;
}
handleAudio() {
this.audioPlayer.loadNextBuffer(this.bufferArray)
}
playBuffer(videoBuffer) {
// debugger
if (this.modulestart !== 0) {
// console.log("this.modulestart:"+this.modulestart)
return
}
// console.log(videoBuffer)
// var typedArray = new Uint8Array(videoBuffer);
var h265Buffer = new ByteArray(videoBuffer)
h265Buffer.offset += 4
var nalu = h265Buffer.ReadUint16()
// F位
var F = nalu >> 15
// console.log('F', F)
// naltype
var naltype = (nalu >> 9) & 127
// console.log('naltype', naltype)
/**
// console.log(videoBuffer)
// var typedArray = new Uint8Array(videoBuffer);
var h265Buffer = new ByteArray(videoBuffer);
h265Buffer.offset += 4;
var nalu = h265Buffer.ReadUint16();
// F位
var F = nalu >> 15;
// console.log('F', F)
// naltype
var naltype = (nalu >> 9) & 127;
// console.log('naltype', naltype)
/**
1 NAL_UNIT_CODED_SLICE_TRAIL_R

@@ -138,96 +156,101 @@ 19 NAL_UNIT_CODED_SLICE_IDR

*/
// 如果已经初始化并且是关键帧或非关键帧
if (this.initialized && (naltype == 1 || naltype == 19)) {
try {
var typedArray = new Uint8Array(videoBuffer);
var size = typedArray.length;
var cacheBuffer = Module._malloc(size);
Module.HEAPU8.set(typedArray, cacheBuffer);
// let dataTeime=new Date().getTime();
var ret = Module._decodeData(cacheBuffer, size, this.pts++, 1);
// let jiange=new Date().getTime()-dataTeime;
// console.log('视频解码_decodeData耗时:'+jiange+'\n' )
} catch(e) {
console.log(e)
}
if (cacheBuffer != null) {
Module._free(cacheBuffer);
cacheBuffer = null;
}
} else if (naltype !== 1 && naltype != 19) {
// 如果没有初始化 并且不是关键帧或非关键帧
if (!this.naltypeObj[naltype]) {
this.naltypeObj[naltype] = true
try {
var typedArray = new Uint8Array(videoBuffer);
var size = typedArray.length;
var cacheBuffer = Module._malloc(size);
Module.HEAPU8.set(typedArray, cacheBuffer);
var ret = Module._decodeData(cacheBuffer, size, this.pts++, 1);
} catch (e){
console.log(e)
}
if (cacheBuffer != null) {
Module._free(cacheBuffer);
cacheBuffer = null;
}
}
if (Object.keys(this.naltypeObj).length == 4) {
this.initialized = true
}
// 如果已经初始化并且是关键帧或非关键帧 1:p帧,19:I帧
if (this.initialized && (naltype == 1 || naltype == 19)) {
try {
var typedArray = new Uint8Array(videoBuffer);
var size = typedArray.length;
var cacheBuffer = Module._malloc(size);
Module.HEAPU8.set(typedArray, cacheBuffer);
// let dataTeime=new Date().getTime();
// console.log("视频解码_decodeData");
// console.log("_decodeData已经初始化的Size值:" + size);
var ret = Module._decodeData(cacheBuffer, size, this.pts++, 1);
// console.log("_decodeData已经初始化解码后返回值:" + ret);
// let jiange=new Date().getTime()-dataTeime;
// console.log('视频解码_decodeData耗时:'+jiange+'\n' )
} catch (e) {
console.log(e);
}
if (cacheBuffer != null) {
Module._free(cacheBuffer);
cacheBuffer = null;
}
} else if (naltype !== 1 && naltype != 19) {
// 如果没有初始化 并且不是关键帧或非关键帧
if (!this.naltypeObj[naltype]) {
this.naltypeObj[naltype] = true;
try {
var typedArray = new Uint8Array(videoBuffer);
var size = typedArray.length;
var cacheBuffer = Module._malloc(size);
Module.HEAPU8.set(typedArray, cacheBuffer);
// console.log("_decodeData没有初始化的Size值:" + size);
var ret = Module._decodeData(cacheBuffer, size, this.pts++, 1);
// console.log("_decodeData没有初始化解码后返回值:" + ret);
} catch (e) {
console.log(e);
}
// console.log(nalu)
// debugger
// var size = typedArray.length;
// var cacheBuffer = Module._malloc(size);
// Module.HEAPU8.set(typedArray, cacheBuffer);
// // console.time('decode')
// if(size < CHUNK_SIZE) {
// console.log('Flush frame data')
// Module._flushDecoder();
// Module._closeDecoder();
// }
if (cacheBuffer != null) {
Module._free(cacheBuffer);
cacheBuffer = null;
}
}
if (Object.keys(this.naltypeObj).length == 4) {
this.initialized = true;
}
}
// console.log(nalu)
// debugger
// var size = typedArray.length;
// var cacheBuffer = Module._malloc(size);
// Module.HEAPU8.set(typedArray, cacheBuffer);
// // console.time('decode')
displayVideoFrame(obj) {
var data = new Uint8Array(obj.data);
var width = obj.width;
var height = obj.height;
var yLength = width * height;
var uvLength = (width / 2) * (height / 2);
if (!this.webglPlayer) {
const canvasId = this.canvasId;
var canvas = document.getElementById(canvasId);
this.webglPlayer = new WebGLPlayer(canvas, {
preserveDrawingBuffer: true
});
}
this.webglPlayer.renderFrame(data, width, height, yLength, uvLength);
// if(size < CHUNK_SIZE) {
// console.log('Flush frame data')
// Module._flushDecoder();
// Module._closeDecoder();
// }
}
displayVideoFrame(obj) {
var data = new Uint8Array(obj.data);
var width = obj.width;
var height = obj.height;
var yLength = width * height;
var uvLength = (width / 2) * (height / 2);
if (!this.webglPlayer) {
const canvasId = this.canvasId;
var canvas = document.getElementById(canvasId);
this.webglPlayer = new WebGLPlayer(canvas, {
preserveDrawingBuffer: true,
});
}
this.webglPlayer.renderFrame(data, width, height, yLength, uvLength);
}
localRecord(name) {
this.recoder.startRecord(name)
}
finishRecord() {
this.recoder.endRecord();
}
destroy() {
// 清除画布
// console.log('h265主动销毁')
this.webglPlayer && this.webglPlayer.clear();
this.app.node = null
this.isStart = false;
Module._closeDecoder()
// this.modulestart
}
muted() {
this.audioPlayer.audioNode.muted = !this.audioPlayer.audioNode.muted;
return this.audioPlayer.audioNode.muted;
}
setVolume(volume) {
this.audioPlayer.audioNode.volume = volume;
}
localRecord(name) {
this.recoder.startRecord(name);
}
finishRecord() {
this.recoder.endRecord();
}
destroy() {
// 清除画布
// console.log('h265主动销毁')
this.webglPlayer && this.webglPlayer.clear();
this.app.node = null;
this.isStart = false;
Module._closeDecoder();
// this.modulestart
}
muted() {
this.audioPlayer.audioNode.muted = !this.audioPlayer.audioNode.muted;
return this.audioPlayer.audioNode.muted;
}
setVolume(volume) {
this.audioPlayer.audioNode.volume = volume;
}
}
export default H265CanvasPlayer
export default H265CanvasPlayer;

@@ -1,25 +0,32 @@

import Event from './util/event';
import { validateChannelInfo, validateConfigs } from './util/viladate';
import { BLoadXML, Xml2String, fullScreen, getChannelInfo,getBackChannelInfo, dealRecordSearchInfo } from './util/utils';
import Event from "./util/event";
import { validateChannelInfo, validateConfigs } from "./util/viladate";
import {
xmlPlayBody,
xmlPlayBackSearch,
xmlPlayRecord,
xmlPlayControl,
xmlPlayStartRecord,
xmlPlayReverse
} from './util/orderList';
import WebSocketUtil from './util/WebSocketUtil';
import TimeSelector from './util/timeSelector'
import H264Mp4Player from './h264player/player';
import H265CanvasPlayer from './h265canvasplayer/player';
// import worker_script from './h265canvasplayer/decodeData';
BLoadXML,
Xml2String,
fullScreen,
getChannelInfo,
getBackChannelInfo,
dealRecordSearchInfo,
} from "./util/utils";
import {
xmlPlayBody,
xmlPlayBackSearch,
xmlPlayRecord,
xmlPlayControl,
xmlPlayStartRecord,
xmlPlayReverse,
} from "./util/orderList";
import WebSocketUtil from "./util/WebSocketUtil";
import TimeSelector from "./util/timeSelector";
import H264Mp4Player from "./h264player/player";
import H265CanvasPlayer from "./h265canvasplayer/player";
// import worker_script from './h265canvasplayer/decodeData';
window.MediaSource = window.MediaSource || window.WebKitMediaSource;
class Html5Player extends Event {
/*
/*
名词解释
MSE media source extension
*/
/*
/*
类的成员 对象

@@ -30,3 +37,3 @@ this.node video标签的dom对象 在构造函数中的validateConfigs执行的时候被赋值

*/
/*
/*
类的状态变量

@@ -40,269 +47,358 @@ this.mseReady = true

*/
constructor(configs) {
super();
let defaults = {
flushingTime: 1000,
clearBuffer: true,
onReady: null, // function called when MSE is ready to accept frames
fps: 25
};
this.options = defaults;
this.configs = configs;
this.state = 0;
this.speed = 1;
this.reverse = false;// 是否倒放
//实例化WebsocketUtil类
if (this.configs.multiServer) {
this.webSocketController = new TimeSelector(this);
} else {
this.webSocketController = new WebSocketUtil(this);
}
constructor(configs) {
super();
let defaults = {
flushingTime: 1000,
clearBuffer: true,
onReady: null, // function called when MSE is ready to accept frames
fps: 25,
};
this.options = defaults;
this.configs = configs;
this.state = 0;
this.speed = 1;
this.reverse = false; // 是否倒放
//实例化WebsocketUtil类
if (this.configs.multiServer) {
this.webSocketController = new TimeSelector(this);
} else {
this.webSocketController = new WebSocketUtil(this);
}
//实例化mp4Coder类
// switch (configs.playerClassName) {
// case 'H264CanvasPlayer':
// this._player = new H264CanvasPlayer(this);
// break;
// default:
// validateConfigs.call(this, configs) //对配置项进行验证
// this._player = new H264Mp4Player(this);
// break;
// }
//实例化mp4Coder类
// switch (configs.playerClassName) {
// case 'H264CanvasPlayer':
// this._player = new H264CanvasPlayer(this);
// break;
// default:
// validateConfigs.call(this, configs) //对配置项进行验证
// this._player = new H264Mp4Player(this);
// break;
// }
const centerInfo = configs.centerInfo;
const centerInfo = configs.centerInfo;
if (centerInfo) {
if (!centerInfo.channelId) {
getBackChannelInfo.call(
this,
centerInfo.centerUrl,
centerInfo.callBack
);
} else {
getChannelInfo.call(
this,
centerInfo.centerUrl,
centerInfo.channelId,
centerInfo.callBack
);
}
}
if (centerInfo) {
if(!centerInfo.channelId){
getBackChannelInfo.call(this, centerInfo.centerUrl, centerInfo.callBack);
}else{
getChannelInfo.call(this, centerInfo.centerUrl, centerInfo.channelId, centerInfo.callBack);
}
this.on("videoBufferAdd", this.videoBufferAdd.bind(this));
this.on("restartclose", this.restartAfterclose.bind(this));
this.on("changeclose", this.changeAfterclose.bind(this));
// this.on('closeSuccess', this.changeSuccessClose.bind(this));
this.on(
"currentTime",
function (time) {
//time 为ms
this.currentTime = time;
}.bind(this)
);
this.on(
"onRecordInfo",
function (jsondata) {
// 如果是单个回放服务器
if (this.webSocketController instanceof WebSocketUtil) {
this.recordInfo = dealRecordSearchInfo(jsondata);
// this.recordStartTime = recordInfo.recordStartTime;
// this.recordEndTime = recordInfo.recordEndTime;
} else if (this.webSocketController instanceof TimeSelector) {
// 如果是多个回放服务器
if (this.recordInfo) {
this.recordInfo.push(dealRecordSearchInfo(jsondata));
} else {
this.recordInfo = [dealRecordSearchInfo(jsondata)];
}
} else {
throw "webSocketController 类型未知";
}
}.bind(this)
);
this.on("restart", () => {
console.log("刷新");
// debugger
// this.changeVideo(this.jsonbonc)
this.closeVideo("change");
});
// 得到视频编码类型,实例化player
this.on("onGetVideoCode", this.makePlayer.bind(this));
// this.on('elementInfo',function(elementInfo){
// this.dispatch('elementInfo',elementInfo);
// }.bind(this))
}
makePlayer(codetype) {
switch (codetype) {
case "H265":
// this._h265player = this._h265player || new H265CanvasPlayer(this,this.configs);
// this._player = this._h265player
// 判断是否可以实例化h265
if (this.validateH265()) {
console.log("实例化h265");
this._h265player =
this._h265player || new H265CanvasPlayer(this, this.configs);
this._player = this._h265player;
} else {
// this._h265player = this._h265player || new H265CanvasPlayer(this,this.configs);
// this._player = this._h265player
this.on('videoBufferAdd', this.videoBufferAdd.bind(this));
this.on('restartclose', this.restartAfterclose.bind(this));
this.on('changeclose', this.changeAfterclose.bind(this));
// this.on('closeSuccess', this.changeSuccessClose.bind(this));
this.on('currentTime', function (time) {
//time 为ms
this.currentTime = time;
}.bind(this));
this.on('onRecordInfo', function (jsondata) {
// 如果是单个回放服务器
if(this.webSocketController instanceof WebSocketUtil){
this.recordInfo = dealRecordSearchInfo(jsondata);
// this.recordStartTime = recordInfo.recordStartTime;
// this.recordEndTime = recordInfo.recordEndTime;
}else if(this.webSocketController instanceof TimeSelector){
// 如果是多个回放服务器
if(this.recordInfo){
this.recordInfo.push(dealRecordSearchInfo(jsondata));
}else{
this.recordInfo = [dealRecordSearchInfo(jsondata)];
}
}else{
throw 'webSocketController 类型未知'
}
this.webSocketController.socketDataMerge.ifDispatchBuf_h265 = false;
// console.log('实例化h264')
// validateConfigs.call(this, this.configs) //对配置项进行验证
// this._player = new H264Mp4Player(this);
this.closeVideo("normal");
this.dispatch("clearOrder");
this.dispatch("error", "h265视频仅允许1路");
}
}.bind(this));
this.on('restart',()=>{
console.log('刷新')
// debugger
// this.changeVideo(this.jsonbonc)
this.closeVideo('change');
})
// 得到视频编码类型,实例化player
this.on('onGetVideoCode',this.makePlayer.bind(this))
// this.on('elementInfo',function(elementInfo){
// this.dispatch('elementInfo',elementInfo);
// }.bind(this))
break;
case "H264":
console.log("实例化h264");
validateConfigs.call(this, this.configs); //对配置项进行验证
this._player = new H264Mp4Player(this);
break;
}
makePlayer(codetype){
switch (codetype) {
case 'H265':
// this._h265player = this._h265player || new H265CanvasPlayer(this,this.configs);
// this._player = this._h265player
// 判断是否可以实例化h265
if(this.validateH265()){
console.log('实例化h265')
this._h265player = this._h265player || new H265CanvasPlayer(this,this.configs);
this._player = this._h265player
}else{
// this._h265player = this._h265player || new H265CanvasPlayer(this,this.configs);
// this._player = this._h265player
this.webSocketController.socketDataMerge.ifDispatchBuf_h265 = false
// console.log('实例化h264')
// validateConfigs.call(this, this.configs) //对配置项进行验证
// this._player = new H264Mp4Player(this);
this.closeVideo('normal')
this.dispatch('clearOrder')
this.dispatch('error','h265视频仅允许1路')
}
break;
case 'H264':
console.log('实例化h264')
validateConfigs.call(this, this.configs) //对配置项进行验证
this._player = new H264Mp4Player(this);
break;
}
}
/**
* 判断是否只有一个websocket连接
*/
ifSingleWebsocket() {
if (this.webSocketController instanceof WebSocketUtil) {
return true;
} else {
return false;
}
/**
* 判断是否只有一个websocket连接
*/
ifSingleWebsocket(){
if(this.webSocketController instanceof WebSocketUtil){
return true
}else{
return false
}
}
/**
* 查询录像
* @param {object} xmljson
*/
searchRecord(xmljson) {
if (Array.isArray(xmljson)) {
this.configs.multiServer = xmljson.length
// 多个服务器的情况
if(this.webSocketController instanceof WebSocketUtil){
var tempWebSocketController = this.webSocketController
this.webSocketController = new TimeSelector(this,tempWebSocketController);
}
}
/**
* 查询录像
* @param {object} xmljson
*/
searchRecord(xmljson) {
if (Array.isArray(xmljson)) {
this.configs.multiServer = xmljson.length;
// 多个服务器的情况
if (this.webSocketController instanceof WebSocketUtil) {
var tempWebSocketController = this.webSocketController;
this.webSocketController = new TimeSelector(
this,
tempWebSocketController
);
}
this.webSocketController.WebSocketUtils.forEach((item,index) => {
// debugger
this.playback = true;
let playBody = BLoadXML(xmlPlayBackSearch);
// console.log(new Date(xmljson[index].endTime).getTime() / 1000)
playBody.getElementsByTagName('EndTime')[0].firstChild.nodeValue = new Date(xmljson[index].endTime).getTime() / 1000;
playBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = new Date(xmljson[index].startTime).getTime() / 1000;
playBody.getElementsByTagName('ChannelID')[0].firstChild.nodeValue = xmljson[index].channelId;
this.channelId = this.channelId instanceof Array ? this.channelId.push(xmljson[index].channelId) : [xmljson[index].channelId];
playBody.getElementsByTagName('StreamServerPort')[0].firstChild.nodeValue = xmljson[index].streamServerPort;
playBody.getElementsByTagName('StreamServerIP')[0].firstChild.nodeValue = xmljson[index].streamServerIP;
this.webSocketController.WebSocketUtils.forEach((item, index) => {
// debugger
this.playback = true;
let playBody = BLoadXML(xmlPlayBackSearch);
// console.log(new Date(xmljson[index].endTime).getTime() / 1000)
playBody.getElementsByTagName("EndTime")[0].firstChild.nodeValue =
new Date(xmljson[index].endTime).getTime() / 1000;
playBody.getElementsByTagName("StartTime")[0].firstChild.nodeValue =
new Date(xmljson[index].startTime).getTime() / 1000;
playBody.getElementsByTagName("ChannelID")[0].firstChild.nodeValue =
xmljson[index].channelId;
this.channelId =
this.channelId instanceof Array
? this.channelId.push(xmljson[index].channelId)
: [xmljson[index].channelId];
playBody.getElementsByTagName(
"StreamServerPort"
)[0].firstChild.nodeValue = xmljson[index].streamServerPort;
playBody.getElementsByTagName(
"StreamServerIP"
)[0].firstChild.nodeValue = xmljson[index].streamServerIP;
//2021.12.13刘易暄
xmljson[index].DeviceType && (playBody.getElementsByTagName('DeviceType')[0].firstChild.nodeValue = xmljson[index].DeviceType);
xmljson[index].RecorderType && (playBody.getElementsByTagName('RecorderType')[0].firstChild.nodeValue = xmljson[index].RecorderType);
xmljson[index].GBSServerIP && (playBody.getElementsByTagName('GBSServerIP')[0].firstChild.nodeValue = xmljson[index].GBSServerIP);
xmljson[index].GBSServerPort && (playBody.getElementsByTagName('GBSServerPort')[0].firstChild.nodeValue = xmljson[index].GBSServerPort);
item.xmlPlayBody = Xml2String(playBody);
item.url = 'ws://' + playBody.getElementsByTagName('StreamServerIP')[0].firstChild.nodeValue + ':' + playBody.getElementsByTagName('StreamServerPort')[0].firstChild.nodeValue;
item.WebSocketInit('playback');
})
this.webSocketController.noVideoNum = 0;
// console.log(this.webSocketController.WebSocketUtils)
} else {
// 单服务器
this.playback = true;
let playBody = BLoadXML(xmlPlayBackSearch);
//2021.12.13刘易暄
xmljson[index].DeviceType &&
(playBody.getElementsByTagName("DeviceType")[0].firstChild.nodeValue =
xmljson[index].DeviceType);
xmljson[index].RecorderType &&
(playBody.getElementsByTagName(
"RecorderType"
)[0].firstChild.nodeValue = xmljson[index].RecorderType);
xmljson[index].GBSServerIP &&
(playBody.getElementsByTagName(
"GBSServerIP"
)[0].firstChild.nodeValue = xmljson[index].GBSServerIP);
xmljson[index].GBSServerPort &&
(playBody.getElementsByTagName(
"GBSServerPort"
)[0].firstChild.nodeValue = xmljson[index].GBSServerPort);
item.xmlPlayBody = Xml2String(playBody);
item.url =
"ws://" +
playBody.getElementsByTagName("StreamServerIP")[0].firstChild
.nodeValue +
":" +
playBody.getElementsByTagName("StreamServerPort")[0].firstChild
.nodeValue;
item.WebSocketInit("playback");
});
this.webSocketController.noVideoNum = 0;
// console.log(this.webSocketController.WebSocketUtils)
} else {
// 单服务器
this.playback = true;
let playBody = BLoadXML(xmlPlayBackSearch);
// console.log(new Date(xmljson.endTime).getTime() / 1000)
playBody.getElementsByTagName('EndTime')[0].firstChild.nodeValue = new Date(xmljson.endTime).getTime() / 1000;
playBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = new Date(xmljson.startTime).getTime() / 1000;
playBody.getElementsByTagName('ChannelID')[0].firstChild.nodeValue = xmljson.channelId;
this.channelId = xmljson.channelId;
playBody.getElementsByTagName('StreamServerPort')[0].firstChild.nodeValue = xmljson.streamServerPort;
playBody.getElementsByTagName('StreamServerIP')[0].firstChild.nodeValue = xmljson.streamServerIP;
// console.log(new Date(xmljson.endTime).getTime() / 1000)
playBody.getElementsByTagName("EndTime")[0].firstChild.nodeValue =
new Date(xmljson.endTime).getTime() / 1000;
playBody.getElementsByTagName("StartTime")[0].firstChild.nodeValue =
new Date(xmljson.startTime).getTime() / 1000;
playBody.getElementsByTagName("ChannelID")[0].firstChild.nodeValue =
xmljson.channelId;
this.channelId = xmljson.channelId;
playBody.getElementsByTagName(
"StreamServerPort"
)[0].firstChild.nodeValue = xmljson.streamServerPort;
playBody.getElementsByTagName("StreamServerIP")[0].firstChild.nodeValue =
xmljson.streamServerIP;
//2021.12.13刘易暄
xmljson.DeviceType && (playBody.getElementsByTagName('DeviceType')[0].firstChild.nodeValue = xmljson.DeviceType);
this.DeviceType = xmljson.DeviceType?xmljson.DeviceType:"";
xmljson.RecorderType && (playBody.getElementsByTagName('RecorderType')[0].firstChild.nodeValue = xmljson.RecorderType);
this.RecorderType = xmljson.RecorderType?xmljson.RecorderType:"";
xmljson.GBSServerIP && (playBody.getElementsByTagName('GBSServerIP')[0].firstChild.nodeValue = xmljson.GBSServerIP);
this.GBSServerIP = xmljson.GBSServerIP?xmljson.GBSServerIP:"";
xmljson.GBSServerPort && (playBody.getElementsByTagName('GBSServerPort')[0].firstChild.nodeValue = xmljson.GBSServerPort);
this.GBSServerPort = xmljson.GBSServerPort?xmljson.GBSServerPort:"";
this.MDSServerIP = xmljson.MDSServerIP?xmljson.MDSServerIP:"";
this.MDSServerPort = xmljson.MDSServerPort?xmljson.MDSServerPort:"";
this.xmlPlayBody = Xml2String(playBody);
//2021.12.13刘易暄
xmljson.DeviceType &&
(playBody.getElementsByTagName("DeviceType")[0].firstChild.nodeValue =
xmljson.DeviceType);
this.DeviceType = xmljson.DeviceType ? xmljson.DeviceType : "";
xmljson.RecorderType &&
(playBody.getElementsByTagName("RecorderType")[0].firstChild.nodeValue =
xmljson.RecorderType);
this.RecorderType = xmljson.RecorderType ? xmljson.RecorderType : "";
xmljson.GBSServerIP &&
(playBody.getElementsByTagName("GBSServerIP")[0].firstChild.nodeValue =
xmljson.GBSServerIP);
this.GBSServerIP = xmljson.GBSServerIP ? xmljson.GBSServerIP : "";
xmljson.GBSServerPort &&
(playBody.getElementsByTagName(
"GBSServerPort"
)[0].firstChild.nodeValue = xmljson.GBSServerPort);
this.GBSServerPort = xmljson.GBSServerPort ? xmljson.GBSServerPort : "";
this.MDSServerIP = xmljson.MDSServerIP ? xmljson.MDSServerIP : "";
this.MDSServerPort = xmljson.MDSServerPort ? xmljson.MDSServerPort : "";
this.xmlPlayBody = Xml2String(playBody);
this.webSocketController.xmlPlayBody = Xml2String(playBody);
this.webSocketController.url = 'ws://' + playBody.getElementsByTagName('StreamServerIP')[0].firstChild.nodeValue + ':' + playBody.getElementsByTagName('StreamServerPort')[0].firstChild.nodeValue;
this.webSocketController.WebSocketInit('playback');
}
this.webSocketController.xmlPlayBody = Xml2String(playBody);
this.webSocketController.url =
"ws://" +
playBody.getElementsByTagName("StreamServerIP")[0].firstChild
.nodeValue +
":" +
playBody.getElementsByTagName("StreamServerPort")[0].firstChild
.nodeValue;
this.webSocketController.WebSocketInit("playback");
}
}
/**
* 打开实时视频 jsonbonc 为请求接口openChanneltForHtml返回的结果的对象
* @param {object} jsonbonc
*/
openVideo(jsonbonc) {
if (!jsonbonc && !this.jsonbonc) {
console.warn("通道数据不存在,请确定是否完成通道信息的获取");
return;
}
this.dispatch("startVideo");
//验证jsonbonc
if (!this.jsonbonc) {
this.jsonbonc = jsonbonc;
}
if (!jsonbonc) {
jsonbonc = this.jsonbonc;
}
// if (!this._player) {
// switch (this.configs.playerClassName) {
// case 'H264CanvasPlayer':
// this._player = new H264CanvasPlayer(this);
// break;
// default:
// this._player = new H264Mp4Player(this);
// break;
// }
// }
// console.log('开始')
if (!validateChannelInfo(jsonbonc)) {
throw new Error("视频channel信息异常");
}
/**
* 打开实时视频 jsonbonc 为请求接口openChanneltForHtml返回的结果的对象
* @param {object} jsonbonc
*/
openVideo(jsonbonc) {
//如果当前播放器正在播放视频,先关闭当前视频
if (this.state !== 0) {
this.closeVideo();
}
//wuyage add
// this.worker = new Worker(worker_script);
// console.log('开启解码线程');
var playBody = BLoadXML(xmlPlayBody);
playBody.getElementsByTagName("DeviceType")[0].firstChild.nodeValue =
jsonbonc.DeviceType;
playBody.getElementsByTagName("DeviceIP")[0].firstChild.nodeValue =
jsonbonc.DeviceIP;
playBody.getElementsByTagName("StreamServerIP")[0].firstChild.nodeValue =
jsonbonc.StreamServerIP;
playBody.getElementsByTagName("StreamServerPort")[0].firstChild.nodeValue =
jsonbonc.StreamServerPort;
playBody.getElementsByTagName("DevicePort")[0].firstChild.nodeValue =
jsonbonc.DevicePort;
playBody.getElementsByTagName("UserName")[0].firstChild.nodeValue =
jsonbonc.UserName;
playBody.getElementsByTagName("PassWord")[0].firstChild.nodeValue =
jsonbonc.PassWord;
playBody.getElementsByTagName("ChannelNum")[0].firstChild.nodeValue =
jsonbonc.ChannelNum;
if (!jsonbonc && !this.jsonbonc) {
console.warn('通道数据不存在,请确定是否完成通道信息的获取')
return;
}
this.dispatch('startVideo')
//验证jsonbonc
if (!this.jsonbonc) {
this.jsonbonc = jsonbonc;
}
if (!jsonbonc) {
jsonbonc = this.jsonbonc
}
// 设置主子码流
jsonbonc.StreamNum &&
(playBody.getElementsByTagName("StreamNum")[0].firstChild.nodeValue =
jsonbonc.StreamNum);
// if (!this._player) {
// switch (this.configs.playerClassName) {
// case 'H264CanvasPlayer':
// this._player = new H264CanvasPlayer(this);
// break;
// default:
// this._player = new H264Mp4Player(this);
// break;
// }
// }
// console.log('开始')
if (!validateChannelInfo(jsonbonc)) {
throw new Error('视频channel信息异常');
}
//如果当前播放器正在播放视频,先关闭当前视频
if (this.state !== 0) {
this.closeVideo()
}
//wuyage add
// this.worker = new Worker(worker_script);
// console.log('开启解码线程');
var playBody = BLoadXML(xmlPlayBody);
playBody.getElementsByTagName('DeviceType')[0].firstChild.nodeValue = jsonbonc.DeviceType;
playBody.getElementsByTagName('DeviceIP')[0].firstChild.nodeValue = jsonbonc.DeviceIP;
playBody.getElementsByTagName('StreamServerIP')[0].firstChild.nodeValue = jsonbonc.StreamServerIP;
playBody.getElementsByTagName('StreamServerPort')[0].firstChild.nodeValue = jsonbonc.StreamServerPort;
playBody.getElementsByTagName('DevicePort')[0].firstChild.nodeValue = jsonbonc.DevicePort;
playBody.getElementsByTagName('UserName')[0].firstChild.nodeValue = jsonbonc.UserName;
playBody.getElementsByTagName('PassWord')[0].firstChild.nodeValue = jsonbonc.PassWord;
playBody.getElementsByTagName('ChannelNum')[0].firstChild.nodeValue = jsonbonc.ChannelNum;
//2021.12.2亚鸽 添加国际ip和port
jsonbonc.GBSServerIP &&
(playBody.getElementsByTagName("GBSServerIP")[0].firstChild.nodeValue =
jsonbonc.GBSServerIP);
jsonbonc.GBSServerPort &&
(playBody.getElementsByTagName("GBSServerPort")[0].firstChild.nodeValue =
jsonbonc.GBSServerPort);
// 设置主子码流
jsonbonc.StreamNum && (playBody.getElementsByTagName('StreamNum')[0].firstChild.nodeValue = jsonbonc.StreamNum);
this.webSocketController.url =
"ws://" +
playBody.getElementsByTagName("StreamServerIP")[0].firstChild.nodeValue +
":" +
playBody.getElementsByTagName("StreamServerPort")[0].firstChild.nodeValue;
this.webSocketController.xmlPlayBody = Xml2String(playBody);
this.webSocketController.WebSocketInit();
}
//2021.12.2亚鸽 添加国际ip和port
jsonbonc.GBSServerIP && (playBody.getElementsByTagName('GBSServerIP')[0].firstChild.nodeValue = jsonbonc.GBSServerIP);
jsonbonc.GBSServerPort && (playBody.getElementsByTagName('GBSServerPort')[0].firstChild.nodeValue = jsonbonc.GBSServerPort);
/**
* 下载视频
* @param {info}
*/
download(info) {
var {
startTime,
endTime,
ip,
port,
filename,
channelId,
type = "flv",
} = info;
var url = `http://${ip}:${port}/${filename}.${type}?channelid=${channelId}&starttime=${startTime}&endtime=${endTime}`;
var a = document.createElement("a");
a.download = filename + "." + type;
a.href = url;
var bodynode = document.querySelector("body");
bodynode.append(a); // 修复firefox中无法触发click
a.click();
a.remove();
this.webSocketController.url = 'ws://' + playBody.getElementsByTagName('StreamServerIP')[0].firstChild.nodeValue + ':' + playBody.getElementsByTagName('StreamServerPort')[0].firstChild.nodeValue;
this.webSocketController.xmlPlayBody = Xml2String(playBody);
this.webSocketController.WebSocketInit();
}
/**
* 下载视频
* @param {info}
*/
download(info) {
var { startTime, endTime, ip, port, filename, channelId, type = 'flv' } = info
var url = `http://${ip}:${port}/${filename}.${type}?channelid=${channelId}&starttime=${startTime}&endtime=${endTime}`
var a = document.createElement("a");
a.download = filename + "." + type;
a.href = url;
var bodynode = document.querySelector('body')
bodynode.append(a); // 修复firefox中无法触发click
a.click();
a.remove();
/* if (document.getElementById('iframe')) {
/* if (document.getElementById('iframe')) {
if (!!window.ActiveXObject || "ActiveXObject" in window) {

@@ -337,133 +433,151 @@ document.getElementById('iframe').removeNode(true);

document.body.appendChild(elFrame); */
}
}
/**
* 静音
*/
muted(){
return this._player && this._player.muted()
/**
* 静音
*/
muted() {
return this._player && this._player.muted();
}
/**
* 音量控制,传入值在0-1之间
* @param {number} volume
*/
setVolume(volume) {
if (volume < 0 || volume > 1) {
throw "音量值需在0到1之间";
}
/**
* 音量控制,传入值在0-1之间
* @param {number} volume
*/
setVolume(volume){
if(volume<0 || volume>1){
throw '音量值需在0到1之间'
}
this._player && this._player.setVolume(volume)
}
this._player && this._player.setVolume(volume);
}
/**
* 实时回放
*/
playVideoback(second) {
if (second > 30) {
console.error('不得超过30s')
return
}
// 停止将收到的的内容放入队列
// debugger
this.webSocketController.socketDataMerge.ifDispatchBuf = false;
// 播放的针回到30s之前
// console.log(this.node.currentTime)
this.node.currentTime -= second;
setTimeout(() => {
this.webSocketController.socketDataMerge.ifDispatchBuf = true;
}, second * 1000)
/**
* 实时回放
*/
playVideoback(second) {
if (second > 30) {
console.error("不得超过30s");
return;
}
/**
*视频回放
*/
playRecord(param) {
// console.log('playRecord')
this.reverse = false;
var playRecodrBody = BLoadXML(xmlPlayRecord)
playRecodrBody.getElementsByTagName('ChannelID')[0].firstChild.nodeValue = param.channelId;
playRecodrBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = param.startTime;
playRecodrBody.getElementsByTagName('EndTime')[0].firstChild.nodeValue = param.endTime;
playRecodrBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = param.speed;
//2021.12.13刘易暄
param.DeviceType && (playRecodrBody.getElementsByTagName('DeviceType')[0].firstChild.nodeValue = param.DeviceType);
param.RecorderType && (playRecodrBody.getElementsByTagName('RecorderType')[0].firstChild.nodeValue = param.RecorderType);
param.GBSServerIP && (playRecodrBody.getElementsByTagName('GBSServerIP')[0].firstChild.nodeValue = param.GBSServerIP);
param.GBSServerPort && (playRecodrBody.getElementsByTagName('GBSServerPort')[0].firstChild.nodeValue = param.GBSServerPort);
param.MDSServerIP && (playRecodrBody.getElementsByTagName('MDSServerIP')[0].firstChild.nodeValue = param.MDSServerIP);
param.MDSServerPort && (playRecodrBody.getElementsByTagName('MDSServerPort')[0].firstChild.nodeValue = param.MDSServerPort);
// 停止将收到的的内容放入队列
// debugger
this.webSocketController.socketDataMerge.ifDispatchBuf = false;
// 播放的针回到30s之前
// console.log(this.node.currentTime)
this.node.currentTime -= second;
setTimeout(() => {
this.webSocketController.socketDataMerge.ifDispatchBuf = true;
}, second * 1000);
}
/**
*视频回放
*/
playRecord(param) {
// console.log('playRecord')
this.reverse = false;
var playRecodrBody = BLoadXML(xmlPlayRecord);
playRecodrBody.getElementsByTagName("ChannelID")[0].firstChild.nodeValue =
param.channelId;
playRecodrBody.getElementsByTagName("StartTime")[0].firstChild.nodeValue =
param.startTime;
playRecodrBody.getElementsByTagName("EndTime")[0].firstChild.nodeValue =
param.endTime;
playRecodrBody.getElementsByTagName("Speed")[0].firstChild.nodeValue =
param.speed;
//2021.12.13刘易暄
param.DeviceType &&
(playRecodrBody.getElementsByTagName(
"DeviceType"
)[0].firstChild.nodeValue = param.DeviceType);
param.RecorderType &&
(playRecodrBody.getElementsByTagName(
"RecorderType"
)[0].firstChild.nodeValue = param.RecorderType);
param.GBSServerIP &&
(playRecodrBody.getElementsByTagName(
"GBSServerIP"
)[0].firstChild.nodeValue = param.GBSServerIP);
param.GBSServerPort &&
(playRecodrBody.getElementsByTagName(
"GBSServerPort"
)[0].firstChild.nodeValue = param.GBSServerPort);
param.MDSServerIP &&
(playRecodrBody.getElementsByTagName(
"MDSServerIP"
)[0].firstChild.nodeValue = param.MDSServerIP);
param.MDSServerPort &&
(playRecodrBody.getElementsByTagName(
"MDSServerPort"
)[0].firstChild.nodeValue = param.MDSServerPort);
this.webSocketController.recordPlay(playRecodrBody);
this.webSocketController.recordPlay(playRecodrBody);
}
startRecord(name) {
try {
this._player.localRecord(name);
} catch (err) {
// this._player.isRecording = false;
}
}
finishRecord() {
this._player.finishRecord();
}
startRecord(name) {
try {
this._player.localRecord(name)
} catch (err) {
// this._player.isRecording = false;
}
/**
* 关闭视频(主动关闭视频)
*/
closeVideo(reason = "normal", ifnew = true) {
if (!this.webSocketController.boncws) return;
if (this.webSocketController instanceof TimeSelector) {
this.webSocketController.WebSocketUtils.forEach((val) => {
val.boncws.normalClose(reason);
clearInterval(val.heartLiveInterval);
});
} else {
this.webSocketController.boncws.normalClose(reason);
clearInterval(this.webSocketController.heartLiveInterval);
}
finishRecord() {
this._player.finishRecord()
}
/**
* 关闭视频(主动关闭视频)
*/
closeVideo(reason = 'normal', ifnew = true)
{
if (!this.webSocketController.boncws) return;
if(this.webSocketController instanceof TimeSelector){
this.webSocketController.WebSocketUtils.forEach(val=>{
val.boncws.normalClose(reason);
clearInterval(val.heartLiveInterval);
})
// this.H264Mp4Player.destroy();
this.node && (this.node.src = "");
// console.log('关闭解码线程')
// this.worker.terminate();
this._player && this._player.destroy();
}else{
this.webSocketController.boncws.normalClose(reason);
clearInterval(this.webSocketController.heartLiveInterval);
}
// this.H264Mp4Player.destroy();
this.node && (this.node.src = '');
// console.log('关闭解码线程')
// this.worker.terminate();
this._player && this._player.destroy();
this.currentTime = null;
this.webSocketController.socketDataMerge.ifDispatchVideoType = true;
if (ifnew == false) {
return
}
// console.log(this.configs.playerClassName)
if(this._player){
switch (this._player.constructor.name) {
case 'H265CanvasPlayer':
this._player = new H265CanvasPlayer(this);
break;
default:
delete this._player;
validateConfigs.call(this, this.configs) //对配置项进行验证
this._player = new H264Mp4Player(this);
break;
}
}
this.currentTime = null;
this.webSocketController.socketDataMerge.ifDispatchVideoType = true;
if (ifnew == false) {
return;
}
/**重启视频 */
restartVideo() {
this.closeVideo('restart');
//this.openVideo(this.jsonbonc)
// console.log(this.configs.playerClassName)
if (this._player) {
switch (this._player.constructor.name) {
case "H265CanvasPlayer":
this._player = new H265CanvasPlayer(this);
break;
default: //对配置项进行验证
delete this._player;
validateConfigs.call(this, this.configs);
this._player = new H264Mp4Player(this);
break;
}
}
restartAfterclose() {
this.openVideo(this.jsonbonc)
}
}
/**重启视频 */
restartVideo() {
this.closeVideo("restart");
//this.openVideo(this.jsonbonc)
}
restartAfterclose() {
this.openVideo(this.jsonbonc);
}
/**
* 开启码率计算
*/
startCalBitNum() {
this.webSocketController.socketDataMerge.controlCalBitRate()
}
/**
* 开启码率计算
*/
startCalBitNum() {
this.webSocketController.socketDataMerge.controlCalBitRate();
}
/**
/**
* 速度标识符

@@ -479,208 +593,207 @@ 1 正常速度

*/
setPlayRate(rateVal) {
// var playxml = xmlPlayControl;
// var playxmlBody = BLoadXML(playxml);
// this.speed = rateVal;
// playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = rateVal;
// playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = this.currentTime;
// this.webSocketController.playControl(Xml2String(playxmlBody))
this.webSocketController.setPlayRate(rateVal)
}
/**
* 暂停
*/
pause() {
// var playxml = xmlPlayControl;
// var playxmlBody = BLoadXML(playxml);
// playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = 0;
// // playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = this.currentTime;
// this.webSocketController.playControl(Xml2String(playxmlBody))
this.webSocketController.pause();
}
/**
* 继续播放
*/
playContinue() {
setPlayRate(rateVal) {
// var playxml = xmlPlayControl;
// var playxmlBody = BLoadXML(playxml);
// this.speed = rateVal;
// playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = rateVal;
// playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = this.currentTime;
// this.webSocketController.playControl(Xml2String(playxmlBody))
this.webSocketController.setPlayRate(rateVal);
}
/**
* 暂停
*/
pause() {
// var playxml = xmlPlayControl;
// var playxmlBody = BLoadXML(playxml);
// playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = 0;
// // playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = this.currentTime;
// this.webSocketController.playControl(Xml2String(playxmlBody))
this.webSocketController.pause();
}
/**
* 继续播放
*/
playContinue() {
// var playtime;
// // 判断是否存在倒放的定时器,如果存在倒放的定时器要销毁
// var playtime;
// // 判断是否存在倒放的定时器,如果存在倒放的定时器要销毁
// if (this.currentTime) {
// console.log(new Date(this.currentTime))
// var playxml = xmlPlayControl;
// var playxmlBody = BLoadXML(playxml);
// playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = this.speed;
// playtime = this.currentTime;
// playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = playtime;
// this.webSocketController.playControl(Xml2String(playxmlBody))
// } else {
// var playxml = xmlPlayRecord;
// var playxmlBody = BLoadXML(playxml);
// playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = this.speed;
// playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = this.recordInfo.recordStartTime / 1000;
// playxmlBody.getElementsByTagName('EndTime')[0].firstChild.nodeValue = this.recordInfo.recordEndTime / 1000;
// playxmlBody.getElementsByTagName('ChannelID')[0].firstChild.nodeValue = this.channelId;
// this.webSocketController.playControl(Xml2String(playxmlBody))
// }
this.webSocketController.playContinue();
}
playForward() {
var playxml = xmlPlayRecord;
var playxmlBody = BLoadXML(playxml);
playxmlBody.getElementsByTagName("Speed")[0].firstChild.nodeValue =
this.speed;
var playtime = this.currentTime;
playxmlBody.getElementsByTagName("StartTime")[0].firstChild.nodeValue =
playtime;
// if (this.currentTime) {
// console.log(new Date(this.currentTime))
// var playxml = xmlPlayControl;
// var playxmlBody = BLoadXML(playxml);
// playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = this.speed;
// playtime = this.currentTime;
// playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = playtime;
// this.webSocketController.playControl(Xml2String(playxmlBody))
// } else {
// var playxml = xmlPlayRecord;
// var playxmlBody = BLoadXML(playxml);
// playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = this.speed;
// playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = this.recordInfo.recordStartTime / 1000;
// playxmlBody.getElementsByTagName('EndTime')[0].firstChild.nodeValue = this.recordInfo.recordEndTime / 1000;
// playxmlBody.getElementsByTagName('ChannelID')[0].firstChild.nodeValue = this.channelId;
// this.webSocketController.playControl(Xml2String(playxmlBody))
// }
this.webSocketController.playContinue()
}
playForward() {
var playxml = xmlPlayRecord;
var playxmlBody = BLoadXML(playxml);
playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = this.speed;
var playtime = this.currentTime;
playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = playtime;
playxmlBody.getElementsByTagName("EndTime")[0].firstChild.nodeValue =
this.recordEndTime / 1000;
playxmlBody.getElementsByTagName("ChannelID")[0].firstChild.nodeValue =
this.channelId;
this.webSocketController.playControl(Xml2String(playxmlBody));
playxmlBody.getElementsByTagName('EndTime')[0].firstChild.nodeValue = this.recordEndTime / 1000;
playxmlBody.getElementsByTagName('ChannelID')[0].firstChild.nodeValue = this.channelId;
this.webSocketController.playControl(Xml2String(playxmlBody));
if (this._player.reversePlayInterval) {
this._player.clearReverseInterval();
this.reverse = false;
this.node.play();
}
if (this._player.reversePlayInterval) {
this._player.clearReverseInterval();
this.reverse = false;
this.node.play();
}
}
/**
* 倒放
*/
reversePlay() {
this.reverse = true;
var playxml = xmlPlayReverse;
var playxmlBody = BLoadXML(playxml);
playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = this.speed * 1;
// playxmlBody.getElementsByTagName('EndTime')[0].firstChild.nodeValue = this.currentTime;
playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = this.recordInfo.recordStartTime;
// playxmlBody.getElementsByTagName('CmdType')[0].firstChild.nodeValue = 'ReversePlay';
// playxmlBody.getElementsByTagName('ChannelID')[0].firstChild.nodeValue = this.channelId;
this.webSocketController.playControl(Xml2String(playxmlBody));
// 向播放器发出倒放的指令
this._player.playReverse()
}
/**
* 倒放
*/
reversePlay() {
this.reverse = true;
var playxml = xmlPlayReverse;
var playxmlBody = BLoadXML(playxml);
playxmlBody.getElementsByTagName("Speed")[0].firstChild.nodeValue =
this.speed * 1;
// playxmlBody.getElementsByTagName('EndTime')[0].firstChild.nodeValue = this.currentTime;
playxmlBody.getElementsByTagName("StartTime")[0].firstChild.nodeValue =
this.recordInfo.recordStartTime;
// playxmlBody.getElementsByTagName('CmdType')[0].firstChild.nodeValue = 'ReversePlay';
// playxmlBody.getElementsByTagName('ChannelID')[0].firstChild.nodeValue = this.channelId;
this.webSocketController.playControl(Xml2String(playxmlBody));
// 向播放器发出倒放的指令
this._player.playReverse();
}
/**
* 逐帧播放
*/
singleFramePlay() {
var playxml = xmlPlayControl;
var playxmlBody = BLoadXML(playxml);
playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = -1;
playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = 0;
this.webSocketController.playControl(Xml2String(playxmlBody));
}
/**
* 逐帧播放
*/
singleFramePlay() {
var playxml = xmlPlayControl;
var playxmlBody = BLoadXML(playxml);
playxmlBody.getElementsByTagName("Speed")[0].firstChild.nodeValue = -1;
playxmlBody.getElementsByTagName("StartTime")[0].firstChild.nodeValue = 0;
this.webSocketController.playControl(Xml2String(playxmlBody));
}
/**
* 逐帧倒放
*/
singleFrameReversePlay() {
var playxml = xmlPlayControl;
var playxmlBody = BLoadXML(playxml);
playxmlBody.getElementsByTagName('Speed')[0].firstChild.nodeValue = -1;
playxmlBody.getElementsByTagName('StartTime')[0].firstChild.nodeValue = 0;
playxmlBody.getElementsByTagName('CmdType')[0].firstChild.nodeValue = 'ReversePlay';
this.webSocketController.playControl(Xml2String(playxmlBody));
/**
* 逐帧倒放
*/
singleFrameReversePlay() {
var playxml = xmlPlayControl;
var playxmlBody = BLoadXML(playxml);
playxmlBody.getElementsByTagName("Speed")[0].firstChild.nodeValue = -1;
playxmlBody.getElementsByTagName("StartTime")[0].firstChild.nodeValue = 0;
playxmlBody.getElementsByTagName("CmdType")[0].firstChild.nodeValue =
"ReversePlay";
this.webSocketController.playControl(Xml2String(playxmlBody));
}
}
/**
* 切换视频
* @param {*} jsonbonc
*/
changeVideo(jsonbonc) {
// debugger
this.jsonbonc = jsonbonc;
this.closeVideo("change");
}
/**
* 切换视频
* @param {*} jsonbonc
*/
changeVideo(jsonbonc) {
// debugger
this.jsonbonc = jsonbonc;
this.closeVideo('change');
}
// changeVideo(jsonbonc){
// var playBody=BLoadXML(xmlPlayBody);
// playBody.getElementsByTagName('DeviceType')[0].firstChild.nodeValue = jsonbonc.DeviceType;
// playBody.getElementsByTagName('DeviceIP')[0].firstChild.nodeValue = jsonbonc.DeviceIP;
// playBody.getElementsByTagName('StreamServerIP')[0].firstChild.nodeValue = jsonbonc.StreamServerIP;
// playBody.getElementsByTagName('StreamServerPort')[0].firstChild.nodeValue = jsonbonc.StreamServerPort;
// playBody.getElementsByTagName('DevicePort')[0].firstChild.nodeValue = jsonbonc.DevicePort;
// playBody.getElementsByTagName('UserName')[0].firstChild.nodeValue = jsonbonc.UserName;
// playBody.getElementsByTagName('PassWord')[0].firstChild.nodeValue = jsonbonc.PassWord;
// playBody.getElementsByTagName('ChannelNum')[0].firstChild.nodeValue = jsonbonc.ChannelNum;
// this.webSocketController.playControl(Xml2String(playBody));
// }
changeAfterclose() {
this.openVideo(this.jsonbonc);
}
changeSuccessClose(obj) {
console.log(obj);
}
/**
* 全屏
*/
fullScreen() {
fullScreen(this.node);
}
// changeVideo(jsonbonc){
// var playBody=BLoadXML(xmlPlayBody);
// playBody.getElementsByTagName('DeviceType')[0].firstChild.nodeValue = jsonbonc.DeviceType;
// playBody.getElementsByTagName('DeviceIP')[0].firstChild.nodeValue = jsonbonc.DeviceIP;
// playBody.getElementsByTagName('StreamServerIP')[0].firstChild.nodeValue = jsonbonc.StreamServerIP;
// playBody.getElementsByTagName('StreamServerPort')[0].firstChild.nodeValue = jsonbonc.StreamServerPort;
// playBody.getElementsByTagName('DevicePort')[0].firstChild.nodeValue = jsonbonc.DevicePort;
// playBody.getElementsByTagName('UserName')[0].firstChild.nodeValue = jsonbonc.UserName;
// playBody.getElementsByTagName('PassWord')[0].firstChild.nodeValue = jsonbonc.PassWord;
// playBody.getElementsByTagName('ChannelNum')[0].firstChild.nodeValue = jsonbonc.ChannelNum;
// this.webSocketController.playControl(Xml2String(playBody));
videoBufferAdd(videoBuffer) {
// console.log('开始进入死循环')
// while (true){
//
// }
changeAfterclose() {
this.openVideo(this.jsonbonc)
// console.log('退出死循环')
// this.H264Mp4Player.playBuffer(videoBuffer);
// this.H264CanvasPlayer.playBuffer(videoBuffer);
if (this.reverse) {
// 倒放 ,需要将裸流加入到倒放队列
this._player.playBfferReverse(videoBuffer);
} else {
// 正放
if (this._player) {
//let worker = new Worker(H265CanvasPlayer);
// this.worker.postMessage(videoBuffer,[videoBuffer]);
// this.worker.addEventListener("error", function(evt){
// console.log("workerErrorLine #" + evt.lineno + " - " + evt.message + " in " + evt.filename);
// }, false);
// let dataTeime=new Date().getTime();
this._player.playBuffer(videoBuffer);
// let jiange=new Date().getTime()-dataTeime;
// console.log('视频解码playBuffer耗时:'+jiange+'\n' )
} else {
// debugger
var codeType = this.webSocketController.socketDataMerge.codeType;
this.makePlayer(codeType);
// this.worker.postMessage(videoBuffer);
// this.worker.addEventListener("error", function(evt){
// console.log("Line #" + evt.lineno + " - " + evt.message + " in " + evt.filename);
// }, false);
this._player.playBuffer(videoBuffer);
}
}
changeSuccessClose(obj){
console.log(obj)
}
/**
* 判断是否是h265
* @returns Boolean
*/
isH265() {
return this._player instanceof H265CanvasPlayer;
}
/**
* 判断h265是否可以允许播放,对于多路视频而言h265视频只允许播放一路
* @returns Boolean
*/
validateH265() {
if (this.validateH265out) {
// validateH265out函数通过外部实例化类的时候绑定,如果没有绑定的话返回true
return !this.validateH265out();
} else {
return true;
}
/**
* 全屏
*/
fullScreen() {
fullScreen(this.node)
}
videoBufferAdd(videoBuffer) {
// console.log('开始进入死循环')
// while (true){
//
// }
// console.log('退出死循环')
// this.H264Mp4Player.playBuffer(videoBuffer);
// this.H264CanvasPlayer.playBuffer(videoBuffer);
if (this.reverse) {
// 倒放 ,需要将裸流加入到倒放队列
this._player.playBfferReverse(videoBuffer)
} else {
// 正放
if(this._player){
//let worker = new Worker(H265CanvasPlayer);
// this.worker.postMessage(videoBuffer,[videoBuffer]);
// this.worker.addEventListener("error", function(evt){
// console.log("workerErrorLine #" + evt.lineno + " - " + evt.message + " in " + evt.filename);
// }, false);
// let dataTeime=new Date().getTime();
this._player.playBuffer(videoBuffer);
// let jiange=new Date().getTime()-dataTeime;
// console.log('视频解码playBuffer耗时:'+jiange+'\n' )
}else{
// debugger
var codeType = this.webSocketController.socketDataMerge.codeType
this.makePlayer(codeType)
// this.worker.postMessage(videoBuffer);
// this.worker.addEventListener("error", function(evt){
// console.log("Line #" + evt.lineno + " - " + evt.message + " in " + evt.filename);
// }, false);
this._player.playBuffer(videoBuffer);
}
}
}
/**
* 判断是否是h265
* @returns Boolean
*/
isH265(){
return this._player instanceof H265CanvasPlayer
}
/**
* 判断h265是否可以允许播放,对于多路视频而言h265视频只允许播放一路
* @returns Boolean
*/
validateH265(){
if(this.validateH265out){
// validateH265out函数通过外部实例化类的时候绑定,如果没有绑定的话返回true
return !this.validateH265out();
}else{
return true;
}
}
}
}
export default Html5Player;

@@ -1,546 +0,571 @@

import ByteArray from './ByteArray';
import ByteArray from "./ByteArray";
//import {MergeBuffer} from './utils' ;
// import {globalEvent} from './event' ;
import { CSecurityVideoDetectTask } from './securityIDList';
import { throttle } from './utils';
import ObjTree from 'objtree';
import { CSecurityVideoDetectTask } from "./securityIDList";
import { throttle } from "./utils";
import ObjTree from "objtree";
const xotree = new ObjTree();
let srMap = [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];
let srMap = [
96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025,
8000, 7350,
];
//company 1112757248 'BST '
class SocketDataMerge {
constructor(app) {
this.app = app;
/**当前数据包是否异常 0:正常 1:异常 */
this.packageState = 0
// this.templateDataQueue = new ArrayBuffer(0);
//从服务端收到的数据都放在这里
this.websocketDataQueue = [];
constructor(app) {
this.app = app;
/**当前数据包是否异常 0:正常 1:异常 */
this.packageState = 0;
// this.templateDataQueue = new ArrayBuffer(0);
//从服务端收到的数据都放在这里
this.websocketDataQueue = [];
this.videoDataQueue = [];
this.videoDataQueue = [];
this.audioDataQueue = [];
this.packageNum = 0;
this.whole = new Uint8Array(1400000)//分配100*1400个字节的内存空间用于存储收到的数据.unit8Array:8位无符号整数值的类型化数组。内容将初始化为 0
this.wholeOffset = 0;
this.start = false;
this.audioDataQueue = [];
this.packageNum = 0;
this.whole = new Uint8Array(1400000); //分配100*1400个字节的内存空间用于存储收到的数据.unit8Array:8位无符号整数值的类型化数组。内容将初始化为 0
this.wholeOffset = 0;
this.start = false;
this.drawfunc = null;
this.isCalBitRate = false;
this.t1;//t1用于计算码率
this.t2;//t2用于计算码率
this.accumulateBitNum = 0;
this.ifDispatchBuf = true;// 是否,外部修改
this.ifDispatchBuf_h265 = true;
this.ifDispatchVideoError = true;
this.ifDispatchVideoType = true;
this.ifDispatchAudioError = true;
// this.addBuffCount=0;
this.drawfunc = null;
this.isCalBitRate = false;
this.t1; //t1用于计算码率
this.t2; //t2用于计算码率
this.accumulateBitNum = 0;
this.ifDispatchBuf = true; // 是否,外部修改
this.ifDispatchBuf_h265 = true;
this.ifDispatchVideoError = true;
this.ifDispatchVideoType = true;
this.ifDispatchAudioError = true;
// this.addBuffCount=0;
}
controlCalBitRate() {
this.isCalBitRate = !this.isCalBitRate;
}
// 计算码率
calBitRate() {
if (!this.t2 || !this.t1) {
return;
}
controlCalBitRate() {
this.isCalBitRate = !this.isCalBitRate
if (this.t2 - this.t1 > 3000) {
this.app.dispatch(
"bitrate",
Math.round(
(this.accumulateBitNum * 8) / ((this.t2 - this.t1) / 1000) / 1000
)
);
this.accumulateBitNum = 0;
this.t2 = this.t1 = undefined;
}
// 计算码率
calBitRate() {
if (!this.t2 || !this.t1) {
return
}
if ((this.t2 - this.t1) > 3000) {
this.app.dispatch('bitrate', Math.round((this.accumulateBitNum * 8 / ((this.t2 - this.t1) / 1000)) / 1000));
this.accumulateBitNum = 0;
this.t2 = this.t1 = undefined;
}
}
addDataPackage(e, type) {
// console.log("this.wholeOffset:"+this.wholeOffset)
//判断当前状态是否异常,并且不是第一个包,
if (this.packageState) {
if (this.ifFirstPackage(e.data)) {
this.packageState = 0;
this.wholeOffset = 0;
} else {
return;
}
}
addDataPackage(e, type) {
// console.log("this.wholeOffset:"+this.wholeOffset)
//判断当前状态是否异常,并且不是第一个包,
if (this.packageState) {
if (this.ifFirstPackage(e.data)) {
this.packageState = 0;
this.wholeOffset = 0;
} else {
return;
}
}
//处理message,判断包是否满了(判断的标准是收到长度等于包长度)
if (this.ifFull(type)) {
//如果满了
//this.whole.buffer获取此数组引用的 ArrayBuffer
var socketBA = new ByteArray(this.whole.buffer, this.wholeOffset);
let verbonc = socketBA.ReadUint32(); //verbonc
let company = socketBA.ReadUint32(); //company
let imsgType = socketBA.ReadUint32(); ////消息类型
let linType = socketBA.ReadUint32(); //指令类型
let iCmdLen = socketBA.ReadUint32(); //指令长度(包体的长度)
let allDataLength = socketBA.ReadUint32(); //数据全长
let leftField = socketBA.ReadUint32(); //保留字段
//处理message,判断包是否满了(判断的标准是收到长度等于包长度)
if (this.ifFull(type)) {
//如果满了
//this.whole.buffer获取此数组引用的 ArrayBuffer
var socketBA = new ByteArray(this.whole.buffer, this.wholeOffset);
let verbonc = socketBA.ReadUint32();//verbonc
let company = socketBA.ReadUint32();//company
let imsgType = socketBA.ReadUint32();////消息类型
let linType = socketBA.ReadUint32();//指令类型
let iCmdLen = socketBA.ReadUint32();//指令长度(包体的长度)
let allDataLength = socketBA.ReadUint32();//数据全长
let leftField = socketBA.ReadUint32();//保留字段
// 如果是视频回放,指针还要向后移动这些才到数据体
var timestamp;
if (this.app.playback) {
timestamp = socketBA.ReadInt53();
let nFlag = socketBA.ReadUint16(true); // 1603代表视频 1604代表音频
let videoParam = socketBA.ReadUint16(true); //i帧抽帧的参数
let nDataLen = socketBA.ReadUint32(true);
let nHeadLen = socketBA.ReadUint32(true);
let IFrame = socketBA.ReadString(1);
let sChannelID = socketBA.ReadString(42);
}
// console.log(imsgType)
if (imsgType == 2501) {
console.log(imsgType);
}
switch (imsgType) {
case 1603: // 视频数据
var biSize = socketBA.ReadUint32(true); //4字节
var biWidth = socketBA.ReadUint32(true); //4字节
var biHeight = socketBA.ReadUint32(true); //4字节
var biPlanes = socketBA.ReadUint16(true); //2字节
var biBitCount = socketBA.ReadUint16(true); //2字节
var biCompression = socketBA.ReadUint32(true); //4字节
var biSizeImage = socketBA.ReadUint32(true); //4字节
var biXPelsPerMeter = socketBA.ReadUint32(true); //4字节
var biYPelsPerMeter = socketBA.ReadUint32(true); //4字节
// var biClrUsed=socketBA.ReadUint32(true);//4v
var biClrUsed = socketBA.ReadString(4);
var biClrImportant = socketBA.ReadUint32(true); //4字节
// var timestamp=biXPelsPerMeter*1000 + Math.floor(biYPelsPerMeter/1000);
var timePoint =
biXPelsPerMeter * 1000 + Math.floor(biYPelsPerMeter / 1000);
if (!this.start) {
this.app.videoHeight = biHeight;
this.app.videoWidth = biWidth;
var timestamp =
biXPelsPerMeter * 1000 + Math.floor(biYPelsPerMeter / 1000);
// 如果是视频回放,指针还要向后移动这些才到数据体
var timestamp
if (this.app.playback) {
timestamp = socketBA.ReadInt53();
let nFlag = socketBA.ReadUint16(true);// 1603代表视频 1604代表音频
let videoParam = socketBA.ReadUint16(true) //i帧抽帧的参数
let nDataLen = socketBA.ReadUint32(true);
let nHeadLen = socketBA.ReadUint32(true);
let IFrame = socketBA.ReadString(1);
let sChannelID = socketBA.ReadString(42);
}
// console.log(imsgType)
if (imsgType == 2501) {
console.log(imsgType)
}
switch (imsgType) {
case 1603: // 视频数据
var biSize = socketBA.ReadUint32(true);//4字节
var biWidth = socketBA.ReadUint32(true);//4字节
var biHeight = socketBA.ReadUint32(true);//4字节
var biPlanes = socketBA.ReadUint16(true);//2字节
var biBitCount = socketBA.ReadUint16(true);//2字节
var biCompression = socketBA.ReadUint32(true);//4字节
var biSizeImage = socketBA.ReadUint32(true);//4字节
var biXPelsPerMeter = socketBA.ReadUint32(true);//4字节
var biYPelsPerMeter = socketBA.ReadUint32(true);//4字节
// var biClrUsed=socketBA.ReadUint32(true);//4v
var biClrUsed = socketBA.ReadString(4)
var biClrImportant = socketBA.ReadUint32(true);//4字节
// var timestamp=biXPelsPerMeter*1000 + Math.floor(biYPelsPerMeter/1000);
var timePoint = biXPelsPerMeter * 1000 + Math.floor(biYPelsPerMeter / 1000);
if (!this.start) {
this.app.videoHeight = biHeight;
this.app.videoWidth = biWidth;
var timestamp = biXPelsPerMeter * 1000 + Math.floor(biYPelsPerMeter / 1000);
this.app.startTime = timestamp;
// console.log(biHeight,biWidth)
this.start = true;
}
// 是否需要计算码率
if (this.isCalBitRate) {
this.t1 ? (this.t2 = timePoint) : (this.t1 = timePoint);
this.accumulateBitNum += biSizeImage;
this.calBitRate();
}
this.app.startTime = timestamp;
// console.log(biHeight,biWidth)
this.start = true;
}
// 是否需要计算码率
if (this.isCalBitRate) {
this.t1 ? this.t2 = timePoint : this.t1 = timePoint
this.accumulateBitNum += biSizeImage
this.calBitRate()
}
//把当前时间传出去
if (timestamp) {
// console.log(timestamp)
this.app.dispatch("currentTime", timestamp * 1000);
}
//把当前时间传出去
if (timestamp) {
// console.log(timestamp)
this.app.dispatch('currentTime', timestamp * 1000);
}
// 判断数据类型是否改变
if (this.ifDispatchVideoType || this.codeType!==biClrUsed ) {
console.log("biClrUsed:"+biClrUsed);
if (biClrUsed === 'H264') {
this.codeType = 'H264'
this.app.dispatch('onGetVideoCode','H264');
this.ifDispatchVideoType = false;
} else if(biClrUsed === 'H265'){
// 验证是否具备h265解码的功能
this.codeType = 'H265'
this.app.dispatch('onGetVideoCode','H265');
this.app.dispatch('h265Info',{
videoCanvasHeight:biHeight,
videoCanvasWidth:biWidth
})
this.ifDispatchVideoType = false;
// this.app.dispatch('')
}else{
// this.app.dispatch('restart');
console.log('丢弃')
}
break;
}
// if(biClrUsed != 'H264' && this.ifDispatchVideoError){
// this.ifDispatchVideoError = false
// this.app.dispatch('error','当前摄像头视频编码不是h264')
// }
// 删除私有头,取视频的裸数据(h264或者h265)
var videoBuf = socketBA.SliceNewAB(biSizeImage);
if (this.ifDispatchBuf && this.ifDispatchBuf_h265) {
// let dataTeime=new Date().getTime();
this.app.dispatch('videoBufferAdd', videoBuf);
// let jiange=new Date().getTime()-dataTeime;
// console.log('videoBufferAdd推送数据耗时:'+jiange+'\n' )
// this.addBuffCount++;
// console.log("videoBufferAdd数据计数:"+this.addBuffCount)
} else {
console.log('丢弃')
}
// 判断数据类型是否改变
if (this.ifDispatchVideoType || this.codeType !== biClrUsed) {
console.log("biClrUsed:" + biClrUsed);
if (biClrUsed === "H264") {
this.codeType = "H264";
this.app.dispatch("onGetVideoCode", "H264");
this.ifDispatchVideoType = false;
} else if (biClrUsed === "H265") {
// 验证是否具备h265解码的功能
this.codeType = "H265";
this.app.dispatch("onGetVideoCode", "H265");
this.app.dispatch("h265Info", {
videoCanvasHeight: biHeight,
videoCanvasWidth: biWidth,
});
this.ifDispatchVideoType = false;
// this.app.dispatch('')
} else {
// this.app.dispatch('restart');
console.log("丢弃");
}
break;
}
// if(biClrUsed != 'H264' && this.ifDispatchVideoError){
// this.ifDispatchVideoError = false
// this.app.dispatch('error','当前摄像头视频编码不是h264')
// }
// 删除私有头,取视频的裸数据(h264或者h265)
var videoBuf = socketBA.SliceNewAB(biSizeImage);
if (this.ifDispatchBuf && this.ifDispatchBuf_h265) {
// let dataTeime=new Date().getTime();
this.app.dispatch("videoBufferAdd", videoBuf);
// let jiange=new Date().getTime()-dataTeime;
// console.log('videoBufferAdd推送数据耗时:'+jiange+'\n' )
// this.addBuffCount++;
// console.log("videoBufferAdd数据计数:"+this.addBuffCount)
} else {
console.log("丢弃");
}
break;
case 1604:
if (!this.app._player) {
break;
}
var audioSize = socketBA.ReadUint32(true);
var audioSampleRate = socketBA.ReadUint32(true);
var biHeight = socketBA.ReadUint32(true);
var biPlanes = socketBA.ReadUint16(true);
var biBitCount = socketBA.ReadUint16(true);
var biCompression = socketBA.ReadUint32(true);
var audioSizeImage = socketBA.ReadUint32(true);
var auXPelsPerMeter = socketBA.ReadUint32(true);
var auYPelsPerMeter = socketBA.ReadUint32(true);
// var auClrUsed=socketBA.ReadUint32(true);
var type = socketBA.ReadString(4);
var auClrImportant = socketBA.ReadUint32(true);
break;
case 1604:
if (type != "MPEG") {
if (this.ifDispatchAudioError) {
this.app.dispatch("error", "当前摄像头音频编码不是AAC");
this.ifDispatchAudioError = false;
}
} else {
var aacRawbuffer = socketBA.SliceNewAB(audioSizeImage);
var aacRawu8a = new Uint8Array(aacRawbuffer);
var sampleRateIndex = srMap.findIndex(
(item) => item === audioSampleRate
);
this.app._player.remuxController &&
(this.app._player.remuxController.samplingFrequencyIndex =
sampleRateIndex);
this.app._player.info &&
(this.app._player.info._samplingFrequencyIndex = sampleRateIndex);
this.app._player.nalsbonAudioarr &&
this.app._player.nalsbonAudioarr.push(aacRawu8a);
}
if(!this.app._player){
break;
}
var audioSize = socketBA.ReadUint32(true);
var audioSampleRate = socketBA.ReadUint32(true);
var biHeight = socketBA.ReadUint32(true);
var biPlanes = socketBA.ReadUint16(true);
var biBitCount = socketBA.ReadUint16(true);
var biCompression = socketBA.ReadUint32(true);
var audioSizeImage = socketBA.ReadUint32(true);
var auXPelsPerMeter = socketBA.ReadUint32(true);
var auYPelsPerMeter = socketBA.ReadUint32(true);
// var auClrUsed=socketBA.ReadUint32(true);
var type = socketBA.ReadString(4)
var auClrImportant = socketBA.ReadUint32(true);
break;
case 2500: // 人脸的几何框信息
var osdbuf = socketBA.SliceNewAB(iCmdLen);
var osdba = new ByteArray(osdbuf);
var second = osdba.ReadUint32(true);
var microseconds = osdba.ReadUint32(true);
var obOsd = new Object();
var leftRect = osdba.ReadUint32(true);
var topRect = osdba.ReadUint32(true);
var rightRect = osdba.ReadUint32(true);
var bottomRect = osdba.ReadUint32(true);
//rect
var left = osdba.ReadUint32(true);
var top = osdba.ReadUint32(true);
var right = osdba.ReadUint32(true);
var bottom = osdba.ReadUint32(true);
// obOsd.width = right - left;
// obOsd.height = bottom - top;
obOsd.sX = left;
obOsd.sY = top;
obOsd.eX = right;
obOsd.eY = bottom;
// 时间戳
obOsd.sec = second * 1000 + Math.floor(microseconds / 1000);
var nSize = osdba.ReadUint32(true);
if (nSize > 0) {
var osdPointArr = [];
for (var k = 0; k < nSize; k++) {
var pob = {};
pob.x = osdba.ReadUint32(true);
pob.y = osdba.ReadUint32(true);
osdPointArr.push(pob);
}
obOsd.pointArr = osdPointArr;
}
// this.faceOsdArr.push(obOsd);
this.app.dispatch("elementInfo", obOsd);
break;
case 2501: // 安防绘制的xml
var strxml = socketBA.ReadString(iCmdLen);
if (this.drawfunc) {
this.drawfunc();
} else {
this.drawfunc = throttle(
function (params) {
this.app.dispatch("xmlElementInfo", xotree.parseXML(strxml));
// console.log('xml图形消息')
},
2000,
1
);
this.drawfunc();
}
if (type != 'MPEG') {
if (this.ifDispatchAudioError) {
this.app.dispatch('error', '当前摄像头音频编码不是AAC');
this.ifDispatchAudioError = false;
}
} else {
var aacRawbuffer = socketBA.SliceNewAB(audioSizeImage);
var aacRawu8a = new Uint8Array(aacRawbuffer);
var sampleRateIndex = srMap.findIndex(item => item === audioSampleRate);
this.app._player.remuxController && (this.app._player.remuxController.samplingFrequencyIndex = sampleRateIndex);
this.app._player.info && (this.app._player.info._samplingFrequencyIndex = sampleRateIndex);
this.app._player.nalsbonAudioarr && this.app._player.nalsbonAudioarr.push(aacRawu8a);
}
break;
case 2804: // 是个啥序列不清楚,处理逻辑与人脸序列相同
break;
case 2500: // 人脸的几何框信息
var osdbuf = socketBA.SliceNewAB(iCmdLen);
var osdba = new ByteArray(osdbuf);
var second = osdba.ReadUint32(true);
var microseconds = osdba.ReadUint32(true);
var obOsd = new Object();
var leftRect = osdba.ReadUint32(true);
var topRect = osdba.ReadUint32(true);
var rightRect = osdba.ReadUint32(true);
var bottomRect = osdba.ReadUint32(true);
//rect
var left = osdba.ReadUint32(true);
var top = osdba.ReadUint32(true);
var right = osdba.ReadUint32(true);
var bottom = osdba.ReadUint32(true);
// obOsd.width = right - left;
// obOsd.height = bottom - top;
obOsd.sX = left;
obOsd.sY = top;
obOsd.eX = right;
obOsd.eY = bottom;
// 时间戳
obOsd.sec = second * 1000 + Math.floor(microseconds / 1000);
var nSize = osdba.ReadUint32(true);
if (nSize > 0) {
var osdPointArr = [];
for (var k = 0; k < nSize; k++) {
var pob = {};
pob.x = osdba.ReadUint32(true);
pob.y = osdba.ReadUint32(true);
osdPointArr.push(pob);
}
obOsd.pointArr = osdPointArr;
}
// this.faceOsdArr.push(obOsd);
this.app.dispatch('elementInfo', obOsd);
break;
case 2501: // 安防绘制的xml
var strxml = socketBA.ReadString(iCmdLen);
if (this.drawfunc) {
this.drawfunc()
} else {
this.drawfunc = throttle(function (params) {
this.app.dispatch('xmlElementInfo', xotree.parseXML(strxml));
// console.log('xml图形消息')
}, 2000, 1)
this.drawfunc()
}
case 2502: // 人脸序列
// console.log(imsgType)
var biXPels = socketBA.ReadUint32(true);
var biYPels = socketBA.ReadUint32(true);
socketBA.SetOffset(132);
var imgtype = socketBA.ReadUint32(true);
// console.log(imgtype)
var datasize6 = socketBA.ReadUint32(true);
var picbuf = socketBA.SliceNewAB(datasize6);
this.app.dispatch("imgInfo", picbuf);
break;
case 2503: // 车辆与车牌信息
this.osdType = "carosd";
var osdbufcar = socketBA.SliceNewAB(iCmdLen);
var osdbacar = new ByteArray(osdbufcar);
break;
case 2804: // 是个啥序列不清楚,处理逻辑与人脸序列相同
var secondCar = osdbacar.ReadUint32(true);
var microsecondsCar = osdbacar.ReadUint32(true);
case 2502: // 人脸序列
// console.log(imsgType)
var biXPels = socketBA.ReadUint32(true);
var biYPels = socketBA.ReadUint32(true);
socketBA.SetOffset(132);
var imgtype = socketBA.ReadUint32(true);
// console.log(imgtype)
var datasize6 = socketBA.ReadUint32(true);
var picbuf = socketBA.SliceNewAB(datasize6);
this.app.dispatch('imgInfo', picbuf);
break;
case 2503: // 车辆与车牌信息
this.osdType = 'carosd';
var osdbufcar = socketBA.SliceNewAB(iCmdLen);
var osdbacar = new ByteArray(osdbufcar);
var obOsdCar = new Object();
var secondCar = osdbacar.ReadUint32(true);
var microsecondsCar = osdbacar.ReadUint32(true);
obOsdCar.time = secondCar * 1000 + Math.floor(microsecondsCar / 1000);
var obOsdCar = new Object();
//车辆
var rectCarX = osdbacar.ReadUint32(true);
var rectCarY = osdbacar.ReadUint32(true);
var rectCarWidth = osdbacar.ReadUint32(true);
var rectCarHeight = osdbacar.ReadUint32(true);
//车牌
var rectCarNumX = osdbacar.ReadUint32(true);
var rectCarNumY = osdbacar.ReadUint32(true);
var rectCarNumWidth = osdbacar.ReadUint32(true);
var rectCarNumHeight = osdbacar.ReadUint32(true);
obOsdCar.time = secondCar * 1000 + Math.floor(microsecondsCar / 1000);
obOsdCar.x = rectCarX;
obOsdCar.y = rectCarY;
obOsdCar.carWid = rectCarWidth;
obOsdCar.carHei = rectCarHeight;
//车辆
var rectCarX = osdbacar.ReadUint32(true);
var rectCarY = osdbacar.ReadUint32(true);
var rectCarWidth = osdbacar.ReadUint32(true);
var rectCarHeight = osdbacar.ReadUint32(true);
//车牌
var rectCarNumX = osdbacar.ReadUint32(true);
var rectCarNumY = osdbacar.ReadUint32(true);
var rectCarNumWidth = osdbacar.ReadUint32(true);
var rectCarNumHeight = osdbacar.ReadUint32(true);
obOsdCar.numX = rectCarNumX;
obOsdCar.numY = rectCarNumY;
obOsdCar.carnumWid = rectCarNumWidth;
obOsdCar.carnumHei = rectCarNumHeight;
this.app.dispatch("carOsdInfo", obOsdCar);
// this.carNumOsdArr.push(obOsdCar);
break;
case 2801: // 安防的信息框
this.osdType = "securityOsd";
obOsdCar.x = rectCarX;
obOsdCar.y = rectCarY;
obOsdCar.carWid = rectCarWidth;
obOsdCar.carHei = rectCarHeight;
var securityOsdbuf = socketBA.SliceNewAB(iCmdLen);
var securityOsdba = new ByteArray(securityOsdbuf);
obOsdCar.numX = rectCarNumX;
obOsdCar.numY = rectCarNumY;
obOsdCar.carnumWid = rectCarNumWidth;
obOsdCar.carnumHei = rectCarNumHeight;
this.app.dispatch('carOsdInfo', obOsdCar);
// this.carNumOsdArr.push(obOsdCar);
break;
case 2801: // 安防的信息框
this.osdType = 'securityOsd';
var second2801 = securityOsdba.ReadUint32(true);
var microseconds2801 = securityOsdba.ReadUint32(true);
var channelID = securityOsdba.ReadString(64);
var sceneImageID = securityOsdba.ReadString(64);
var eventType = securityOsdba.ReadUint32(true);
var securityOsdbuf = socketBA.SliceNewAB(iCmdLen);
var securityOsdba = new ByteArray(securityOsdbuf);
var alarmType = securityOsdba.ReadUint32(true);
var alarmSize = securityOsdba.ReadUint32(true);
var securityOSD = new Object();
var securityPointArr = [];
securityOSD.sec =
second2801 * 1000 + Math.floor(microseconds2801 / 1000);
// console.log(alarmSize)
if (alarmType === 1) {
var evnetID = securityOsdba.ReadUint8();
var evnetType = securityOsdba.ReadUint32(true);
securityOsdba.SetOffset(6);
//=====================rect============
var left2801 = securityOsdba.ReadUint32(true);
var top2801 = securityOsdba.ReadUint32(true);
var right2801 = securityOsdba.ReadUint32(true);
var bottom2801 = securityOsdba.ReadUint32(true);
var second2801 = securityOsdba.ReadUint32(true);
var microseconds2801 = securityOsdba.ReadUint32(true);
var channelID = securityOsdba.ReadString(64);
var sceneImageID = securityOsdba.ReadString(64);
var eventType = securityOsdba.ReadUint32(true);
var targetArea = securityOsdba.ReadUint32(true);
var alarmRuleID = securityOsdba.ReadString(64);
var alarmValue = securityOsdba.ReadUint32(true);
var alarmType = securityOsdba.ReadUint32(true);
var alarmSize = securityOsdba.ReadUint32(true);
var securityOSD = new Object();
var securityPointArr = [];
securityOSD.sec = second2801 * 1000 + Math.floor(microseconds2801 / 1000);
// console.log(alarmSize)
if (alarmType === 1) {
var evnetID = securityOsdba.ReadUint8();
var evnetType = securityOsdba.ReadUint32(true);
securityOsdba.SetOffset(6);
//=====================rect============
var left2801 = securityOsdba.ReadUint32(true);
var top2801 = securityOsdba.ReadUint32(true);
var right2801 = securityOsdba.ReadUint32(true);
var bottom2801 = securityOsdba.ReadUint32(true);
securityOSD.width = right2801 - left2801;
securityOSD.height = bottom2801 - top2801;
securityOSD.x = left2801;
securityOSD.y = top2801;
securityOSD.color = "target";
securityOSD.txt = CSecurityVideoDetectTask(eventType); //+" 数值:"+alarmValue;
} else if (alarmType === 2) {
var currulenum = securityOsdba.ReadUint32(true); //密度检测区域数
var pointSecurity2 = {};
//trace(currulenum)
pointSecurity2.x = securityOsdba.ReadUint32(true);
pointSecurity2.y = securityOsdba.ReadUint32(true);
securityOsdba.SetOffset(56);
var targetArea = securityOsdba.ReadUint32(true);
var alarmRuleID = securityOsdba.ReadString(64);
var alarmValue = securityOsdba.ReadUint32(true);
var curDensity = securityOsdba.ReadUint32(true); //当前密度值
securityOSD.width = right2801 - left2801;
securityOSD.height = bottom2801 - top2801;
securityOSD.x = left2801;
securityOSD.y = top2801;
securityOSD.color = 'target';
securityOSD.txt = CSecurityVideoDetectTask(eventType); //+" 数值:"+alarmValue;
} else if (alarmType === 2) {
var currulenum = securityOsdba.ReadUint32(true); //密度检测区域数
var pointSecurity2 = {};
//trace(currulenum)
pointSecurity2.x = securityOsdba.ReadUint32(true);
pointSecurity2.y = securityOsdba.ReadUint32(true);
securityOsdba.SetOffset(56);
securityOSD.density = "密度值:" + curDensity;
} else if (alarmType === 3) {
var Anum = securityOsdba.ReadUint32(true); //A方向流量
var Bnum = securityOsdba.ReadUint32(true); //B方向流量
var num = securityOsdba.ReadUint32(true); //区域内总数
var curDensity = securityOsdba.ReadUint32(true); //当前密度值
securityOSD.textvalue =
"A方向:" + Anum + " B方向:" + Bnum + " 区域内总数:" + num;
} else if (alarmType === 4) {
var ntargetID = securityOsdba.ReadUint32(true);
//===============rect==================
var left28014 = securityOsdba.ReadUint32(true);
var top28014 = securityOsdba.ReadUint32(true);
var right28014 = securityOsdba.ReadUint32(true);
var bottom28014 = securityOsdba.ReadUint32(true);
securityOSD.density = "密度值:" + curDensity;
} else if (alarmType === 3) {
var Anum = securityOsdba.ReadUint32(true); //A方向流量
var Bnum = securityOsdba.ReadUint32(true); //B方向流量
var num = securityOsdba.ReadUint32(true); //区域内总数
securityOSD.width = right28014 - left28014;
securityOSD.height = bottom28014 - top28014;
securityOSD.x = left28014;
securityOSD.y = top28014;
securityOSD.textvalue = "A方向:" + Anum + " B方向:" + Bnum + " 区域内总数:" + num;
} else if (alarmType === 4) {
var ntargetID = securityOsdba.ReadUint32(true);
//===============rect==================
var left28014 = securityOsdba.ReadUint32(true);
var top28014 = securityOsdba.ReadUint32(true);
var right28014 = securityOsdba.ReadUint32(true);
var bottom28014 = securityOsdba.ReadUint32(true);
var pointSecurity4 = {};
pointSecurity4.x = securityOsdba.ReadUint32(true);
pointSecurity4.y = securityOsdba.ReadUint32(true);
securityOSD.width = right28014 - left28014;
securityOSD.height = bottom28014 - top28014;
securityOSD.x = left28014;
securityOSD.y = top28014;
securityPointArr.push(pointSecurity4);
} else if (alarmType === 5) {
break;
}
var pointSecurity4 = {};
pointSecurity4.x = securityOsdba.ReadUint32(true);
pointSecurity4.y = securityOsdba.ReadUint32(true);
securityOSD.pointArr = securityPointArr;
this.app.dispatch("safeOsdInfo", securityOSD);
// if(securityOSD.pointArr.length>0)
// this.securityOsdArr.push(securityOSD);
// console.log(securityOSD)
break;
default:
console.log(imsgType);
break;
}
securityPointArr.push(pointSecurity4);
} else if (alarmType === 5) {
break;
}
securityOSD.pointArr = securityPointArr;
this.app.dispatch('safeOsdInfo', securityOSD);
// if(securityOSD.pointArr.length>0)
// this.securityOsdArr.push(securityOSD);
// console.log(securityOSD)
break;
default:
console.log(imsgType)
break;
}
this.wholeOffset = 0;
this.MergeBuffer(this.whole, e.data);
this.packageNum = 0;
this.wholeOffset = 0;
this.MergeBuffer(this.whole, e.data);
this.packageNum = 0;
} else {
// console.log('包没满')
//包没满当接收长度小于包长度时,不断的接收合并数据,直到接收到长度等于包长度才开始走ifFull方法,去解码。
//如果没满,看当前状态,如果状态正常,合并,如果异常,丢弃
if (!this.packageState) {
// 0状态正常 1异常
//如果没满又来了第一包
if (this.ifFirstPackage(e.data)) {
//包未满的情况下会出现company !== 1112757248,此时只需合并即可。如果包未满的情况下出现了company == 1112757248,说明包没有满的情况下,又出现了一个新包,此时指针回原点
// console.log('目前接收总长度:',this.wholeOffset,'新数据长度:',this.ifFirstPackage(e.data));
// console.log('数据包未收全,出现新包头,指针回原点==>丢弃上一包,收集新的一包')
this.wholeOffset = 0;
}
this.MergeBuffer(this.whole, e.data);
this.packageNum++;
// console.log("this.packageNum:"+ this.packageNum)
} else {
//如果状态异常,判断这个包是不是合法包
if (this.ifFirstPackage(e.data)) {
this.wholeOffset = 0;
this.packageState = 0;
this.MergeBuffer(this.whole, e.data);
} else {
// console.log('包没满')
//包没满当接收长度小于包长度时,不断的接收合并数据,直到接收到长度等于包长度才开始走ifFull方法,去解码。
//如果没满,看当前状态,如果状态正常,合并,如果异常,丢弃
if (!this.packageState) {// 0状态正常 1异常
//如果没满又来了第一包
if (this.ifFirstPackage(e.data)) { //包未满的情况下会出现company !== 1112757248,此时只需合并即可。如果包未满的情况下出现了company == 1112757248,说明包没有满的情况下,又出现了一个新包,此时指针回原点
// console.log('目前接收总长度:',this.wholeOffset,'新数据长度:',this.ifFirstPackage(e.data));
// console.log('数据包未收全,出现新包头,指针回原点==>丢弃上一包,收集新的一包')
this.wholeOffset = 0;
}
this.MergeBuffer(this.whole, e.data);
this.packageNum++;
// console.log("this.packageNum:"+ this.packageNum)
} else {
//如果状态异常,判断这个包是不是合法包
if(this.ifFirstPackage(e.data)){
this.wholeOffset = 0;
this.packageState = 0;
this.MergeBuffer(this.whole, e.data);
}else{
console.log('数据粘包,存在数据丢失')
}
return;
}
console.log("数据粘包,存在数据丢失");
}
return;
}
}
/**
* 判断单个包是否满了
* @param {ArrayBuffer} data
*/
ifFull(type) {
if (!this.wholeOffset) {
return false;
}
/**
* 判断单个包是否满了
* @param {ArrayBuffer} data
*/
ifFull(type) {
if (!this.wholeOffset) {
return false;
}
//判断包数据长度是否小于28
if (this.whole.buffer.byteLength < 28) {
console.log("包头长度小于28==》", this.whole.buffer.byteLength);
return false;
}
let socketBA = new ByteArray(this.whole.buffer, this.wholeOffset);
let verbonc = socketBA.ReadUint32(); //verbonc
let company = socketBA.ReadUint32(); //company
let imsgType = socketBA.ReadUint32(); //消息类型
let linType = socketBA.ReadUint32(); //指令类型
let iCmdLen = socketBA.ReadUint32(); //指令长度
let allDataLength = socketBA.ReadUint32(); //数据全长
let leftField = socketBA.ReadUint32(); //保留字段
if (company !== 1112757248) {
//'BST '
console.log("丢失第一包");
this.packageState = 1;
return false;
}
// console.log('包满时company:'+company)
if (verbonc == 256) {
if (socketBA.bytesAvailable < iCmdLen) {
// 如果长度小于包长度,代表包未满,但并未异常,继续合并数据
// console.log("有效长度:"+socketBA.bytesAvailable+"小于包长:"+iCmdLen)
return false;
} else if (socketBA.bytesAvailable === iCmdLen) {
//如果长度等于包长度,代表包满了。
// console.log("有效长度:"+socketBA.bytesAvailable+"等于包长:"+iCmdLen)
return true;
} else if (socketBA.bytesAvailable > iCmdLen) {
//如果长度大于包长度,则视为异常,异常的同时判断是正常包继续合并,否则丢弃
// console.log("有效长度:"+socketBA.bytesAvailable+"超过包长:"+iCmdLen)
// console.log('已收数据超过iCmdLen')
this.packageState = 1;
return false;
}
} else if (verbonc == 512 && type == "playback") {
if (socketBA.bytesAvailable < iCmdLen + 4) {
return false;
} else if (socketBA.bytesAvailable === iCmdLen + 4) {
let lastByte = socketBA.ReadUint32Last(allDataLength - 4);
// console.log('尾部4字节',lastByte, iCmdLen)
if (lastByte !== iCmdLen) {
this.packageState = 1;
return false;
}
//判断包数据长度是否小于28
if(this.whole.buffer.byteLength<28){
console.log('包头长度小于28==》',this.whole.buffer.byteLength)
return false
}
let socketBA = new ByteArray(this.whole.buffer, this.wholeOffset)
let verbonc = socketBA.ReadUint32();//verbonc
let company = socketBA.ReadUint32();//company
let imsgType = socketBA.ReadUint32();//消息类型
let linType = socketBA.ReadUint32();//指令类型
let iCmdLen = socketBA.ReadUint32();//指令长度
let allDataLength = socketBA.ReadUint32();//数据全长
let leftField = socketBA.ReadUint32();//保留字段
if (company !== 1112757248) {//'BST '
console.log('丢失第一包')
this.packageState = 1;
return false
}
// console.log('包满时company:'+company)
if(verbonc == 256){
if (socketBA.bytesAvailable < iCmdLen) { // 如果长度小于包长度,代表包未满,但并未异常,继续合并数据
// console.log("有效长度:"+socketBA.bytesAvailable+"小于包长:"+iCmdLen)
return false;
} else if (socketBA.bytesAvailable === iCmdLen) { //如果长度等于包长度,代表包满了。
// console.log("有效长度:"+socketBA.bytesAvailable+"等于包长:"+iCmdLen)
return true;
} else if (socketBA.bytesAvailable > iCmdLen) { //如果长度大于包长度,则视为异常,异常的同时判断是正常包继续合并,否则丢弃
// console.log("有效长度:"+socketBA.bytesAvailable+"超过包长:"+iCmdLen)
// console.log('已收数据超过iCmdLen')
this.packageState = 1;
return false
}
}else if(verbonc == 512 && type == 'playback'){
if (socketBA.bytesAvailable < iCmdLen+4) {
return false;
} else if (socketBA.bytesAvailable === iCmdLen+4) {
let lastByte = socketBA.ReadUint32Last(allDataLength-4);
// console.log('尾部4字节',lastByte, iCmdLen)
if(lastByte !== iCmdLen){
this.packageState = 1;
return false;
}
return true;
} else if (socketBA.bytesAvailable > iCmdLen+4) {
console.log('包长度超过iCmdLen')
this.packageState = 1;
return false
}
}else{
return false;
}
return true;
} else if (socketBA.bytesAvailable > iCmdLen + 4) {
console.log("包长度超过iCmdLen");
this.packageState = 1;
return false;
}
} else {
return false;
}
}
/**
* 判断这包数据是不是第一包,判断的是这个包是否有效
* @param {ArrayBuffer} data
*/
ifFirstPackage(data) {
if (data.byteLength < 28) {
console.log('出现了小于28字节的包');
return false;
}
// console.log(data)
let socketBA = new ByteArray(data);
//let verbonc = socketBA.ReadUint32();//verbonc
let verbonc = socketBA.ReadUint32();//verbonc
let company = socketBA.ReadUint32();//company
let imsgType = socketBA.ReadUint32();//消息类型
let linType = socketBA.ReadUint32();//指令类型
let iCmdLen = socketBA.ReadUint32();//指令长度
let allDataLength = socketBA.ReadUint32();//数据全长
let leftField = socketBA.ReadUint32();//保留字段
if (company !== 1112757248) {//'BST ' 只有当包满的时候company== 1112757248
// console.log('包未满ifFirstPackage:'+company)
return false;
} else {
return iCmdLen;
}
/**
* 判断这包数据是不是第一包,判断的是这个包是否有效
* @param {ArrayBuffer} data
*/
ifFirstPackage(data) {
if (data.byteLength < 28) {
console.log("出现了小于28字节的包");
return false;
}
// console.log(data)
let socketBA = new ByteArray(data);
//let verbonc = socketBA.ReadUint32();//verbonc
let verbonc = socketBA.ReadUint32(); //verbonc
let company = socketBA.ReadUint32(); //company
let imsgType = socketBA.ReadUint32(); //消息类型
let linType = socketBA.ReadUint32(); //指令类型
let iCmdLen = socketBA.ReadUint32(); //指令长度
let allDataLength = socketBA.ReadUint32(); //数据全长
let leftField = socketBA.ReadUint32(); //保留字段
if (company !== 1112757248) {
//'BST ' 只有当包满的时候company== 1112757248
// console.log('包未满ifFirstPackage:'+company)
return false;
} else {
return iCmdLen;
}
}
/**
*
* @param {Uint8Array} whole
* @param {ArrayBuffer} arr1
* @param {ArrayBuffer} arr2
*/
MergeBuffer(whole, arr1) {
// debugger
//var sumLength = arr1.byteLength+arr2.byteLength;
try {
//源数组中的所有值都会被拷贝到目标数组中去。第一个参数是源数据;第二个参数是偏移量
whole.set(new Uint8Array(arr1), this.wholeOffset);
this.wholeOffset += arr1.byteLength;
} catch (err) {
debugger
}
/**
*
* @param {Uint8Array} whole
* @param {ArrayBuffer} arr1
* @param {ArrayBuffer} arr2
*/
MergeBuffer(whole, arr1) {
// debugger
//var sumLength = arr1.byteLength+arr2.byteLength;
try {
//源数组中的所有值都会被拷贝到目标数组中去。第一个参数是源数据;第二个参数是偏移量
whole.set(new Uint8Array(arr1), this.wholeOffset);
this.wholeOffset += arr1.byteLength;
} catch (err) {
debugger;
}
// whole.set(new Uint8Array(arr2),this.wholeOffset);
// this.wholeOffset+= arr2.byteLength;
// var whole = new Uint8Array(sumLength);
// var pos = 0;
// for(var key in arguments){
// // for(var d = 0; d < arguments[key].byteLength; ++d){
// // whole.set(new Uint8Array(arguments[key]),pos);
// // pos += arguments[key].byteLength;
// // }
// whole.set(new Uint8Array(arguments[key]),pos);
// pos += arguments[key].byteLength;
// }
// whole.set(new Uint8Array(arr2),this.wholeOffset);
// this.wholeOffset+= arr2.byteLength;
// var whole = new Uint8Array(sumLength);
// var pos = 0;
// for(var key in arguments){
// // for(var d = 0; d < arguments[key].byteLength; ++d){
// // whole.set(new Uint8Array(arguments[key]),pos);
// // pos += arguments[key].byteLength;
// // }
// whole.set(new Uint8Array(arguments[key]),pos);
// pos += arguments[key].byteLength;
// }
//return whole.buffer;
}
//return whole.buffer;
}
}
export default SocketDataMerge;

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc