240 lines
8.8 KiB
PHP
240 lines
8.8 KiB
PHP
<?php
|
||
$needLogin=false;
|
||
include( "head.php" );
|
||
?>
|
||
<style>
|
||
.video-cloud {
|
||
position: absolute;
|
||
width: 100%;
|
||
/*height: 100%;*/
|
||
height: 99.2%;
|
||
background: black;
|
||
z-index: 999;
|
||
font-size: 60px;
|
||
color: white;
|
||
transition: .3s color, .3s border;
|
||
display:flex;
|
||
align-items:center;
|
||
justify-content: center;
|
||
}
|
||
.loading {
|
||
display: inline-block;
|
||
width: 1.3em;
|
||
height: 1.3em;
|
||
color: inherit;
|
||
vertical-align: middle;
|
||
pointer-events: none;
|
||
border-top: .2em solid currentcolor;
|
||
border-right: .2em solid transparent;
|
||
-webkit-animation: loading 1s linear infinite;
|
||
animation: loading 1s linear infinite;
|
||
border-radius: 100%;
|
||
position: relative;
|
||
background: black;
|
||
}
|
||
@-webkit-keyframes loading {
|
||
to {
|
||
-webkit-transform: rotate(360deg);
|
||
transform: rotate(360deg);
|
||
}
|
||
}
|
||
@keyframes loading {
|
||
to {
|
||
-webkit-transform: rotate(360deg);
|
||
transform: rotate(360deg);
|
||
}
|
||
}
|
||
</style>
|
||
<div id="alert"></div>
|
||
|
||
<div class="row">
|
||
<div class="col-md-12">
|
||
<div class="panel panel-default">
|
||
<div class="title">
|
||
<form class="form-inline ">
|
||
<div class="form-group ">
|
||
<label class="control-label">
|
||
<cn>频道</cn>
|
||
<en>Channel</en>:
|
||
</label>
|
||
<select id="channels" class="form-control"></select>
|
||
</div>
|
||
<div id="bufferBox" class="form-group" style="margin-left: 10px;">
|
||
<label class="control-label">
|
||
<cn>缓冲</cn>
|
||
<en>Buffer</en>:
|
||
</label>
|
||
<div class="input-group">
|
||
<input id="buffer" type="text" class="form-control" value="500" style="width: 60px">
|
||
<div class="input-group-addon">ms</div>
|
||
</div>
|
||
</div>
|
||
<div id="warning" style="position: absolute;top: 20px;right: 40px;color: var(--btn_background);font-size: 20px;cursor: pointer">
|
||
<i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
<div class="panel-body">
|
||
<div class="row">
|
||
<div class="col-md-12">
|
||
<div style="width:100%; padding-bottom: 56.25%; position: relative;">
|
||
<video id="player" controls muted autoplay style="width:100%;height: 100%; position: absolute; background: #555;"></video>
|
||
<div id="jess" style="position: absolute;width: 100%;height: 100%;background: #555"></div>
|
||
<div class="video-cloud">
|
||
<div class="loading"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<script language="javascript" src="js/flv.js" ></script>
|
||
<script src="js/zcfg.js"></script>
|
||
<script src="vendor/switch/bootstrap-switch.js"></script>
|
||
<script src="js/jessibuca/jessibuca.js"></script>
|
||
<script>
|
||
$( function () {
|
||
navIndex( 4 );
|
||
$.fn.bootstrapSwitch.defaults.size = 'small';
|
||
$.fn.bootstrapSwitch.defaults.onColor = 'warning';
|
||
|
||
var bufferTime = localStorage.getItem("bufferTime");
|
||
if(bufferTime == null || bufferTime == "")
|
||
bufferTime = 200;
|
||
|
||
$("#buffer").val(bufferTime);
|
||
|
||
var ctx = '<div class="row">' +
|
||
'<div class="col-sm-12">' +
|
||
'<cn>1、使用h5播放器,需要开启对应视频通道的rtmp协议</cn>' +
|
||
'<en>1. To use H5 player, enable the RTMP protocol for the corresponding video channel</en>' +
|
||
'</div>' +
|
||
'<div class="col-sm-12">' +
|
||
'<cn>2、播放h265编码的视频流对电脑配置要求较高,如果遇到音视频卡顿问题,请更换性能更好的电脑播放</cn>' +
|
||
'<en>2. Playing H265 encoded video stream has high requirements for computer configuration. If you encounter audio and video delay problem, please replace the device with better performance</en>' +
|
||
'</div>' +
|
||
'</div>';
|
||
$("#warning").popover({content:ctx, html:true, placement:"left"});
|
||
|
||
var player=null;
|
||
function setChannel(codec,suffix,hasAudio){
|
||
$(".video-cloud").show();
|
||
if(player!=null)
|
||
{
|
||
if(player.hasOwnProperty("unload")) {
|
||
player.unload();
|
||
player.detachMediaElement();
|
||
}
|
||
player.destroy();
|
||
}
|
||
|
||
if(codec == "h265") {
|
||
$("#player").hide();
|
||
$("#jess").show();
|
||
$("#bufferBox").show();
|
||
player = new Jessibuca({
|
||
container: document.getElementById('jess'),
|
||
videoBuffer: bufferTime/1000,
|
||
decoder: "js/jessibuca/decoder.js",
|
||
isResize: true,
|
||
hasAudio: hasAudio,
|
||
operateBtns: {
|
||
fullscreen: true,
|
||
play: true,
|
||
audio: hasAudio,
|
||
},
|
||
forceNoOffscreen: true,
|
||
isNotMute: false,
|
||
});
|
||
player.play('http://'+window.location.host+'/flv?app=live&stream='+suffix);
|
||
player.on("play", function (flag) {
|
||
$(".video-cloud").hide();
|
||
})
|
||
} else {
|
||
$("#player").show();
|
||
$("#jess").hide();
|
||
$("#bufferBox").hide();
|
||
|
||
player = flvjs.createPlayer({
|
||
type: 'flv',
|
||
hasAudio: hasAudio,
|
||
url: 'http://'+window.location.host+'/flv?app=live&stream='+suffix
|
||
});
|
||
player.attachMediaElement(document.getElementById("player"));
|
||
player.load(); //加载
|
||
}
|
||
};
|
||
|
||
$("video")[0].addEventListener("canplay",function () {
|
||
$(".video-cloud").hide();
|
||
});
|
||
|
||
$( "#channels" ).change( function () {
|
||
var codec = $("#channels option:selected").attr("codec");
|
||
var suffix = $("#channels option:selected").attr("suffix");
|
||
var hasAudio = $("#channels option:selected").attr("hasAudio");
|
||
setChannel(codec, suffix, hasAudio);
|
||
} );
|
||
|
||
function checkDelay() {
|
||
if (player != null && player.hasOwnProperty("buffered") && player.buffered.length > 0) {
|
||
if (player.buffered.end(0) - player.currentTime > 1.5) {
|
||
player.currentTime = player.buffered.end(0) - 0.2
|
||
}
|
||
}
|
||
}
|
||
setInterval( checkDelay, 1000 );
|
||
|
||
var config;
|
||
$.getJSON( "config/config.json?rnd=" + Math.random(), function ( result ) {
|
||
config = result;
|
||
var first=-1;
|
||
var codec=-1;
|
||
var sufx = -1;
|
||
var hasAudio=false;
|
||
for ( var i = 0; i < config.length; i++ ) {
|
||
if ( !config[ i ].enable || !config[i].stream.rtmp )
|
||
continue;
|
||
|
||
var suffix = "stream"+config[i].id;
|
||
if(config[i].stream.hasOwnProperty("suffix"))
|
||
suffix = config[i].stream.suffix;
|
||
|
||
if(first==-1) {
|
||
first=config[ i ].id;
|
||
codec=config[ i ].encv.codec;
|
||
sufx = suffix;
|
||
if(config[ i ].enca.codec != "close")
|
||
hasAudio = true
|
||
}
|
||
$( "#channels" ).append( '<option value="' + config[ i ].id + '" codec="'+config[i].encv.codec+'"hasAudio="'+hasAudio+'" suffix="'+suffix+'" >' + config[ i ].name + '</option>' );
|
||
}
|
||
setChannel(codec, sufx, hasAudio);
|
||
} );
|
||
|
||
$("#warning").hover(function () {
|
||
if($(".popover").length > 0)
|
||
$(this).popover("hide");
|
||
else
|
||
$(this).popover("show");
|
||
})
|
||
|
||
$("#buffer").blur(function (){
|
||
var buffer = $("#buffer").val();
|
||
bufferTime = buffer;
|
||
localStorage.setItem("bufferTime",buffer);
|
||
var id = $( "#channels" ).val();
|
||
var codec = $("#channels option:selected").attr("codec");
|
||
var suffix = $("#channels option:selected").attr("suffix");
|
||
var hasAudio = $("#channels option:selected").attr("hasAudio");
|
||
setChannel(codec,suffix,hasAudio);
|
||
});
|
||
} );
|
||
</script>
|
||
<?php
|
||
include( "foot.php" );
|
||
?>
|