Js网络视频播放器之VideoJs&&ckplayer(直播拉流rtmp、hls)
2017-11-16 11:14
633 查看
一、轻量级的开源播放器VideoJs&&Ckplayer
1、videoJS
对于HTML5支持非常棒,可以自动在flash和Html5播放器之间进行切换,videoJS可以兼容到IE8,它提供的界面非常简洁,需要对界面进行二次开发。获取videoJs
2、ckPlayer
这个播放器是国产播放器,功能有很多,只简单介绍两个功能,(1)提供手动切换html5和flash功能(2)提供了关灯开灯功能。完全可以满足国内开发的需求(3)它内置了大量的广告位,比如片头广告,暂停广告,片尾广告,缓冲广告,切点广告,滚动文字广告,以及满足权限关闭广告的功能....秒懂国内看视频就是广告比较多。获取ckplayer
二、videoJS播放器嵌入页面及api介绍
1、创建videoJS播放器实例
(1)调用swf文件
[html] viewplain copy
print?
<script type="text/javascript">videojs.options.flash.swf = "player/video-js.swf";</script>
(2)配置初始化参数
[html] viewplain copy
print?
<!-- data-setup{}可以控制播放器的一些功能;autoplay:true/false,是否自动播放;preload:auto\none\meta,自动加载\不加载\加载元数据 -->
<video id="videoPlayer" class="video-js vjs-default-skin vjs-big-play-centered"
controls preload="auto" poster="img/eguidlogo.png" width="640" height="360"
data-setup='{ "html5" : { "nativeTextTracks" : false } }'>
<source src='rtmp://192.168.30.21/live/' type='rtmp/flv' />
</video>
如果播放的是普通视频,需要修改<source src='视频地址' type='video/mp4或者video/flv'/>
type里面放 ‘ video/视频格式 ’ 即可
(3)创建播放器实例
[html] viewplain copy
print?
//播放器实例
var player = videojs('videoPlayer');
补充:videojs会根据浏览器自动切换flash和html5播放模式
2、videoJS常用api:
[html] viewplain copy
print?
/*
* 根据videoJS官方文档编写的播放器常用操作
*/
//获取当前类型
function getCurrentType(idnex) {
return idnex.currentType();
}
//获取当前播放地址
function getCurrentAddr(index) {
return index.currentSrc();
}
//获取当前播放时间
function getCurrentTime(index) {
return index.currentTime();
}
//获取当前网络状态
function networkState(index) {
return index.networkState();
}
//修改播放地址
function setsrc(index, url, type) {
index.src({
type : type,
src : url
});
}
//重载播放器
function reset(index) {
index.reset();
index.load();
}
//播放
function play(index) {
index.play();
}
//暂停
function pause(index) {
index.pause();
}
3、videoJS菜单界面二次开发
简单实现清晰度控制和创建清晰度菜单[html] view
plain copy
print?
//播放器实例
var player = videojs('videoPlayer');
//播放器初始化操作面板清晰度菜单
function playerInitVideo() {
$videoPanelMenu = $(".vjs-fullscreen-control");
$videoPanelMenu.before('<div class="vjs-subtitles-button vjs-menu-button vjs-menu-button-popup vjs-control vjs-button" tabindex="0" role="menuitem" aria-live="polite" aria-expanded="false" aria-haspopup="true">'
+ '<div class="vjs-menu" role="presentation">'
+ '<ul class="vjs-menu-content" role="menu">'
+ '<li class="vjs-menu-item" tabindex="-1" role="menuitemcheckbox" onclick="changeUrl(this)">高清</li>'
+ '<li class="vjs-menu-item vjs-selected" tabindex="-1" role="menuitemcheckbox" onclick="changeUrl(this)">标清 </li>'
+ '</ul></div><span class="vjs-control-text">清晰度</span></div>');
}
//加载页面进行播放器初始化
player.ready(function() {
playerInitVideo();
//player.play();
//setsrc(player,"rtmp://192.168.30.21/live/test3","rtmp/flv");
});
//通过id获取DOM
function get(index) {
return document.getElementById(index);
}
//修改播放地址并播放
function writeAddressAndPlay(index,url,type) {
//播放器操作
setsrc(index, url, type?type:"rtmp/flv");
play(index);
}
//高清标清切换就是应用名加减HD
function changeUrl(video) {
var index = $(video).text();
//获取当前播放的url
var CurrentUrl = getCurrentAddr(player);
$(".vjs-menu-item").removeClass("vjs-selected");
$(video).addClass("vjs-selected");
if (index == "高清") {
if (CurrentUrl.indexOf("HD") == -1) {
CurrentUrl = CurrentUrl + "HD";
} else {
return;
}
} else {
if (CurrentUrl.indexOf("HD") != -1) {
CurrentUrl = CurrentUrl.replace("HD", "");
} else {
return;
}
}
//修改地址并播放
writeAddressAndPlay(player, CurrentUrl);
}
这只是一种方案,如果有更好的方案,可以采用其他方法。
我这里的两个实时流采用nginx流媒体服务器推送的两个实时流的方式(一个普清,一个高清),在命名方式上采用类似增减HD的方式控制,到这里就可以自由控制清晰度了
三、ckPlayer播放器嵌入页面
1、创建播放器实例
[html] viewplain copy
print?
<script type="text/javascript">
//如果你不需要某项设置,可以直接删除,注意var flashvars的最后一个值后面不能有逗号
function loadedHandler(){
if(CKobject.getObjectById('ckplayer_a1').getType()){//说明使用html5播放器
alert('播放器已加载,调用的是HTML5播放模块');
}
else{
alert('播放器已加载,调用的是Flash播放模块');
}
}
var _nn=0;
function ckplayer_status(str){
_nn+=1;
if(_nn>100){
_nn=0;
document.getElementById('statusvalue').value='';
}
document.getElementById('statusvalue').value=str+'\n'+document.getElementById('statusvalue').value;
}
var flashvars={
f:'http://img.ksbbs.com/asset/Mon_1605/0ec8cc80112a2d6.mp4',//视频地址
a:'',//调用时的参数,只有当s>0的时候有效
s:'0',//调用方式,0=普通方法(f=视频地址),1=网址形式,2=xml形式,3=swf形式(s>0时f=网址,配合a来完成对地址的组装)
c:'1',//是否读取文本配置,0不是,1是
x:'',//调用配置文件路径,只有在c=1时使用。默认为空调用的是ckplayer.xml
i:'',//初始图片地址
d:'',//暂停时播放的广告,swf/图片,多个用竖线隔开,图片要加链接地址,没有的时候留空就行
u:'',//暂停时如果是图片的话,加个链接地址
l:'',//前置广告,swf/图片/视频,多个用竖线隔开,图片和视频要加链接地址
r:'',//前置广告的链接地址,多个用竖线隔开,没有的留空
t:'0|0',//视频开始前播放swf/图片时的时间,多个用竖线隔开
y:'',//这里是使用网址形式调用广告地址时使用,前提是要设置l的值为空
z:'',//缓冲广告,只能放一个,swf格式
e:'2',//视频结束后的动作,0是调用js函数,1是循环播放,2是暂停播放并且不调用广告,3是调用视频推荐列表的插件,4是清除视频流并调用js功能和1差不多,5是暂停播放并且调用暂停广告
v:'80',//默认音量,0-100之间
p:'1',//视频默认0是暂停,1是播放,2是不加载视频
h:'0',//播放http视频流时采用何种拖动方法,=0不使用任意拖动,=1是使用按关键帧,=2是按时间点,=3是自动判断按什么(如果视频格式是.mp4就按关键帧,.flv就按关键时间),=4也是自动判断(只要包含字符mp4就按mp4来,只要包含字符flv就按flv来)
q:'',//视频流拖动时参考函数,默认是start
m:'',//让该参数为一个链接地址时,单击播放器将跳转到该地址
o:'',//当p=2时,可以设置视频的时间,单位,秒
w:'',//当p=2时,可以设置视频的总字节数
g:'',//视频直接g秒开始播放
j:'',//跳过片尾功能,j>0则从播放多少时间后跳到结束,<0则总总时间-该值的绝对值时跳到结束
k:'',//提示点时间,如 30|60鼠标经过进度栏30秒,60秒会提示n指定的相应的文字
n:'',//提示点文字,跟k配合使用,如 提示点1|提示点2
wh:'',//宽高比,可以自己定义视频的宽高或宽高比如:wh:'4:3',或wh:'1080:720'
lv:'0',//是否是直播流,=1则锁定进度栏
loaded:'loadedHandler',//当播放器加载完成后发送该js函数loaded
//调用播放器的所有参数列表结束
//以下为自定义的播放器参数用来在插件里引用的
my_url:encodeURIComponent(window.location.href)//本页面地址
//调用自定义播放器参数结束
};
var params={bgcolor:'#FFF',allowFullScreen:true,allowScriptAccess:'always'};//这里定义播放器的其它参数如背景色(跟flashvars中的b不同),是否支持全屏,是否支持交互
var video=['http://192.168.30.21/test1HD.video.mp4'];
CKobject.embed('ckplayer/ckplayer/ckplayer.swf','player1','ckplayer_1','720px','360px',false,flashvars,video,params);
</script>
2、常用配置功能
参考ckplayer官网功能配置
3、常用API
[html] viewplain copy
print?
function videoLoadJs(s){
alert("执行了播放");
}
function playerstop(){
//只有当调用视频播放器时设置e=0或4时会有效果
alert('播放完成');
}
var _nn=0;//用来计算实时监听的条数的,超过100条记录就要删除,不然会消耗内存
function getstart(){
var a=CKobject.getObjectById('ckplayer_1').getStatus();
var ss='';
for (var k in a){
ss+=k+":"+a[k]+'\n';
}
alert(ss);
}
function changePrompt(){
CKobject.getObjectById('ckplayer_1').promptUnload();//卸载掉目前的
CKobject.getObjectById('ckplayer_1').changeFlashvars('{k->10|20|30}{n->重设提示点一|重设提示点二|重设提示点三}');
CKobject.getObjectById('ckplayer_1').promptLoad();//重新加载
}
function addflash(){
if(CKobject.Flash()['f']){
CKobject._K_('player1').innerHTML='';
CKobject.embedSWF('ckplayer/ckplayer/ckplayer.swf','player1','ckplayer_1','600','400',flashvars,params);
}
else{
alert('该环境中没有安装flash插件,无法切换');
}
}
function addhtml5(){
if(CKobject.isHTML5()){
support=['all'];
CKobject._K_('player1').innerHTML='';
CKobject.embedHTML5('player1','ckplayer_1',600,400,video,flashvars,support);
}
else{
alert('该环境不支持html5,无法切换');
}
}
function addListener(){
if(CKobject.getObjectById('ckplayer_1').getType()){//说明使用html5播放器
CKobject.getObjectById('ckplayer_1').addListener('play',playHandler);
}
else{
CKobject.getObjectById('ckplayer_1').addListener('play','playHandler');
}
}
function playHandler(){
alert('因为注册了监听播放,所以弹出此内容,删除监听将不再弹出');
}
function removeListener(){//删除监听事件
if(CKobject.getObjectById('ckplayer_1').getType()){//说明使用html5播放器
CKobject.getObjectById('ckplayer_1').removeListener('play',playHandler);
}
else{
CKobject.getObjectById('ckplayer_1').removeListener('play','playHandler');
}
}
</script>
<input type="button" name="button23" value="切换到flash播放器" onClick="addflash();" />
<input type="button" name="button24" value="切换到html5播放器" onClick="addhtml5();" />
</p>
<p>以下的操作对flash播放器和html5播放器都有效</p>
<p>
<input type="button" name="button5" value="播放" onClick="CKobject.getObjectById('ckplayer_1').videoPlay();" />
<input type="button" name="button6" value="暂停" onClick="CKobject.getObjectById('ckplayer_1').videoPause();" />
<input type="button" name="button7" value="播放/暂停" onClick="CKobject.getObjectById('ckplayer_a1').playOrPause();" />
<input type="button" name="button8" value="快进" onClick="CKobject.getObjectById('ckplayer_1').fastNext();" />
<input type="button" name="button9" value="快退" onClick="CKobject.getObjectById('ckplayer_1').fastBack();" />
<input type="button" name="button15" value="暂停监听" onClick="CKobject.getObjectById('ckplayer_1').changeStatus(0);" />
<input type="button" name="button16" value="加ID的监听" onClick="CKobject.getObjectById('ckplayer_1').changeStatus(3);" />
<input type="button" name="button21" value="获取播放器当前相关属性" onClick="getstart();" />
<input type="button" name="button13" value="注册监听播放事件" onClick="addListener();" />
<input type="button" name="button14" value="删除监听播放事件" onClick="removeListener();" />
</p>
<p>
播放新参数地址:
<input name="newaddress" type="text" id="newaddress" value="" size="60" maxlength="300" />
<input type="button" name="button" id="button" value="跳转" onClick="CKobject.getObjectById('ckplayer_1').newAddress(document.getElementById('newaddress').value);" /><br>
</p>
<p id="aboutme"></p>
<script type="text/javascript">
var aboutme='';
aboutme+='平台(浏览器)内核:'+CKobject.Platform()+'<br />';
aboutme+='浏览器:'+CKobject.browser()['B']+'<br />';
aboutme+='浏览器版本:'+CKobject.browser()['V']+'<br />';
aboutme+='是否安装了flash插件:'+CKobject.Flash()['f']+'<br />';
if(CKobject.Flash()['f']){
aboutme+='flash插件版本:'+CKobject.Flash()['v']+'<br />';
}
aboutme+='是否支持HTML5:'+CKobject.isHTML5()+'<br />';
CKobject._K_('aboutme').innerHTML=aboutme;
四、测试
videoJs初次拉取rtmp流播放时会出现,必须改变显示区域才能显示视频的bug,目前尚不清楚为什么,同样在推流端网络较差,推流断断续续的时候,video偶尔也会出现这种黑屏问题,尚不清楚原因,videojs无法手动设置buffer大小(缓冲时间)详见https://github.com/videojs/video.js/issues/1725,相比ckplayer效果比较好,直播我推荐使用ckplayer。
相关文章推荐
- Js网络视频播放器之VideoJs&&ckplayer(直播拉流rtmp、hls)
- 搭建rtmp直播流服务之4:videojs和ckPlayer开源播放器二次开发(播放rtmp、hls直播流及普通视频)
- 网络视频播放器插件ckplayer使用-简介
- windows平台VR全景播放器,支持图片视频,rtsp,rtmp,http,udp,hls等网络格式
- 基于HLS(HTTP Live Streaming)的视频直播分析与实现
- HTTP Live Streaming (HLS) 视频直播技术
- video.js 视频直播前端展示
- 播放器音视频同步及网络抖动解决方案
- Android基础之网络视频播放器
- 利用nginx搭建RTMP视频点播、直播、HLS服务器
- [HTML5和Flash视频播放器]Video.js 学习笔记(一 ) HLS库:videojs-contrib-hls
- Android的webview加载本地html、assert内html和网络URL&&& JS与移动端webview的相互交互
- 如何将Tricaster非线性编辑的视频内容发布至网络进行网页直播
- 利用函数计算实现网络游戏或视频直播中的敏感词检测
- Android&nbsp;播放网络视频
- 基于HLS(HTTP Live Streaming)的视频直播分析与实现
- iOS视频直播初窥:高仿<喵播APP>
- 求安卓版网络视频播放器代码,仿腾讯视频,但要简单很多,求帮助!
- 【Android 多媒体开发】 MediaPlayer 网络视频播放器
- PC、手机web页面直播hls视频