; (function() { /** * 模板 * */ String.prototype.tpl = function() { var arg = arguments; var that = this; for (var i = 0; i < arg.length; i++) { that = that.replace(new RegExp('\\{' + i + '\\}', "g"), arg[i]); } return that; }; $.fn.livePlayer = function(options) { return this.each(function() { if ($(this).data("init-player")) { return; } $(this).data("init-player", true); var opts = $.extend(true, {}, options); var $module = $(this) var id = $module.attr("id"); if (!id) { alert("must set id!"); return; } if (!opts.playUrl) { // alert("not start!"); return; } var playUrl = opts.playUrl var playImg = opts.playImg var autoPlay = opts.autoPlay; var lp = opts.loop; if(/.m3u8\s*$/.test(playUrl)){ $(this).addClass("live-video-source"); } var player = initPlayer(playUrl, playImg, id, $module,autoPlay,lp) $(this).data("init-player", player); }) } //初始化直播控件 function initPlayer(playUrl, playImg, id, $module,autoPlay,lp) { var player = playMuduVideo(playUrl, playImg, id, $module, autoPlay,lp); var $curWrap = $module.parent(); // initBackUp($module, playUrl) initBackupBar($module, playUrl) var playerTimer; if(autoPlay){ loop(); }else{ $module.find(".mudu-video-wrap").css("background", "#000") } initEvent(); /* *循环检查视频播放问题 */ function loop() { clearTimeout(playerTimer); if (player.getState() !== "playing") { if ($(window).width() > 750) { setMute(true); } player.play(); } else { $module.addClass("playing"); $module.find(".mudu-video-wrap").css("background", "#000") if ($(window).width() > 750) { setMute(true); } return false } playerTimer = setTimeout(loop, 1000); } /* *循环检查视频播放问题 */ function changeVideo(e) { var collection = $(this).data("collection"); if (collection == 1) { return; } if ($(this).hasClass("firstHover")) { return; } clearTimeout(playerTimer); playImg = $(this).find(".videoimg>img").attr("src"); playUrl = $(this).data("url"); if (playUrl) { //点击其他视频开放声音 setMute(false); player.load([{ file: playUrl, image: playImg }]) // initBackUp($(this), playUrl); initBackupBar($(this), playUrl); } else { //没有播放路径就直接链走 var linkSrc = $(this).data("link"); if (linkSrc) { window.open(linkSrc) } } $curWrap.find(".video-play-area").addClass("playing") $curWrap.find(".firstHover").removeClass("firstHover"); $(this).addClass("firstHover"); } /* *线路数据 */ function getBackupData($target) { try { var backUp = new Function("return " + $target.data("backup"))(); } catch (e) { console.error(e); } if (typeof backUp != "object") { //兼容报错 backUp = { title: "出了点状况,请切换线路!", changeList: [] } } return backUp; } /* *错误显示线路 */ function initBackUp($target, url) { var tactic = $target.data("tactic"); var backUp = getBackupData($target); var btns = ['
', "", "
"]; $.each(backUp.changeList, function(idx, obj) { if (url && url == obj.url) { btns[1] += ' {0} '.tpl(obj.name, obj.url, tactic, $target.data("backup")); } else if (!url && idx == 0) { btns[1] += ' {0} '.tpl(obj.name, obj.url, tactic, $target.data("backup")); } else { btns[1] += ' {0} '.tpl(obj.name, obj.url, tactic, $target.data("backup")); } }); $(".mudu-error-wrap2").remove(); if (btns[1]) { $(".mudu-reset.mudu-error-wrap").after("
{0}
{1}
".tpl(backUp.title, btns.join(""))); } else { $(".mudu-reset.mudu-error-wrap").after("
{0}
".tpl(backUp.title)); } initBackupEvent($(".mudu-error-wrap2")); } /* *初始化线路bar */ function initBackupBar($target, url) { var activeText; var tactic = $target.data("tactic"); var backUp = getBackupData($target); var btns = ['
', "", "
"]; $.each(backUp.changeList, function(idx, obj) { if (url && url == obj.url) { activeText = obj.name; btns[1] += ' {0} '.tpl(obj.name, obj.url, tactic, $target.data("backup")) } else if (!url && idx == 0) { activeText = obj.name; btns[1] += ' {0} '.tpl(obj.name, obj.url, tactic, $target.data("backup")) } else { btns[1] += ' {0} '.tpl(obj.name, obj.url, tactic, $target.data("backup")) } }) activeText = activeText; var notFindActive = false; if (!activeText) { activeText = backUp.changeList.length && backUp.changeList[0].name; notFindActive = true; } $(".mudu-backup-group").remove(); if (btns[1]) { $curWrap.find(".mudu-icon-fullscreen").before("
{0}{1}
".tpl(btns.join(""), activeText)) } if (notFindActive) { $(".mudu-backup-group").find(".J-live-videoPlay").eq(0).addClass("active"); } initBackupEvent($(".mudu-backup-group")); } /* *初始化bar线路事件 */ function initBackupEvent($target) { $target.find(".J-live-videoPlay").off("click").on("click", function(e) { changeVideo.call(this, e); return false; }) } /* *初始化play */ function playMuduVideo(url, img, contentId, $module, autoplay,loop) { return new Mudu.Player({ // 必须,播放器容器ID,播放器会被添加到该DOM元素中 containerId: contentId, // 必须,播放器视频播放地址 src: url, // 非必须,播放器海报图 string image: img, // 已废弃该参数,请勿使用 type: 'live', // 非必须,播放器是否自动播放,默认false autoplay: autoplay ? true : false, // 非必须,播放器是否显示控制条,默认true controls: true, // 非必须,播放器是否循环播放, 默认false repeat: loop?true:false, // 非必须,播放器宽度,单位为像素,默认为480 width: "100%", // 非必须,播放器高度,单位为像素,默认为270 height: "100%", // 以下x5Layer和x5Inline两个参数用于解决安卓微信、QQ、QQ浏览器的只能全屏播放的问题。参数仅对安装过tbs(腾讯浏览服务,一般安装过QQ浏览器后手机上会存在)手机生效(由于tbs的api限制,部分低版本的微信、QQ、QQ浏览器可能不会生效),未安装tbs的安卓手机不会有只能全屏播放的问题。 // x5Layer和x5Inline只能有一个被设置为true // 非必须,播放器在安卓微信、QQ、QQ浏览器中是否同层播放, 默认false (注:同层播放时,页面document无法滚动(内部的dom元素可以),如果播放器宽度小于浏览器宽度,两边将出现黑边) x5Layer: false, // 非必须,播放器在安卓微信、QQ、QQ浏览器中是否inline播放,默认false (注:inline播放时,播放器始终处于z-index的最上层,因此无法在播放器上叠加元素) x5Inline: false }); } /** * 自动播放静音 */ function setMute(flag) { // init var $icon = $module.find(".firstMutedIcon"); if (!$icon.length) { $module.append("
"); $icon = $module.find(".firstMutedIcon"); $icon.click(function() { setMute(false); $(this).hide() return false }) } //set if (player.getMute() !== flag) { player.setMute(flag); if (flag) { $icon.show(); } else { $icon.hide() } } } /** * 初始化事件 */ function initEvent() { $module.on("click", function(e) { if (player.getState() !== "playing") { player.play(); $module.addClass("playing"); $module.find(".mudu-video-wrap").css("background", "#000") } else { player.pause(); $module.removeClass("playing") } }) //先执行 用于阻止.video-play-area点击事件 $module.find(".mudu-controller").click(function(e) { return false; }) $module.find(".mudu-volume").click(function(e) { if (player.getMute()) { $module.find(".firstMutedIcon").show(); } else { $module.find(".firstMutedIcon").hide() } }) //控制按钮 player.On( 'Player.Play', // 事件处理函数,参数为当前player组件对象 function(player) { if (player.getState() == "playing") { $module.addClass("playing"); $module.find(".mudu-video-wrap").css("background", "#000") } } ) player.On( "Player.Stoped", function(player) { $module.removeClass("playing"); } ) player.On( "Player.Ended", function(player) { $module.find(".mudu-background").show() } ) } return player } })();