You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
5.7 KiB
JavaScript
219 lines
5.7 KiB
JavaScript
var rtspPlayer={
|
|
active:false,
|
|
type:'live',
|
|
hls:null,
|
|
ws:null,
|
|
mseSourceBuffer:null,
|
|
mse:null,
|
|
mseQueue:[],
|
|
mseStreamingStarted:false,
|
|
webrtc:null,
|
|
webrtcSendChannel:null,
|
|
webrtcSendChannelInterval:null,
|
|
uuid:null,
|
|
|
|
clearPlayer:function(){
|
|
if(this.active){
|
|
|
|
if(this.hls!=null){
|
|
this.hls.destroy();
|
|
this.hls=null;
|
|
}
|
|
if(this.ws!=null){
|
|
//close WebSocket connection if opened
|
|
this.ws.close(1000);
|
|
this.ws=null;
|
|
}
|
|
if(this.webrtc!=null){
|
|
clearInterval(this.webrtcSendChannelInterval);
|
|
|
|
this.webrtc=null;
|
|
}
|
|
$('#videoPlayer')[0].src = '';
|
|
$('#videoPlayer')[0].load();
|
|
|
|
|
|
this.active=false;
|
|
}
|
|
},
|
|
livePlayer:function(type,uuid){
|
|
this.clearPlayer();
|
|
this.uuid=uuid;
|
|
this.active=true;
|
|
|
|
$('.streams-vs-player').addClass('active-player');
|
|
if(type==0){
|
|
type=$('input[name=defaultPlayer]:checked').val()
|
|
}
|
|
switch (type) {
|
|
case 'hls':
|
|
this.playHls();
|
|
break;
|
|
case 'mse':
|
|
this.playMse();
|
|
break;
|
|
case 'webrtc':
|
|
this.playWebrtc();
|
|
break;
|
|
default:
|
|
Swal.fire(
|
|
'Sorry',
|
|
'This option is still under development',
|
|
'question'
|
|
)
|
|
return;
|
|
}
|
|
|
|
},
|
|
playHls:function(){
|
|
if(this.hls==null && Hls.isSupported()){
|
|
this.hls = new Hls();
|
|
}
|
|
if ($("#videoPlayer")[0].canPlayType('application/vnd.apple.mpegurl')) {
|
|
$("#videoPlayer")[0].src = this.streamPlayUrl('hls');
|
|
$("#videoPlayer")[0].load();
|
|
} else {
|
|
if (this.hls != null) {
|
|
this.hls.loadSource(this.streamPlayUrl('hls'));
|
|
this.hls.attachMedia($("#videoPlayer")[0]);
|
|
} else {
|
|
Swal.fire({
|
|
icon: 'error',
|
|
title: 'Oops...',
|
|
text: 'Your browser don`t support hls '
|
|
})
|
|
}
|
|
}
|
|
},
|
|
playWebrtc:function(){
|
|
var _this=this;
|
|
this.webrtc=new RTCPeerConnection({
|
|
iceServers: [{
|
|
urls: ["stun:stun.l.google.com:19302"]
|
|
}]
|
|
});
|
|
this.webrtc.onnegotiationneeded = this.handleNegotiationNeeded;
|
|
this.webrtc.ontrack = function(event) {
|
|
console.log(event.streams.length + ' track is delivered');
|
|
$("#videoPlayer")[0].srcObject = event.streams[0];
|
|
$("#videoPlayer")[0].play();
|
|
}
|
|
this.webrtc.addTransceiver('video', {
|
|
'direction': 'sendrecv'
|
|
});
|
|
this.webrtcSendChannel = this.webrtc.createDataChannel('foo');
|
|
this.webrtcSendChannel.onclose = () => console.log('sendChannel has closed');
|
|
this.webrtcSendChannel.onopen = () => {
|
|
console.log('sendChannel has opened');
|
|
this.webrtcSendChannel.send('ping');
|
|
this.webrtcSendChannelInterval = setInterval(() => {
|
|
this.webrtcSendChannel.send('ping');
|
|
}, 1000)
|
|
}
|
|
|
|
this.webrtcSendChannel.onmessage = e => console.log(e.data);
|
|
},
|
|
handleNegotiationNeeded: async function(){
|
|
var _this=rtspPlayer;
|
|
|
|
offer = await _this.webrtc.createOffer();
|
|
await _this.webrtc.setLocalDescription(offer);
|
|
$.post(_this.streamPlayUrl('webrtc'), {
|
|
data: btoa(_this.webrtc.localDescription.sdp)
|
|
}, function(data) {
|
|
//console.log(data)
|
|
try {
|
|
|
|
_this.webrtc.setRemoteDescription(new RTCSessionDescription({
|
|
type: 'answer',
|
|
sdp: atob(data)
|
|
}))
|
|
|
|
|
|
|
|
} catch (e) {
|
|
console.warn(e);
|
|
}
|
|
|
|
});
|
|
},
|
|
playMse:function(){
|
|
//console.log(this.streamPlayUrl('mse'));
|
|
var _this=this;
|
|
this.mse = new MediaSource();
|
|
$("#videoPlayer")[0].src=window.URL.createObjectURL(this.mse);
|
|
this.mse.addEventListener('sourceopen', function(){
|
|
_this.ws=new WebSocket(_this.streamPlayUrl('mse'));
|
|
_this.ws.binaryType = "arraybuffer";
|
|
_this.ws.onopen = function(event) {
|
|
console.log('Connect to ws');
|
|
}
|
|
|
|
_this.ws.onmessage = function(event) {
|
|
var data = new Uint8Array(event.data);
|
|
if (data[0] == 9) {
|
|
decoded_arr=data.slice(1);
|
|
if (window.TextDecoder) {
|
|
mimeCodec = new TextDecoder("utf-8").decode(decoded_arr);
|
|
} else {
|
|
mimeCodec = Utf8ArrayToStr(decoded_arr);
|
|
}
|
|
console.log(mimeCodec);
|
|
_this.mseSourceBuffer = _this.mse.addSourceBuffer('video/mp4; codecs="' + mimeCodec + '"');
|
|
_this.mseSourceBuffer.mode = "segments"
|
|
_this.mseSourceBuffer.addEventListener("updateend", _this.pushPacket);
|
|
|
|
} else {
|
|
_this.readPacket(event.data);
|
|
}
|
|
};
|
|
}, false);
|
|
|
|
},
|
|
readPacket:function(packet){
|
|
if (!this.mseStreamingStarted) {
|
|
this.mseSourceBuffer.appendBuffer(packet);
|
|
this.mseStreamingStarted = true;
|
|
return;
|
|
}
|
|
this.mseQueue.push(packet);
|
|
|
|
if (!this.mseSourceBuffer.updating) {
|
|
this.pushPacket();
|
|
}
|
|
},
|
|
pushPacket:function(){
|
|
var _this=rtspPlayer;
|
|
if (!_this.mseSourceBuffer.updating) {
|
|
if (_this.mseQueue.length > 0) {
|
|
packet = _this.mseQueue.shift();
|
|
var view = new Uint8Array(packet);
|
|
_this.mseSourceBuffer.appendBuffer(packet);
|
|
} else {
|
|
_this.mseStreamingStarted = false;
|
|
}
|
|
}
|
|
},
|
|
streamPlayUrl:function(type){
|
|
switch (type) {
|
|
case 'hls':
|
|
return '/stream/' + this.uuid + '/hls/live/index.m3u8';
|
|
break;
|
|
case 'mse':
|
|
var potocol = 'ws';
|
|
if (location.protocol == 'https:') {
|
|
potocol = 'wss';
|
|
}
|
|
return potocol+'://'+location.host+'/stream/' + this.uuid +'/mse?uuid='+this.uuid;
|
|
//return 'ws://sr4.ipeye.ru/ws/mp4/live?name=d4ee855e40874ef7b7149357a42f18f0';
|
|
break;
|
|
case 'webrtc':
|
|
return "/stream/"+this.uuid+"/webrtc?uuid=" + this.uuid;
|
|
break;
|
|
default:
|
|
return '';
|
|
}
|
|
}
|
|
|
|
}
|