linkpi_firmware_history/rootfs/link/web/player.php

240 lines
8.8 KiB
PHP
Raw Normal View History

2024-02-15 22:07:30 +01:00
<?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>
2024-02-15 22:07:33 +01:00
<div id="jess" style="position: absolute;width: 100%;height: 100%;background: #555"></div>
2024-02-15 22:07:30 +01:00
<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;
2024-02-15 22:07:35 +01:00
function setChannel(codec,suffix,hasAudio){
2024-02-15 22:07:30 +01:00
$(".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",
2024-02-15 22:07:33 +01:00
isResize: true,
2024-02-15 22:07:35 +01:00
hasAudio: hasAudio,
2024-02-15 22:07:30 +01:00
operateBtns: {
fullscreen: true,
play: true,
2024-02-15 22:07:35 +01:00
audio: hasAudio,
2024-02-15 22:07:30 +01:00
},
forceNoOffscreen: true,
isNotMute: false,
});
2024-02-15 22:07:33 +01:00
player.play('http://'+window.location.host+'/flv?app=live&stream='+suffix);
2024-02-15 22:07:30 +01:00
player.on("play", function (flag) {
$(".video-cloud").hide();
})
} else {
$("#player").show();
$("#jess").hide();
$("#bufferBox").hide();
2024-02-15 22:07:35 +01:00
2024-02-15 22:07:30 +01:00
player = flvjs.createPlayer({
type: 'flv',
2024-02-15 22:07:35 +01:00
hasAudio: hasAudio,
2024-02-15 22:07:33 +01:00
url: 'http://'+window.location.host+'/flv?app=live&stream='+suffix
2024-02-15 22:07:30 +01:00
});
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");
2024-02-15 22:07:33 +01:00
var suffix = $("#channels option:selected").attr("suffix");
2024-02-15 22:07:35 +01:00
var hasAudio = $("#channels option:selected").attr("hasAudio");
setChannel(codec, suffix, hasAudio);
2024-02-15 22:07:30 +01:00
} );
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;
2024-02-15 22:07:33 +01:00
var sufx = -1;
2024-02-15 22:07:35 +01:00
var hasAudio=false;
2024-02-15 22:07:30 +01:00
for ( var i = 0; i < config.length; i++ ) {
if ( !config[ i ].enable || !config[i].stream.rtmp )
continue;
2024-02-15 22:07:33 +01:00
var suffix = "stream"+config[i].id;
if(config[i].stream.hasOwnProperty("suffix"))
suffix = config[i].stream.suffix;
2024-02-15 22:07:30 +01:00
if(first==-1) {
first=config[ i ].id;
codec=config[ i ].encv.codec;
2024-02-15 22:07:33 +01:00
sufx = suffix;
2024-02-15 22:07:35 +01:00
if(config[ i ].enca.codec != "close")
hasAudio = true
2024-02-15 22:07:30 +01:00
}
2024-02-15 22:07:35 +01:00
$( "#channels" ).append( '<option value="' + config[ i ].id + '" codec="'+config[i].encv.codec+'"hasAudio="'+hasAudio+'" suffix="'+suffix+'" >' + config[ i ].name + '</option>' );
2024-02-15 22:07:30 +01:00
}
2024-02-15 22:07:35 +01:00
setChannel(codec, sufx, hasAudio);
2024-02-15 22:07:30 +01:00
} );
$("#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");
2024-02-15 22:07:33 +01:00
var suffix = $("#channels option:selected").attr("suffix");
2024-02-15 22:07:35 +01:00
var hasAudio = $("#channels option:selected").attr("hasAudio");
setChannel(codec,suffix,hasAudio);
2024-02-15 22:07:30 +01:00
});
} );
</script>
<?php
include( "foot.php" );
?>