Embed: added hls.js player
This commit is contained in:
parent
97f040cefd
commit
dac00f6555
8 changed files with 171 additions and 2 deletions
|
@ -617,11 +617,13 @@ add_executable(MistOutHTTP
|
||||||
generated/webrtc.js.h
|
generated/webrtc.js.h
|
||||||
generated/mews.js.h
|
generated/mews.js.h
|
||||||
generated/flv.js.h
|
generated/flv.js.h
|
||||||
|
generated/hlsjs.js.h
|
||||||
generated/player_dash.js.h
|
generated/player_dash.js.h
|
||||||
generated/player_dash_lic.js.h
|
generated/player_dash_lic.js.h
|
||||||
generated/player_video.js.h
|
generated/player_video.js.h
|
||||||
generated/player_webrtc.js.h
|
generated/player_webrtc.js.h
|
||||||
generated/player_flv.js.h
|
generated/player_flv.js.h
|
||||||
|
generated/player_hlsjs.js.h
|
||||||
generated/skin_default.css.h
|
generated/skin_default.css.h
|
||||||
generated/skin_dev.css.h
|
generated/skin_dev.css.h
|
||||||
generated/skin_videojs.css.h
|
generated/skin_videojs.css.h
|
||||||
|
@ -729,6 +731,10 @@ add_custom_command(OUTPUT generated/flv.js.h
|
||||||
COMMAND ./sourcery ${SOURCE_DIR}/embed/min/wrappers/flv.js flv_js generated/flv.js.h
|
COMMAND ./sourcery ${SOURCE_DIR}/embed/min/wrappers/flv.js flv_js generated/flv.js.h
|
||||||
DEPENDS sourcery ${SOURCE_DIR}/embed/min/wrappers/flv.js
|
DEPENDS sourcery ${SOURCE_DIR}/embed/min/wrappers/flv.js
|
||||||
)
|
)
|
||||||
|
add_custom_command(OUTPUT generated/hlsjs.js.h
|
||||||
|
COMMAND ./sourcery ${SOURCE_DIR}/embed/min/wrappers/hlsjs.js hlsjs_js generated/hlsjs.js.h
|
||||||
|
DEPENDS sourcery ${SOURCE_DIR}/embed/min/wrappers/hlsjs.js
|
||||||
|
)
|
||||||
# players
|
# players
|
||||||
add_custom_command(OUTPUT generated/player_dash_lic.js.h
|
add_custom_command(OUTPUT generated/player_dash_lic.js.h
|
||||||
COMMAND ./sourcery ${SOURCE_DIR}/embed/players/dash.js.license.js player_dash_lic_js generated/player_dash_lic.js.h
|
COMMAND ./sourcery ${SOURCE_DIR}/embed/players/dash.js.license.js player_dash_lic_js generated/player_dash_lic.js.h
|
||||||
|
@ -750,6 +756,10 @@ add_custom_command(OUTPUT generated/player_flv.js.h
|
||||||
COMMAND ./sourcery ${SOURCE_DIR}/embed/players/flv.min.js player_flv_js generated/player_flv.js.h
|
COMMAND ./sourcery ${SOURCE_DIR}/embed/players/flv.min.js player_flv_js generated/player_flv.js.h
|
||||||
DEPENDS sourcery ${SOURCE_DIR}/embed/players/flv.min.js
|
DEPENDS sourcery ${SOURCE_DIR}/embed/players/flv.min.js
|
||||||
)
|
)
|
||||||
|
add_custom_command(OUTPUT generated/player_hlsjs.js.h
|
||||||
|
COMMAND ./sourcery ${SOURCE_DIR}/embed/players/hls.js player_hlsjs_js generated/player_hlsjs.js.h
|
||||||
|
DEPENDS sourcery ${SOURCE_DIR}/embed/players/hls.js
|
||||||
|
)
|
||||||
# css
|
# css
|
||||||
add_custom_command(OUTPUT generated/skin_default.css.h
|
add_custom_command(OUTPUT generated/skin_default.css.h
|
||||||
COMMAND ./sourcery ${SOURCE_DIR}/embed/min/skins/default.css skin_default_css generated/skin_default.css.h
|
COMMAND ./sourcery ${SOURCE_DIR}/embed/min/skins/default.css skin_default_css generated/skin_default.css.h
|
||||||
|
|
1
embed/min/wrappers/hlsjs.js
Normal file
1
embed/min/wrappers/hlsjs.js
Normal file
|
@ -0,0 +1 @@
|
||||||
|
mistplayers.hlsjs={name:"HLS.js player",mimes:["html5/application/vnd.apple.mpegurl","html5/application/vnd.apple.mpegurl;version=7"],priority:MistUtil.object.keys(mistplayers).length+1,isMimeSupported:function(e){return this.mimes.indexOf(e)==-1?false:true},isBrowserSupported:function(e,t,s){if(location.protocol!=MistUtil.http.url.split(t.url).protocol){s.log("HTTP/HTTPS mismatch for this source");return false}return true},player:function(){},scriptsrc:function(e){return e+"/hlsjs.js"}};var p=mistplayers.hlsjs.player;p.prototype=new MistPlayer;p.prototype.build=function(e,t){var s=this;var l=document.createElement("video");l.setAttribute("playsinline","");var r=["autoplay","loop","poster"];for(var i in r){var o=r[i];if(e.options[o]){l.setAttribute(o,e.options[o]===true?"":e.options[o])}}if(e.options.muted){l.muted=true}if(e.info.type=="live"){l.loop=false}if(e.options.controls=="stock"){l.setAttribute("controls","")}l.setAttribute("crossorigin","anonymous");this.setSize=function(e){l.style.width=e.width+"px";l.style.height=e.height+"px"};this.api=l;e.player.api.unload=function(){if(e.player.hls){e.player.hls.destroy();e.player.hls=false;e.log("hls.js instance disposed")}};function n(t){e.player.hls=new Hls({maxBufferLength:15,maxMaxBufferLength:60});e.player.hls.attachMedia(l);e.player.hls.on(Hls.Events.MEDIA_ATTACHED,function(){console.log("video and hls.js are now bound together !");e.player.hls.loadSource(t);e.player.hls.on(Hls.Events.MANIFEST_PARSED,function(e,t){console.log("manifest loaded, found "+t.levels.length+" quality level")})})}e.player.api.setSource=function(t){if(!e.player.hls){return}if(e.player.hls.url!=t){e.player.hls.destroy();n(t)}};e.player.api.setSubtitle=function(e){var t=l.getElementsByTagName("track");for(var s=t.length-1;s>=0;s--){l.removeChild(t[s])}if(e){var r=document.createElement("track");l.appendChild(r);r.kind="subtitles";r.label=e.label;r.srclang=e.lang;r.src=e.src;r.setAttribute("default","")}};function a(){n(e.source.url)}if("Hls"in window){a()}else{var p=e.urlappend(mistplayers.hlsjs.scriptsrc(e.options.host));MistUtil.scripts.insert(p,{onerror:function(t){var s="Failed to load hlsjs.js";if(t.message){s+=": "+t.message}e.showError(s)},onload:a},e)}t(l)};
|
File diff suppressed because one or more lines are too long
|
@ -46,6 +46,8 @@ echo " Minimizing wrappers.."
|
||||||
terser -mn -o min/wrappers/mews.js -- wrappers/mews.js
|
terser -mn -o min/wrappers/mews.js -- wrappers/mews.js
|
||||||
echo " Minimizing flv.js";
|
echo " Minimizing flv.js";
|
||||||
terser -mn -o min/wrappers/flv.js -- wrappers/flv.js
|
terser -mn -o min/wrappers/flv.js -- wrappers/flv.js
|
||||||
|
echo " Minimizing hls.js";
|
||||||
|
terser -mn -o min/wrappers/hlsjs.js -- wrappers/hlsjs.js
|
||||||
echo " Done.";
|
echo " Done.";
|
||||||
|
|
||||||
echo " Minimizing CSS..";
|
echo " Minimizing CSS..";
|
||||||
|
|
2
embed/players/hls.js
Normal file
2
embed/players/hls.js
Normal file
File diff suppressed because one or more lines are too long
127
embed/wrappers/hlsjs.js
Normal file
127
embed/wrappers/hlsjs.js
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
mistplayers.hlsjs = {
|
||||||
|
name: "HLS.js player",
|
||||||
|
mimes: ["html5/application/vnd.apple.mpegurl","html5/application/vnd.apple.mpegurl;version=7"],
|
||||||
|
priority: MistUtil.object.keys(mistplayers).length + 1,
|
||||||
|
isMimeSupported: function (mimetype) {
|
||||||
|
return (this.mimes.indexOf(mimetype) == -1 ? false : true);
|
||||||
|
},
|
||||||
|
isBrowserSupported: function (mimetype,source,MistVideo) {
|
||||||
|
//check for http/https mismatch
|
||||||
|
if (location.protocol != MistUtil.http.url.split(source.url).protocol) {
|
||||||
|
MistVideo.log("HTTP/HTTPS mismatch for this source");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
player: function(){},
|
||||||
|
scriptsrc: function(host) { return host+"/hlsjs.js"; }
|
||||||
|
};
|
||||||
|
var p = mistplayers.hlsjs.player;
|
||||||
|
p.prototype = new MistPlayer();
|
||||||
|
p.prototype.build = function (MistVideo,callback) {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
|
||||||
|
var video = document.createElement("video");
|
||||||
|
video.setAttribute("playsinline",""); //iphones. effin' iphones.
|
||||||
|
|
||||||
|
//apply options
|
||||||
|
var attrs = ["autoplay","loop","poster"];
|
||||||
|
for (var i in attrs) {
|
||||||
|
var attr = attrs[i];
|
||||||
|
if (MistVideo.options[attr]) {
|
||||||
|
video.setAttribute(attr,(MistVideo.options[attr] === true ? "" : MistVideo.options[attr]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (MistVideo.options.muted) {
|
||||||
|
video.muted = true; //don't use attribute because of Chrome bug
|
||||||
|
}
|
||||||
|
if (MistVideo.info.type == "live") {
|
||||||
|
video.loop = false;
|
||||||
|
}
|
||||||
|
if (MistVideo.options.controls == "stock") {
|
||||||
|
video.setAttribute("controls","");
|
||||||
|
}
|
||||||
|
video.setAttribute("crossorigin","anonymous");
|
||||||
|
this.setSize = function(size){
|
||||||
|
video.style.width = size.width+"px";
|
||||||
|
video.style.height = size.height+"px";
|
||||||
|
};
|
||||||
|
|
||||||
|
this.api = video;
|
||||||
|
|
||||||
|
MistVideo.player.api.unload = function(){
|
||||||
|
if (MistVideo.player.hls) {
|
||||||
|
MistVideo.player.hls.destroy();
|
||||||
|
MistVideo.player.hls = false;
|
||||||
|
MistVideo.log("hls.js instance disposed");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function init(url) {
|
||||||
|
MistVideo.player.hls = new Hls({
|
||||||
|
maxBufferLength: 15,
|
||||||
|
maxMaxBufferLength: 60
|
||||||
|
});
|
||||||
|
MistVideo.player.hls.attachMedia(video);
|
||||||
|
MistVideo.player.hls.on(Hls.Events.MEDIA_ATTACHED, function () {
|
||||||
|
console.log("video and hls.js are now bound together !");
|
||||||
|
//hls.loadSource("https://cattop/mist/cmaf/live/v9.m3u8");
|
||||||
|
//hls.loadSource("https://mira:4433/cmaf/live/v9.m3u8");
|
||||||
|
MistVideo.player.hls.loadSource(url);
|
||||||
|
MistVideo.player.hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) {
|
||||||
|
console.log("manifest loaded, found " + data.levels.length + " quality level");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
MistVideo.player.api.setSource = function(url) {
|
||||||
|
if (!MistVideo.player.hls) { return; }
|
||||||
|
if (MistVideo.player.hls.url != url) {
|
||||||
|
MistVideo.player.hls.destroy();
|
||||||
|
init(url);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
MistVideo.player.api.setSubtitle = function(trackmeta) {
|
||||||
|
//remove previous subtitles
|
||||||
|
var tracks = video.getElementsByTagName("track");
|
||||||
|
for (var i = tracks.length - 1; i >= 0; i--) {
|
||||||
|
video.removeChild(tracks[i]);
|
||||||
|
}
|
||||||
|
if (trackmeta) { //if the chosen track exists
|
||||||
|
//add the new one
|
||||||
|
var track = document.createElement("track");
|
||||||
|
video.appendChild(track);
|
||||||
|
track.kind = "subtitles";
|
||||||
|
track.label = trackmeta.label;
|
||||||
|
track.srclang = trackmeta.lang;
|
||||||
|
track.src = trackmeta.src;
|
||||||
|
track.setAttribute("default","");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function onHLSjsLoad(){
|
||||||
|
init(MistVideo.source.url);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("Hls" in window) {
|
||||||
|
onHLSjsLoad();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//load the videojs player
|
||||||
|
|
||||||
|
var scripturl = MistVideo.urlappend(mistplayers.hlsjs.scriptsrc(MistVideo.options.host));
|
||||||
|
MistUtil.scripts.insert(scripturl,{
|
||||||
|
onerror: function(e){
|
||||||
|
var msg = "Failed to load hlsjs.js";
|
||||||
|
if (e.message) { msg += ": "+e.message; }
|
||||||
|
MistVideo.showError(msg);
|
||||||
|
},
|
||||||
|
onload: onHLSjsLoad
|
||||||
|
},MistVideo);
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(video);
|
||||||
|
};
|
|
@ -1,6 +1,6 @@
|
||||||
mistplayers.html5 = {
|
mistplayers.html5 = {
|
||||||
name: "HTML5 video player",
|
name: "HTML5 video player",
|
||||||
mimes: ["html5/application/vnd.apple.mpegurl","html5/video/mp4","html5/video/ogg","html5/video/webm","html5/audio/mp3","html5/audio/webm","html5/audio/ogg","html5/audio/wav"],
|
mimes: ["html5/application/vnd.apple.mpegurl","html5/application/vnd.apple.mpegurl;version=7","html5/video/mp4","html5/video/ogg","html5/video/webm","html5/audio/mp3","html5/audio/webm","html5/audio/ogg","html5/audio/wav"],
|
||||||
priority: MistUtil.object.keys(mistplayers).length + 1,
|
priority: MistUtil.object.keys(mistplayers).length + 1,
|
||||||
isMimeSupported: function (mimetype) {
|
isMimeSupported: function (mimetype) {
|
||||||
return (MistUtil.array.indexOf(this.mimes,mimetype) == -1 ? false : true);
|
return (MistUtil.array.indexOf(this.mimes,mimetype) == -1 ? false : true);
|
||||||
|
|
|
@ -130,6 +130,7 @@ namespace Mist{
|
||||||
capa["url_match"].append("/dashjs.js");
|
capa["url_match"].append("/dashjs.js");
|
||||||
capa["url_match"].append("/webrtc.js");
|
capa["url_match"].append("/webrtc.js");
|
||||||
capa["url_match"].append("/flv.js");
|
capa["url_match"].append("/flv.js");
|
||||||
|
capa["url_match"].append("/hlsjs.js");
|
||||||
capa["url_match"].append("/skins/default.css");
|
capa["url_match"].append("/skins/default.css");
|
||||||
capa["url_match"].append("/skins/dev.css");
|
capa["url_match"].append("/skins/dev.css");
|
||||||
capa["url_match"].append("/skins/videojs.css");
|
capa["url_match"].append("/skins/videojs.css");
|
||||||
|
@ -142,6 +143,7 @@ namespace Mist{
|
||||||
capa["optional"]["wrappers"]["default"] = "";
|
capa["optional"]["wrappers"]["default"] = "";
|
||||||
capa["optional"]["wrappers"]["type"] = "ord_multi_sel";
|
capa["optional"]["wrappers"]["type"] = "ord_multi_sel";
|
||||||
capa["optional"]["wrappers"]["allowed"].append("html5");
|
capa["optional"]["wrappers"]["allowed"].append("html5");
|
||||||
|
capa["optional"]["wrappers"]["allowed"].append("hlsjs");
|
||||||
capa["optional"]["wrappers"]["allowed"].append("videojs");
|
capa["optional"]["wrappers"]["allowed"].append("videojs");
|
||||||
capa["optional"]["wrappers"]["allowed"].append("dashjs");
|
capa["optional"]["wrappers"]["allowed"].append("dashjs");
|
||||||
capa["optional"]["wrappers"]["allowed"].append("webrtc");
|
capa["optional"]["wrappers"]["allowed"].append("webrtc");
|
||||||
|
@ -897,6 +899,11 @@ namespace Mist{
|
||||||
response.append((char *)flv_js, (size_t)flv_js_len);
|
response.append((char *)flv_js, (size_t)flv_js_len);
|
||||||
used = true;
|
used = true;
|
||||||
}
|
}
|
||||||
|
if (it->asStringRef() == "hlsjs"){
|
||||||
|
#include "hlsjs.js.h"
|
||||||
|
response.append((char*)hlsjs_js, (size_t)hlsjs_js_len);
|
||||||
|
used = true;
|
||||||
|
}
|
||||||
if (!used){WARN_MSG("Unknown player type: %s", it->asStringRef().c_str());}
|
if (!used){WARN_MSG("Unknown player type: %s", it->asStringRef().c_str());}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1034,6 +1041,26 @@ namespace Mist{
|
||||||
#include "player_flv.js.h"
|
#include "player_flv.js.h"
|
||||||
response.append((char *)player_flv_js, (size_t)player_flv_js_len);
|
response.append((char *)player_flv_js, (size_t)player_flv_js_len);
|
||||||
|
|
||||||
|
H.SetBody(response);
|
||||||
|
H.SendResponse("200", "OK", myConn);
|
||||||
|
H.Clean();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (H.url == "/hlsjs.js"){
|
||||||
|
std::string response;
|
||||||
|
H.Clean();
|
||||||
|
H.SetHeader("Server", "MistServer/" PACKAGE_VERSION);
|
||||||
|
H.setCORSHeaders();
|
||||||
|
H.SetHeader("Content-Type", "application/javascript");
|
||||||
|
if (method == "OPTIONS" || method == "HEAD"){
|
||||||
|
H.SendResponse("200", "OK", myConn);
|
||||||
|
H.Clean();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "player_hlsjs.js.h"
|
||||||
|
response.append((char*)player_hlsjs_js, (size_t)player_hlsjs_js_len);
|
||||||
|
|
||||||
H.SetBody(response);
|
H.SetBody(response);
|
||||||
H.SendResponse("200", "OK", myConn);
|
H.SendResponse("200", "OK", myConn);
|
||||||
H.Clean();
|
H.Clean();
|
||||||
|
|
Loading…
Add table
Reference in a new issue