You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

159 lines
4.3 KiB

//webrtc datachannel send h265 jpeg
var h265DC;
var bWorking=false;
var h265data=null;
var h265datalen=0;
var packet=0;
var expectLength = 4;
// var bserialopen = false
function isString(str){
return (typeof str=='string')&&str.constructor==String;
}
// function reportData (len, seq, data) {
// var objData = {
// t: kFileData,
// s: start,
// e: end,
// d: data,
// q: seq
// };
// postMessage(objData, [objData.d]);
// };
function hexToStr(hex,encoding) {
var trimedStr = hex.trim();
var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
var len = rawStr.length;
if (len % 2 !== 0) {
alert("Illegal Format ASCII Code!");
return "";
}
var curCharCode;
var resultStr = [];
for (var i = 0; i < len; i = i + 2) {
curCharCode = parseInt(rawStr.substr(i, 2), 16);
resultStr.push(curCharCode);
}
// encoding为空时默认为utf-8
var bytesView = new Uint8Array(resultStr);
var str = new TextDecoder(encoding).decode(bytesView);
return str;
}
function dump_hex(h265data,h265datalen){
// console.log(h265data.toString());
var str="0x"
for (var i = 0; i < h265datalen; i ++ ) {
var byte =h265data.slice(i,i+1)[0];
str+=byte.toString(16)
str+=" "
// console.log((h265datalen+i).toString(16)+" ");
}
console.log(str);
}
function appendBuffer (buffer1, buffer2) {
var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
tmp.set(new Uint8Array(buffer1), 0);
tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
return tmp.buffer;
};
function reportStream(size){
}
function stopH265(){
if(h265DC!==null){
h265DC.close();
}
}
var receivet1=new Date().getTime();
function initH265DC(pc,player) {
console.log("initH265DC",Date());
h265DC = pc.createDataChannel("h265");
let bRecH265=false;
// var ctx = canvas.getContext("2d");
h265DC.onmessage = function (event) {
if(bRecH265){
if(isString(event.data)) {
if(event.data.indexOf("h265 end")!=-1){
bRecH265=false;
if(h265datalen>0){
const t2 = new Date().getTime()-receivet1;
console.log("receive time:"+t2+" len:"+h265datalen);
var req = {
t: ksendPlayerVideoFrameReq,
l: h265datalen,
d: h265data
};
player.postMessage(req,[req.d]);
h265data=null;
h265datalen=0;
packet=0;
receivet1=new Date().getTime();
}
return;
}
}else{
if (h265data != null) {
h265data=appendBuffer(h265data,event.data);
} else if (event.data.byteLength < expectLength) {
h265data = event.data.slice(0);
} else {
h265data=event.data;
}
h265datalen+=event.data.byteLength;
packet++;
// console.log("reveive: "+packet+": t len"+h265datalen)
return;
}
}
if(isString(event.data)) {
if(event.data.indexOf("h265 start")!=-1){
// console.log(event.data );
bRecH265=true;
packet=0;
return;
}
}
};
h265DC.onopen = function () {
console.log("h265 datachannel open");
var req = {
t: kInitPlayerReq,
};
player.postMessage(req);
bWorking = true;
};
h265DC.onclose = function () {
console.log("h265 datachannel close");
bWorking=false;
};
}
function handleUpdates(canvas, dc) {
setInterval(function () {
if (bWorking){
dc.send(JSON.stringify({ type: "h265" })); // frame update request
}
}, 500);
};