前面几章讲解了使用
nginx-rtmp搭建直播流媒体服务器;
ffmpeg推流到nginx-rtmp服务器;
java通过命令行调用ffmpeg实现推流服务;
从数据源获取,到使用ffmpeg推流,再到nginx-rtmp发布流,后端的服务到这里就已经全部完成了。
如果这里的流程没走通,那么这里的播放器也是没办法播放实时流的。
本章讲一下播放器的选用和二次开发,前端的播放器虽然有flex(flash)可以用,但是很遗憾flex接触的并不多,学习成本又太高,那么基于第三方开源的flash播放器二次开发就显得很有必要。
一、几种播放器选择
那么播放器,已经不再更新的以及收费的,这里不会进行介绍,只介绍两种轻量级的开源播放器。
1、videoJS
对于HTML5支持非常棒,可以自动在flash和html5播放器之间进行切换,videoJS可以兼容到IE8,它提供的界面非常简洁,需要对界面进行二次开发。
点击下载videojs开发包
2、ckPlayer
这个播放器是国产播放器,功能有很多,只简单介绍两个功能,(1)提供手动切换html5和flash功能(2)提供了关灯开灯功能。完全可以满足国内开发的需求(3)它内置了大量的广告位,比如片头广告,暂停广告,片尾广告,缓冲广告,切点广告,滚动文字广告,以及满足权限关闭广告的功能....秒懂国内看视频就是广告比较多。
点击下载ckplayer开发包
二、videoJS播放器嵌入页面及api介绍
1、创建videoJS播放器实例
(1)调用swf文件
- <scripttype="text/javascript">videojs.options.flash.swf="player/video-js.swf";</script>
(2)配置初始化参数
- <!--data-setup{}可以控制播放器的一些功能;autoplay:true/false,是否自动播放;preload:auto\none\meta,自动加载\不加载\加载元数据-->
- <video
- controlspreload="auto"poster="img/eguidlogo.png"width="640"height="360"
- data-setup=‘{"html5":{"nativeTextTracks":false}}‘>
- <sourcesrc=‘rtmp://192.168.30.21/live/‘type=‘rtmp/flv‘/>
- </video>
如果播放的是普通视频,需要修改<source src=‘视频地址‘ type=‘video/mp4或者video/flv‘/>
type里面放 ‘ video/视频格式 ’ 即可
(3)创建播放器实例
- //播放器实例
- varplayer=videojs(‘videoPlayer‘);
补充:videojs会根据浏览器自动切换flash和html5播放模式
2、videoJS常用api:
- /*
- *根据videoJS官方文档编写的播放器常用操作
- */
- //获取当前类型
- functiongetCurrentType(idnex){
- returnidnex.currentType();
- }
- //获取当前播放地址
- functiongetCurrentAddr(index){
- returnindex.currentSrc();
- }
- //获取当前播放时间
- functiongetCurrentTime(index){
- returnindex.currentTime();
- }
- //获取当前网络状态
- functionnetworkState(index){
- returnindex.networkState();
- }
- //修改播放地址
- functionsetsrc(index,url,type){
- index.src({
- type:type,
- src:url
- });
- }
- //重载播放器
- functionreset(index){
- index.reset();
- index.load();
- }
- //播放
- functionplay(index){
- index.play();
- }
- //暂停
- functionpause(index){
- index.pause();
- }
3、videoJS菜单界面二次开发
- //播放器实例
- varplayer=videojs(‘videoPlayer‘);
- //播放器初始化操作面板清晰度菜单
- functionplayerInitVideo(){
- $videoPanelMenu=$(".vjs-fullscreen-control");
- $videoPanelMenu.before(‘<divtabindex="0"role="menuitem"aria-live="polite"aria-expanded="false"aria-haspopup="true">‘
- +‘<divrole="presentation">‘
- +‘<ulrole="menu">‘
- +‘<litabindex="-1"role="menuitemcheckbox">高清</li>‘
- +‘<litabindex="-1"role="menuitemcheckbox">标清</li>‘
- +‘</ul></div><span>清晰度</span></div>‘);
- }
- //加载页面进行播放器初始化
- player.ready(function(){
- playerInitVideo();
- //player.play();
- //setsrc(player,"rtmp://192.168.30.21/live/test3","rtmp/flv");
- });
- //通过id获取DOM
- functionget(index){
- returndocument.getElementById(index);
- }
- //修改播放地址并播放
- functionwriteAddressAndPlay(index,url,type){
- //播放器操作
- setsrc(index,url,type?type:"rtmp/flv");
- play(index);
- }
- //高清标清切换就是应用名加减HD
- functionchangeUrl(video){
- varindex=$(video).text();
- //获取当前播放的url
- varCurrentUrl=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播放器嵌入页面(国产ckpalyer播放器的好处就是文档都是中文的)
1、创建播放器实例
- <scripttype="text/javascript">
- //如果你不需要某项设置,可以直接删除,注意varflashvars的最后一个值后面不能有逗号
- functionloadedHandler(){
- if(CKobject.getObjectById(‘ckplayer_a1‘).getType()){//说明使用html5播放器
- alert(‘播放器已加载,调用的是HTML5播放模块‘);
- }
- else{
- alert(‘播放器已加载,调用的是Flash播放模块‘);
- }
- }
- var_nn=0;
- functionckplayer_status(str){
- _nn+=1;
- if(_nn>100){
- _nn=0;
- document.getElementById(‘statusvalue‘).value=‘‘;
- }
- document.getElementById(‘statusvalue‘).value=str+‘\n‘+document.getElementById(‘statusvalue‘).value;
- }
- varflashvars={
- f:‘http://192.168.30.21/test1HD.video.flv‘,//视频地址
- 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)//本页面地址
- //调用自定义播放器参数结束
- };
- varparams={bgcolor:‘#FFF‘,allowFullScreen:true,allowScriptAccess:‘always‘};//这里定义播放器的其它参数如背景色(跟flashvars中的b不同),是否支持全屏,是否支持交互
- varvideo=[‘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、删除广告位,关闭右侧栏菜单的配置
2.1、修改ckplayer.js
- /*
- -------------------------------------------------------------------------
- 说明:
- 正式使用时可以把该文件的注释全部去掉,节省加载时间
- ckplayer6.7,有问题请访问http://www.ckplayer.com
- 请注意,该文件为UTF-8编码,不需要改变编码即可使用于各种编码形式的网站内
- -------------------------------------------------------------------------
- 第一部分,加载插件
- 以下为加载的插件部份
- 插件的设置参数说明:
- 1、插件名称
- 2、水平对齐方式(0左,1中,2右)
- 3、垂直对齐方式(0上,1中,2下)
- 4、水平方向位置偏移量
- 5、垂直方向位置偏移量
- 6、插件的等级,0=普通图片插件且跟随控制栏隐藏而隐藏,显示而显示,1=普通图片插件且永久显示,2=swf插件,默认显示,3=swf插件,默认隐藏,swf插件都可以交互
- 7、插件是否绑定在控制栏上,0不绑定,1绑定,当值是1的时候该插件将会随着控制栏一起隐藏或缓动
- 8、插件为swf并且可交互时,默认调用的类所在的包名称,详细说明可以到帮助手册里查看,默认无
- 插件名称不能相同,对此的详细说明请到网站查看
- */
- functionckcpt(){
- varcpt=‘‘;
- cpt+=‘right.swf,2,1,0,0,2,0|‘;//右边开关灯,调整,分享按钮的插件
- cpt+=‘share.swf,1,1,-180,-100,3,0|‘;//分享插件
- cpt+=‘adjustment.swf,1,1,-180,-100,3,0|‘;//调整大小和颜色的插件
- returncpt;
- }
- /*
- 插件的定义结束
- 以下是对播放器功能进行配置
- */
- functionckstyle(){//定义总的风格
- varck={
- cpath:‘‘,
- /*
- 播放器风格压缩包文件的路径,默认的是style.swf
- 如果调用不出来可以试着设置成绝对路径试试
- 如果不知道路径并且使用的是默认配置,可以直接留空,播放器会
- */
- language:‘‘,
- /*播放器所使用的语言配置文件,需要和播放器在同目录下,默认是language.xml*/
- flashvars:‘‘,
- /*
- 这里是用来做为对flashvars值的补充,除了c和x二个参数以外的设置都可以在这里进行配置
- 1111111111222222222233333333334444
- 1234567890123456789012345678901234567890123*/
- setup:‘1,1,1,1,1,2,0,1,2,0,0,1,200,0,2,1,0,1,1,1,2,10,3,0,1,2,3000,0,0,0,0,1,1,1,1,1,1,250,0,90,0,0,0‘,
- /*
- 这是配置文件里比较重要的一个参数,共有N个功能控制参数,并且以后会继续的增加,各控制参数以英文逗号(,)隔开。下面列出各参数的说明:
- 1、鼠标经过按钮是否使用手型,0普通鼠标,1手型鼠标,2是只有按钮手型,3是控制栏手型
- 2、是否支持单击暂停,0不支持,1是支持
- 3、是否支持双击全屏,0不支持,1是支持
- 4、在播放前置广告时是否同时加载视频,0不加载,1加载
- 5、广告显示的参考对象,0是参考视频区域,1是参考播放器区域
- 6、广告大小的调整方式,只针对swf和图片有效,视频是自动缩放的
- =0是自动调整大小,意思是说大的话就变小,小的话就变大
- =1是大的化变小,小的话不变
- =2是什么也不变,就这么大
- =3是跟参考对像(第5个控制)参数设置的一样宽高
- 7、前置广告播放顺序,0是顺序播放,1是随机播放,>1则随机取所有广告中的(N-1)个进行播放
- 8、对于视频广告是否采用修正,0是不使用,1是使用,如果是1,则用户在网速慢的情况下会按设定的倒计时进行播放广告,计时结束则放正片(比较人性化),设置成0的话,则强制播放完广告才能播放正片
- 9、是否开启滚动文字广告,0是不开启,1是开启且不使用关闭按钮,2是开启并且使用关闭按钮,开启后将在加载视频的时候加载滚动文字广告
- 10、视频的调整方式
- =0是自动调整大小,意思是说大的话就变小,小的话就变大,同时保持长宽比例不变
- =1是大的化变小,小的话不变
- =2是什么也不变,就这么大
- =3是跟参考对像(pm_video的设置)参数设置的一样宽高
- 11、是否在多视频时分段加载,0不是,1是
- 12、缩放视频时是否进行平滑处理,0不是,1是
- 13、视频缓冲时间,单位:毫秒,建议不超过300
- 14、初始图片调整方式(
- =0是自动调整大小,意思是说大的话就变小,小的话就变大,同时保持长宽比例不变
- =1是大的化变小,小的话不变
- =2是什么也不变,就这么大
- =3是跟pm_video参数设置的一样宽高
- 15、暂停广告调整方式(
- =0是自动调整大小,意思是说大的话就变小,小的话就变大,同时保持长宽比例不变
- =1是大的化变小,小的话不变
- =2是什么也不变,就这么大
- =3是跟pm_video参数设置的一样宽
- 16、暂停广告是否使用关闭广告设置,0不使用,1使用
- 17、缓冲时是否播放广告,0是不显示,1是显示并同时隐藏掉缓冲图标和进度,2是显示并不隐藏缓冲图标
- 18、是否支持键盘空格键控制播放和暂停0不支持,1支持
- 19、是否支持键盘左右方向键控制快进快退0不支持,1支持
- 20、是否支持键盘上下方向键控制音量0不支持,1支持
- 21、播放器返回js交互函数的等级,0-2,等级越高,返回的参数越多
- 0是返回少量常用交互
- 1返回播放器在播放的时候的参数,不返回广告之类的参数
- 2返回全部参数
- 3返回全部参数,并且在参数前加上"播放器ID->",用于多播放器的监听
- 22、快进和快退的秒数
- 23、界面上图片元素加载失败重新加载次数
- 24、开启加载皮肤压缩文件包的加载进度提示
- 25、使用隐藏控制栏时显示简单进度条的功能,0是不使用,1是使用,2是只在普通状态下使用
- 26、控制栏隐藏设置(0不隐藏,1全屏时隐藏,2都隐藏
- 27、控制栏隐藏延时时间,即在鼠标离开控制栏后多少毫秒后隐藏控制栏
- 28、左右滚动时是否采用无缝,默认0采用,1是不采用
- 29、0是正常状态,1是控制栏默认隐藏,播放状态下鼠标经过播放器显示控制栏,2是一直隐藏控制栏
- 30、在播放rtmp视频时暂停后点击播放是否采用重新链接的方式,这里一共分0-2三个等级
- 31、当采用网址形式(flashvars里s=1/2时)读取视频地址时是采用默认0=get方法,1=post方式
- 32、是否启用播放按钮和暂停按钮
- 33、是否启用中间暂停按钮
- 34、是否启用静音按钮
- 35、是否启用全屏按钮
- 36、是否启用进度调节栏,0不启用,1是启用,2是只能前进(向右拖动),3是只能后退,4是只能前进但能回到第一次拖动时的位置,5是看过的地方可以随意拖动,
- 37、是否启用调节音量
- 38、计算时间的间隔,毫秒
- 39、前置logo至少显示的时间,单位:毫秒
- 40、前置视频广告的默认音量
- 41、当s=3/4时加载插件是否从压缩包里加载,0不是,1是
- 42、加载风格是否采用加密方式传送,该功能普通用户不能使用
- 43、在s=1/2时,调用地址里的地址是否是相对地址(相对于调用文件),0不是,1是
- */
- pm_bg:‘0x000000,100,230,180‘,
-