1. 程式人生 > >搭建rtmp直播流服務之4:videojs和ckPlayer開源播放器二次開發(播放rtmp、hls直播流及普通視訊)

搭建rtmp直播流服務之4:videojs和ckPlayer開源播放器二次開發(播放rtmp、hls直播流及普通視訊)

前面幾章講解了使用

從資料來源獲取,到使用ffmpeg推流,再到nginx-rtmp釋出流,後端的服務到這裡就已經全部完成了。

如果這裡的流程沒走通,那麼這裡的播放器也是沒辦法播放實時流的。

本章講一下播放器的選用和二次開發,前端的播放器雖然有flex(flash)可以用,但是很遺憾flex接觸的並不多,學習成本又太高,那麼基於第三方開源的flash播放器二次開發就顯得很有必要。

一、幾種播放器選擇

那麼播放器,已經不再更新的以及收費的,這裡不會進行介紹,只介紹兩種輕量級的開源播放器。

1、videoJS

對於HTML5支援非常棒,可以自動在flash和html5播放器之間進行切換,videoJS可以相容到IE8,它提供的介面非常簡潔,需要對介面進行二次開發。

2、ckPlayer

這個播放器是國產播放器,功能有很多,只簡單介紹兩個功能,(1)提供手動切換html5和flash功能(2)提供了關燈開燈功能。完全可以滿足國內開發的需求(3)它內建了大量的廣告位,比如片頭廣告,暫停廣告,片尾廣告,緩衝廣告,切點廣告,滾動文字廣告,以及滿足許可權關閉廣告的功能....秒懂國內看視訊就是廣告比較多。

二、videoJS播放器嵌入頁面及api介紹

1、建立videoJS播放器例項

(1)呼叫swf檔案

<script type="text/javascript">videojs.options.flash.swf = "player/video-js.swf";</script>

(2)配置初始化引數

	<!-- 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)建立播放器例項

//播放器例項
var player = videojs('videoPlayer');

補充:videojs會根據瀏覽器自動切換flash和html5播放模式

2、videoJS常用api:

/*
* 根據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選單介面二次開發

簡單實現清晰度控制和建立清晰度選單
//播放器例項
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播放器嵌入頁面(國產ckpalyer播放器的好處就是文件都是中文的)

1、建立播放器例項

    <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://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)//本頁面地址
		//呼叫自定義播放器引數結束
		};
	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、刪除廣告位,關閉右側欄選單的配置

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並且可互動時,預設呼叫的類所在的包名稱,詳細說明可以到幫助手冊裡檢視,預設無
	外掛名稱不能相同,對此的詳細說明請到網站檢視
*/
function ckcpt() {
    var cpt = '';
    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|'; //調整大小和顏色的外掛
    return cpt;
}
/*
外掛的定義結束
以下是對播放器功能進行配置
*/
function ckstyle() { //定義總的風格
    var ck = {
        cpath: '',
        /*
		播放器風格壓縮包檔案的路徑,預設的是style.swf
		如果呼叫不出來可以試著設定成絕對路徑試試
		如果不知道路徑並且使用的是預設配置,可以直接留空,播放器會
		*/
        language: '',
        /*播放器所使用的語言配置檔案,需要和播放器在同目錄下,預設是language.xml*/
        flashvars: '',
        /*
		這裡是用來做為對flashvars值的補充,除了c和x二個引數以外的設定都可以在這裡進行配置
		                          1 1 1 1   1 1 1 1 1 1 2 2 2  2 2 2 2 2    2 2 3 3 3 3 3 3 3 3 3   3 4  4 4 4
       			1 2 3 4 5 6 7 8 9 0 1 2 3   4 5 6 7 8 9 0 1 2  3 4 5 6 7    8 9 0 1 2 3 4 5 6 7 8   9 0  1 2 3*/
        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',
        /*播放器整體的背景配置,請注意,這裡只是一個初始化的設定,如果需要真正的改動播放器的背景和最小寬高,需要在風格檔案裡找到相同的引數進行更改。
		1、整體背景顏色
		2、背景透明度
		3、播放器最小寬度
		4、播放器最小高度
		這裡只是初始化時的設定,最終載入完播放器後顯示的效果需要在style.swf/style.xml裡設定該引數
		*/
        mylogo: 'logo.swf',
        /*
		視訊載入前顯示的logo檔案,不使用設定成null,即mylogo='null';
		*/
        pm_mylogo: '1,1,-100,-55',
        /*
		視訊載入前顯示的logo檔案(mylogo引數的)的位置
		本軟體所有的四個引數控制位置的方式全部都是統一的意思,如下
		1、水平對齊方式,0是左,1是中,2是右
		2、垂直對齊方式,0是上,1是中,2是下
		3、水平偏移量,舉例說明,如果第1個引數設定成0左對齊,第3個偏移量設定成10,就是離左邊10個畫素,第一個引數設定成2,偏移量如果設定的是正值就會移到播放器外面,只有設定成負值才行,設定成-1,按鈕就會跑到播放器外面
		4、垂直偏移量 
		*/
        logo: 'cklogo.png',
        /*
		預設右上角一直顯示的logo,不使用設定成null,即logo='null';
		*/
        pm_logo: '2,0,-100,20',
        /*
		播放器右上角的logo的位置
			1、水平對齊方式,0是左,1是中,2是右
			2、垂直對齊方式,0是上,1是中,2是下
			3、水平偏移量
			4、垂直偏移量 
		以下是播放器自帶的二個外掛
		*/
        control_rel: 'related.swf,ckplayer/related.xml,0',
        /*
		視訊結束顯示精彩視訊的外掛
			1、視訊播放結束後顯示相關精彩視訊的外掛檔案(注意,視訊結束動作設定成3時(即var flashvars={e:3})有效),
			2、xml檔案是呼叫精彩視訊的示例檔案,可以自定義檔案型別(比如asp,php,jsp,.net只要輸出的是xml格式就行),實際使用中一定要注意第二個引數的路徑要正確
			3、第三個引數是設定配置檔案的編碼,0是預設的utf-8,1是gbk2312 
		*/
        control_pv: 'Preview.swf,105,2000',
        /*
		視訊預覽外掛
			1、外掛檔名稱(該外掛和上面的精彩視訊的外掛都是放在風格壓縮包裡的)
			2、離進度欄的高(指的是外掛的頂部離進度欄的位置)
			3、延遲時間(該處設定滑鼠經過進度欄停頓多少毫秒後才顯示外掛)
			建議一定要設定延時時間,不然當滑鼠在進度欄上劃過的時候就會讀取視訊地址進行預覽,很佔資源 
		*/
        pm_repc: '',
		/*
		視訊地址替換符,該功能主要是用來做簡單加密的功能,使用方法很簡單,請注意,只針對f值是視訊地址的時候有效,其它地方不能使用。具體的請檢視http://www.ckplayer.com/manual.php?id=4#title_25
		*/
        pm_spac: '|',
        /*
		視訊地址間隔符,這裡主要是播放多段視訊時使用普通呼叫方式或網址呼叫方式時使用的。預設使用|,如果視訊地址裡本身存在|的話需要另外設定一個間隔符,注意,即使只有一個視訊也需要設定。另外在使用rtmp協議播放視訊的時候,如果視訊存在多級目錄的話,這裡要改成其它的符號,因為rtmp協議的視訊地址多級的話也需要用到|隔開流地址和例項地址 
		*/
        pm_fpac: 'file->f',
        /*
		該引數的功能是把自定義的flashvars裡的變數替換成ckplayer裡對應的變數,預設的引數的意思是把flashvars裡的file值替換成f值,因為ckplayer裡只認f值,多個替換之間用豎線隔開
		*/
        pm_advtime: '2,0,-110,10,0,300,0',
        /*
		前置廣告倒計時文字位置,播放前置 廣告時有個倒計時的顯示文字框,這裡是設定該文字框的位置和寬高,對齊方式的。一共7個引數,分別表示:
			1、水平對齊方式,0是左對齊,1是中間對齊,2是右對齊
			2、垂直對齊方式,0是上對齊,1是中間對齊,2是低部對齊
			3、水平位置偏移量
			4、垂直位置偏移量
			5、文字對齊方式,0是左對齊,1是中間對齊,2是右對齊,3是預設對齊
			6、文字框寬席
			7、文字框高度 
		*/
        pm_advstatus: '1,2,2,-200,-40',
        /*
		前置廣告靜音按鈕,靜音按鈕只在是視訊廣告時顯示,當然也可以控制不顯示 
			1、是否顯示0不顯示,1顯示
			2、水平對齊方式
			3、垂直對齊方式
			4、水平偏移量
			5、垂直偏移量
		*/
        pm_advjp: '1,1,2,2,-100,-40',
        /*
		前置廣告跳過廣告按鈕的位置
			1、是否顯示0不顯示,1是顯示
			2、跳過按鈕觸發物件(值0/1,0是直接跳轉,1是觸發js:function ckadjump(){})
			3、水平對齊方式
			4、垂直對齊方式
			5、水平偏移量
			6、垂直偏移量
		*/
        pm_padvc: '2,0,-10,-10',
        /*
		暫停廣告的關閉按鈕的位置
			1、水平對齊方式
			2、垂直對齊方式
			3、水平偏移量
			4、垂直偏移量
		*/
        pm_advms: '2,2,-46,-56',
        /*
		滾動廣告關閉按鈕位置
			1、水平對齊方式
			2、垂直對齊方式
			3、水平偏移量
			4、垂直偏移量
		*/
        pm_zip: '1,1,-20,-8,1,0,0',
        /*
		載入面板壓縮包時提示文字的位置
			1、水平對齊方式,0是左對齊,1是中間對齊,2是右對齊
			2、垂直對齊方式,0是上對齊,1是中間對齊,2是低部對齊
			3、水平位置偏移量
			4、垂直位置偏移量
			5、文字對齊方式,0是左對齊,1是中間對齊,2是右對齊,3是預設對齊
			6、文字框寬席
			7、文字框高度
		*/
        //pm_advmarquee: '1,2,50,-60,50,18,0,0x000000,50,0,20,1,15,2000',
		pm_advmarquee: '1,2,50,-60,50,20,0,0x000000,50,0,20,1,30,2000',
        /*
		滾動廣告的控制,要使用的話需要在setup裡的第9個引數設定成1
		這裡分二種情況,前六個引數是定位控制,第7個引數是設定定位方式(0:相對定位,1:絕對定位)
		第一種情況:第7個引數是0的時候,相對定位,就是播放器長寬變化的時候,控制欄也跟著變
			1、預設1:中間對齊
			2、上中下對齊(0是上,1是中,2是下)
			3、離左邊的距離
			4、Y軸偏移量
			5、離右邊的距離
			6、高度
			7、定位方式
		第二種情況:第7個引數是1的時候,絕對定位,就是播放器長寬變化的時候,控制欄不跟著變,這種方式一般使用在控制欄大小不變的時候
			1、左中右對齊方式(0是左,1是中間,2是右)
			2、上中下對齊(0是上,1是中,2是下)
			3、x偏移量
			4、y偏移量
			5、寬度
			6、高度
			7、定位方式
		以上是前7個引數的作用
			8、是文字廣告的背景色
			9、置背景色的透明度
			10、控制滾動方向,0是水平滾動(包括左右),1是上下滾動(包括向上和向下)
			11、移動的單位時長,即移動單位畫素所需要的時長,毫秒
			12、移動的單位畫素,正數同左/上,負數向右/下
			13、是行高,這個在設定向上或向下滾動的時候有用處
			14、控制向上或向下滾動時每次停止的時間
		*/
		pm_glowfilter:'1,0x01485d, 100, 6, 3, 10, 1, 0, 0',
		/*滾動文字廣告是否採用發光濾鏡
			1、是否使用發光濾鏡,0是不採用,1是使用
			2、(default = 0xFF0000) — 光暈顏色,採用十六進位制格式 0xRRGGBB。 預設值為 0xFF0000  
			3、(default = 100) — 顏色的 Alpha 透明度值。 有效值為 0 到 100。 例如,25 設定透明度為 25%
			4、(default = 6.0) — 水平模糊量。 有效值為 0 到 255(浮點)。 2 的乘方值(如 2、4、8、16 和 32)經過優化,呈現速度比其它值更快  
			5、(default = 6.0) — 垂直模糊量。 有效值為 0 到 255(浮點)。 2 的乘方值(如 2、4、8、16 和 32)經過優化,呈現速度比其它值更快  
			6、(default = 2) — 印記或跨頁的強度。 該值越高,壓印的顏色越深,而且發光與背景之間的對比度也越強。 有效值為 0 到 255  
			7、(default = 1) — 應用濾鏡的次數
			8、(default = 0) — 指定發光是否為內側發光。 值 1 指定發光是內側發光。 值 0 指定發光是外側發光(物件外緣周圍的發光)  
			9、(default = 0) — 指定物件是否具有挖空效果。 值為 1 將使物件的填充變為透明,並顯示文件的背景顏色 
		*/
        advmarquee: escape('{a href="http://www.ckplayer.com"}{font color="#FFFFFF" size="12"}這裡可以放文字廣告,播放器預設使用這裡設定的廣告內容,如果不想在這裡使用可以清空這裡的內容,如果想在頁面中實時定義滾動文字廣告內容,可以清空這裡的內容,然後在頁面中設定廣告函式。{/font}{/a}'),
        /*
		該處是滾動文字廣告的內容,如果不想在這裡設定,就把這裡清空並且在頁面中使用js的函式定義function ckmarqueeadv(){return '廣告內容'}
		*/
		mainfuntion:'',
		/*
		當flashvars裡s=3/4時,呼叫的函式包名稱,預設為空,呼叫時間軸上的函式setAppObj
		*/
		flashplayer:'',
		/*
		當flashvars裡的s=3/4時,也可以把swf檔案放在這裡
		*/
		calljs:'ckplayer_status,ckadjump,playerstop,ckmarqueeadv',
		/*
			跳過廣告和播放結束時呼叫的js函式
		*/
        myweb: escape(''),
        /*
		------------------------------------------------------------------------------------------------------------------
		以下內容部份是和外掛相關的配置,請注意,自定義外掛以及其配置的命名方式要注意,不要和系統的相重複,不然就會替換掉系統的相關設定,刪除相關外掛的話也可以同時刪除相關的配置
		------------------------------------------------------------------------------------------------------------------
		以下內容定義自定義外掛的相關配置,這裡也可以自定義任何自己的外掛需要配置的內容,當然,如果你某個外掛不使用的話,也可以刪除相關的配置
		------------------------------------------------------------------------------------------------------------------
		*/
        cpt_lights: '1',
		/*
		該處定義是否使用開關燈,和right.swf外掛配合作用,使用開燈效果時呼叫頁面的js函式function closelights(){};
		*/
        cpt_share: 'ckplayer/share.xml',
        /*
		分享外掛呼叫的配置檔案地址
		呼叫外掛開始
		*/
        cpt_list: ckcpt()
        /*
		ckcpt()是本檔案最上方的定義外掛的函式
		*/
    }
    return ck;
}
/*
html5部分開始
以下程式碼是支援html5的,如果你不需要,可以刪除。
html5程式碼塊的程式碼可以隨意更改以適合你的應用,歡迎到論壇交流更改心得
*/
(function() {
    var CKobject = {
        _K_: function(d){return document.getElementById(d);},
        _T_: false,
		_M_: false,
		_G_: false,
		_Y_: false,
		_I_: null,
		_J_: 0,
		_O_: {},
		uaMatch:function(u,rMsie,rFirefox,rOpera,rChrome,rSafari,rSafari2,mozilla,mobile){
			var match = rMsie.exec(u);
			if (match != null) {
				return {
					b: 'IE',
					v: match[2] || '0'
				}
			}
			match = rFirefox.exec(u);
			if (match != null) {
				return {
					b: match[1] || '',
					v: match[2] || '0'
				}
			}
			match = rOpera.exec(u);
			if (match != null) {
				return {
					b: match[1] || '',
					v: match[2] || '0'
				}
			}
			match = rChrome.exec(u);
			if (match != null) {
				return {
					b: match[1] || '',
					v: match[2] || '0'
				}
			}
			match = rSafari.exec(u);
			if (match != null) {
				return {
					b: match[2] || '',
					v: match[1] || '0'
				}
			}
			match = rSafari2.exec(u);
			if (match != null) {
				return {
					b: match[1] || '',
					v: match[2] || '0'
				}
			}
			match = mozilla.exec(u);
			if (match != null) {
				return {
					b: match[1] || '',
					v: match[2] || '0'
				}
			}
			match = mobile.exec(u);
			if (match != null) {
				return {
					b: match[1] || '',
					v: match[2] || '0'
				}
			}
			else {
				return {
					b: 'unknown',
					v: '0'
				}
			}
		},
		browser: function() {
			var u = navigator.userAgent,
			rMsie = /(msie\s|trident.*rv:)([\w.]+)/,
			rFirefox = /(firefox)\/([\w.]+)/,
			rOpera = /(opera).+version\/([\w.]+)/,
			rChrome = /(chrome)\/([\w.]+)/,
			rSafari = /version\/([\w.]+).*(safari)/,
			rSafari2 = /(safari)\/([\w.]+)/,
			mozilla = /(mozilla)\/([\w.]+)/,
			mobile = /(mobile)\/([\w.]+)/;
			var c = u.toLowerCase();
			var d = this.uaMatch(c,rMsie,rFirefox,rOpera,rChrome,rSafari,rSafari2,mozilla,mobile);
			if (d.b) {
				b = d.b;
				v = d.v;
			}
			return {B: b, V: v};
        },
        Platform: function() {
            var w = '';
            var u = navigator.userAgent,
            app = navigator.appVersion;
            var b = {
                iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1,
                iPad: u.indexOf('iPad') > -1,
                ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
                android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1,
                webKit: u.indexOf('AppleWebKit') > -1,
				trident: u.indexOf('Trident') > -1,
                gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,
                presto: u.indexOf('Presto') > -1,
                mobile: !!u.match(/AppleWebKit.*Mobile.*/) || !!u.match(/AppleWebKit/),
                webApp: u.indexOf('Safari') == -1
            };
            for (var k in b) {
                if (b[k]) {
                    w = k;
                    break;
                }
            }
            return w;
        },
		isHTML5:function(){
			return !!document.createElement('video').canPlayType;
		},
		getType:function(){
			return this._T_;
		},
        getVideo: function() {
            var v = '';
            var s = this._E_['v'];
            if (s && s.length>1) {
                for (var i = 0; i < s.length; i++) {
                    var a = s[i].split('->');
                    if (a.length >= 1 && a[0] != '') {
                        v += '<source src="' + a[0] + '"';
                    }
                    if (a.length >= 2 && a[1] != '') {
                        v += ' type="' + a[1] + '"';
                    }
                    v += '>';
                }
            }
            return v;
        },
        getVars: function(k) {
			var o=this._A_;
			if (typeof(o) == 'undefined') { 
				return null;
			}
            if (k in o) {
                return o[k];
            } else {
                return null;
            }
        },
        getParams: function() {
            var p = '';
            if (this._A_) {
                if (parseInt(this.getVars('p')) == 1) {
                    p += ' autoplay="autoplay"';
                }
                if (parseInt(this.getVars('e')) == 1) {
                    p += ' loop="loop"';
                }
                if (parseInt(this.getVars('p')) == 2) {
                    p += ' preload="metadata"';
                }
                if (this.getVars('i')) {
                    p += ' poster="' + this.getVars('i') + '"';
                }
            }
            return p;
        },
        getpath: function(z) {
			var f='CDEFGHIJKLMNOPQRSTUVWXYZcdefghijklmnopqrstuvwxyz';
			var w=z.substr(0,1);
			if(f.indexOf(w)>-1 && (z.substr(0,4)==w+'://' || z.substr(0,4)==w+':\\')){
				return z;
			}
            var d = unescape(window.location.href).replace('file:///', '');
            var k = parseInt(document.location.port);
            var u = document.location.protocol + '//' + document.location.hostname;
            var l = '',
            e = '',
            t = '';
            var s = 0;
            var r = unescape(z).split('//');
            if (r.length > 0) {
                l = r[0] + '//'
            }
            var h = 'http|https|ftp|rtsp|mms|ftp|rtmp|file';
            var a = h.split('|');
            if (k != 80 && k) {
                u += ':' + k;
            }
            for (i = 0; i < a.length; i++) {
                if ((a[i] + '://') == l) {
                    s = 1;
                    break;
                }
            }
            if (s == 0) {
                if (z.substr(0, 1) == '/') {
                    t = u + z;
                } else {
                    e = d.substring(0, d.lastIndexOf('/') + 1).replace('\\', '/');
                    var w = z.replace('../', './');
                    var u = w.split('./');
                    var n = u.length;
                    var r = w.replace('./', '');
                    var q = e.split('/');
                    var j = q.length - n;
                    for (i = 0; i < j; i++) {
                        t += q[i] + '/';
                    }
                    t += r;
                }
            } else {
                t = z;
            }
            return t;
        },
        getXhr: function() {
            var x;
            try {
                x = new ActiveXObject('Msxml2.XMLHTTP');
            } catch(e) {
                try {
                    x = new ActiveXObject('Microsoft.XMLHTTP');
                } catch(e) {
                    x = false;
                }
            }
            if (!x && typeof XMLHttpRequest != 'undefined') {
                x = new XMLHttpRequest();
            }
            return x;
        },
		getX: function(){
			var f='ckstyle()';
			if (this.getVars('x') && parseInt(this.getVars('c'))!=1 ) {
				f=this.getVars('x')+'()';
			}
			try {
				if (typeof(eval(f)) == 'object') {
					this._X_ = eval(f);
				}
			} catch(e) {
				try {
					if (typeof(eval(ckstyle)) == 'object') {
						this._X_ = ckstyle();
					}
				} catch(e) {
					this._X_ = ckstyle();
				}
			}
		},
		getSn: function(s, n) {
			if(n>=0){
				return this._X_[s].split(',')[n];
			}
			else{
				return this._X_[s];
			}
        },
		getUrl: function(L, B) {
            var b = ['get', 'utf-8'];
            if (L && L.length == 2) {
                var a = L[0];
                var c = L[1].split('/');
                if (c.length >= 2) {
                    b[0] = c[1];
                }
                if (c.length >= 3) {
                    b[1] = c[2];
                }
                this.ajax(b[0], b[1], a,
                function(s) {
                    var C = CKobject;
                    if (s && s != 'error') {
                        var d = '',
                        e = s;
                        if (s.indexOf('}') > -1) {
                            var f = s.split('}');
                            for (var i = 0; i < f.length - 1; i++) {
                                d += f[i] + '}';
                                var h = f[i].replace('{', '').split('->');
                                if (h.length == 2) {
                                    C._A_[h[0]] = h[1];
                                }
                            }
                            e = f[f.length - 1];
                        }
                        C._E_['v'] = e.split(',');
                        if (B) {
                            C.showHtml5();
                        } else {
                            C.changeParams(d);
                            C.newAdr();
                        }
                    }
                });
            }
        },
        getflashvars: function(s) {
            var v = '',
            i = 0;
            if (s) {
                for (var k in s) {
                    if (i > 0) {
                        v += '&';
                    }
                    if (k == 'f' && s[k] && ! this.getSn('pm_repc',-1)) {
                        s[k] = this.getpath(s[k]);
                        if (s[k].indexOf('&') > -1) {
                            s[k] = encodeURIComponent(s[k]);
                        }
                    }
                    if (k == 'y' && s[k]) {
                        s[k] = this.getpath(s[k]);
                    }
                    v += k + '=' + s[k];
                    i++;
                }
            }
            return v;
        },
        getparam: function(s) {
            var w = '',
            v = '',
            o = {
                allowScriptAccess: 'always',
                allowFullScreen: true,
                quality: 'high',
                bgcolor: '#000'
            };
            if (s) {
                for (var k in s) {
                    o[k] = s[k];
                }
            }
            for (var e in o) {
                w += e + '="' + o[e] + '" ';
                v += '<param name="' + e + '" value="' + o[e] + '" />';
            }
            w = w.replace('movie=', 'src=');
            return {
                w: w,
                v: v
            };
        },
        getObjectById: function(s) {
            if (this._T_) {
                return this;
            }
            var x = null,
            y = this._K_(s),
            r = 'embed';
            if (y && y.nodeName == 'OBJECT') {
                if (typeof y.SetVariable != 'undefined') {
                   x= y;
                } else {
                    var z = y.getElementsByTagName(r)[0];
                    if (z) {
                        x= z;
                    }
                }
            }
            return x;
        },
        ajax: function(b, u, s, f) {
            var x = this.getXhr();
            var a = [],
            m = '';
            if (b == 'get') {
                if (s.indexOf('?') > -1) {
                    m = s + '&t=' + new Date().getTime();
                } else {
                    m = s + '?t=' + new Date().getTime();
                }
                x.open('get', m);
            } else {
                a = s.split('?');
                s = a[0],
                m = a[1];
                x.open('post', s, true);
            }
            x.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            x.setRequestHeader('charset', u);
            if (b == 'post') {
                x.send(m);
            } else {
                x.send(null);
            }
            x.onreadystatechange = function() {
                if (x.readyState == 4) {
                    var g = x.responseText;
                    if (g != '') {
                        f(g);
                    } else {
                        f(null);
                    }
                }
            }
        },
        addListener: function(e, f) {
			var o=CKobject._V_;
            if (o.addEventListener) {
				try{
                	o.addEventListener(e, f, false);
				}
				catch (e) {
					 this.getNot();
				}
            }
			else if (o.attachEvent) {
				try{
                	o.attachEvent('on' + e, f);
				}
				catch(e){
					 this.getNot();
				}
            }
			else {
                o['on' + e] = f;
            }
        },
        removeListener: function( e, f) {
			var o=CKobject._V_;
            if (o.removeEventListener) {
				try{
                	o.removeEventListener(e, f, false);
				}
				catch(e){
					 this.getNot();
				}
			}
			else if (o.detachEvent) {
				try{
                	o.detachEvent('on' + e, f);
				}
				catch(e){
					 this.getNot();
				}
			}
			else {
                o['on' + e] = null;
            }
        },
        Flash: function() {
            var f = false,v = 0;
            if (document.all  || this.browser()['B'].toLowerCase().indexOf('ie')>-1) {
                try {
                    var s = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
                    f = true;
                    var z = s.GetVariable('$version');
                    v = parseInt(z.split(' ')[1].split(',')[0]);
                } catch(e) {}
            } else {
                if (navigator.plugins && navigator.plugins.length > 0) {
                    var s = navigator.plugins['Shockwave Flash'];
                    if (s) {
                        f = true;
                        var w = s.description.split(' ');
                        for (var i = 0; i < w.length; ++i) {
                            if (isNaN(parseInt(w[i]))) continue;
                            v = parseInt(w[i]);
                        }
                    }
                }
            }
            return {
                f: f,
                v: v
            };
        },
		embed:function(f,d,i,w,h,b,v,e,p,j){
			var s=['all'];
			if(b){
				if(this.isHTML5()){
					this.embedHTML5(d,i,w,h,e,v,s,j);
				}
				else{
					this.embedSWF(f,d,i,w,h,v,p);
				}
			}
			else{
				if(this.Flash()['f'] && parseInt(this.Flash()['v'])>10){
					this.embedSWF(f,d,i,w,h,v,p);
				}
				else if(this.isHTML5()){
					this.embedHTML5(d,i,w,h,e,v,s,j);
				}
				else{
					this.embedSWF(f,d,i,w,h,v,p);
				}
			}
		},
		embedSWF: function(C, D, N, W, H, V, P) {
            if (!N) {
                N = 'ckplayer_a1'
            }
            if (!P) {
                P = {
                    bgcolor: '#FFF',
                    allowFullScreen: true,
                    allowScriptAccess: 'always',
					wmode:'transparent'
                };
            }
			this._A_=V;
			this.getX();
            var u = 'undefined',
			g = false,
            j = document,
            r = 'http://www.macromedia.com/go/getflashplayer',
            t = '<a href="' + r + '" target="_blank">請點選此處下載安裝最新的flash外掛</a>',
            error = {
                w: '您的網頁不符合w3c標準,無法顯示播放器',
                f: '您沒有安裝flash外掛,無法播放視訊,' + t,
                v: '您的flash外掛版本過低,無法播放視訊,' + t
            },
            w3c = typeof j.getElementById != u && typeof j.getElementsByTagName != u && typeof j.createElement != u,
            i = 'id="' + N + '" name="' + N + '" ',
            s = '',
            l = '';
            P['movie'] = C;
            P['flashvars'] = this.getflashvars(V);
			if(W==-1){
				d=true;
				this._K_(D).style.width='100%';
				W='100%';
			}
            s += '<object pluginspage="http://www.macromedia.com/go/getflashplayer" ';
            s += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
            s += 'codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=11,3,0,0" ';
            s += 'width="' + W + '" ';
            s += 'height="' + H + '" ';
            s += i;
            s += 'align="middle">';
            s += this.getparam(P)['v'];
            s += '<embed ';
            s += this.getparam(P)['w'];
            s += ' width="' + W + '" height="' + H + '" name="' + N + '" id="' + N + '" align="middle" ' + i;
            s += 'type="application/x-shockwave-flash" pluginspage="' + r + '" />';
            s += '</object>';
            if (!w3c) {
                l = error['w'];
				g = true;
            } else {
                if (!this.Flash()['f']) {
                    l = error['f'];
					g = true;
                } else {
                    if (this.Flash()['v'] < 11) {
                        l = error['v'];
						g = true;
                    } else {
                        l = s;
						this._T_=false;
                    }
                }
            }
            if (l) {
                this._K_(D).innerHTML = l;
            }
			if (g){
				this._K_(D).style.color = '#0066cc';
				this._K_(D).style.lineHeight = this._K_(D).style.height;
				this._K_(D).style.textAlign= 'center';
			}
        },
        embedHTML5: function(C, P, W, H, V, A, S, J) {
            this._E_ = {
                c: C,
                p: P,
                w: W,
                h: H,
                v: V,
                s: S,
				j: J==undefined || J?true:false
            };
            this._A_ = A;
			this.getX();
            b = this.browser()['B'],
            v = this.browser()['V'],
            x = v.split('.'),
            t = x[0],
            m = b + v,
            n = b + t,
            w = '',
            s = false,
            f = this.Flash()['f'],
            a = false;
            if (!S) {
                S = ['iPad', 'iPhone', 'ios'];
            }
            for (var i = 0; i < S.length; i++) {
                w = S[i];
                if (w.toLowerCase() == 'all') {
                    s = true;
                    break;
                }
                if (w.toLowerCase() == 'all+false' && !f) {
                    s = true;
                    break;
                }
                if (w.indexOf('+') > -1) {
                    w = w.split('+')[0];
                    a = true;
                } else {
                    a = false;
                }
                if (this.Platform() == w || m == w || n == w || b == w) {
                    if (a) {
                        if (!f) {
                            s = true;
                            break;
                        }
                    }else {
                        s = true;
                        break;
                    }
                }
            }
            if (s) {
                if (V) {
                    var l = V[0].split('->');
                    if (l && l.length == 2 && l[1].indexOf('ajax') > -1) {
                        this.getUrl(l, true);
                        return;
                    }
                }
                this.showHtml5();
            }
        },
        status: function() {
            this._H_ = parseInt(this.getSn('setup', 20));
			var f='ckplayer_status';
			if (this.getSn('calljs', 0)!='') {
				f=this.getSn('calljs', 0);
			}
			try {
				if (typeof(eval(f)) == 'function') {
					this._L_=eval(f);
					this._M_=true;
					return true;
				}
			} catch(e) {
				try {
					if (typeof(eval(ckplayer_status)) == 'function') {
						this._L_=ckplayer_status;
						this._M_=true;
						return true;
					}
				} catch(e) {
					return false;
				}
			}
			return false;
        },
        showHtml5: function() {
            var C = CKobject;
            var p = C._E_['p'],
			a = C._E_['v'],
			c = C._E_['c'],
			j = '',
			b = false;
			var s = this._E_['v'];
			var w=C._E_['w'],h=C._E_['h'];
			var d=false;
			var r='';
			if(s.length==1){
				r=' src="'+s[0].split('->')[0]+'"';
			}
			if(w==-1){
				d=true;
				C._K_(c).style.width='100%';
				w='100%';
			}
			if(w.toString().indexOf('%')>-1){
				w='100%';
			}
			if(h.toString().indexOf('%')>-1){
				h='100%';
			}
			if(C._E_['j']){
				j='controls="controls"';
			}
			var v = '<video '+j+r+' id="' + p + '" width="' + w + '" height="' + h + '"' + C.getParams() + '>' + C.getVideo() + '</video>';
            C._K_(c).innerHTML = v;
            C._K_(c).style.backgroundColor = '#000';
            C._V_ = C._K_(p);
			if(!d){
				C._K_(c).style.width=C._E_['w'].toString().indexOf('%')>-1?(C._K_(c).offsetWidth*parseInt(C._E_['w'])*0.01)+'px':C._V_.width+'px';
				C._K_(c).style.height=C._E_['h'].toString().indexOf('%')>-1?(C._K_(c).offsetHeight*parseInt(C._E_['h'])*0.01)+'px':C._V_.height+'px';
			}
            C._P_ = false;
            C._T_ = true;
			if (C.getVars('loaded')!='') {
				var f=C.getVars('loaded')+'()';
				try {
                	if (typeof(eval(f)) == 'function') {
						eval(f);
					}
				} catch(e) {
					try {
						if (typeof(eval(loadedHandler)) == 'function') {
							loadedHandler();
						}
					} catch(e) {
					}
				}
            }
            C.status();
			C.addListener('play', C.playHandler);
			C.addListener('pause', C.playHandler);
			C.addListener('error', C.errorHandler);
			C.addListener('emptied', C.errorHandler);
			C.addListener('loadedmetadata', C.loadedMetadataHandler);
			C.addListener('ended', C.endedHandler);
			C.addListener('volumechange', C.volumeChangeHandler);
			if((C.getVars('m')!='' && C.getVars('m')!=null) || parseInt( C.getSn('setup', 0))>0){
				C._K_(c).style.cursor='pointer';
			}
			if((C.getVars('m')!='' && C.getVars('m')!=null) || parseInt( C.getSn('setup', 1))==1){
				C.addListener('click', C.html5Click);
			}
        },
        videoPlay: function() {
            if (this._T_) {
                this._V_.play();
            }
        },
        videoPause: function() {
            if (this._T_) {
                this._V_.pause();
            }
        },
        playOrPause: function() {
            if (this._T_) {
                if (this._V_.paused) {
                    this._V_.play();
                } else {
                    this._V_.pause();
                }
            }
        },
        fastNext: function() {
            if (this._T_) {
                this._V_['currentTime'] = this._V_['currentTime'] + 10;
            }
        },
        fastBack: function() {
            if (this._T_) {
                this._V_['currentTime'] = this._V_['currentTime'] - 10;
            }
        },
        changeVolume: function(n) {
            if (this._T_) {
                this._V_['volume'] = n * 0.01;
            }
        },
        videoSeek: function(t) {
            if (this._T_) {
                this._V_['currentTime'] = t;
            }
        },
        newAddress: function(u) {
            var s = [];
            if (u) {
                s = this.isHtml5New(u);
            } else {
                return;
            }
            if (s && this._T_) {
                this.changeParams(u);
                var l = s[0].split('->');
                if (l && l.length == 2 && l[1].indexOf('ajax') > -1) {
                    this.getUrl(l, false);
                    return;
                }
                this._E_['v'] = s;
                this.newAdr();
            }
        },
		quitFullScreen:function() {
			if(document.cancelFullScreen) {
				document.cancelFullScreen();
			} 
			else if(document.mozCancelFullScreen) {
				document.mozCancelFullScreen();
			} else if(document.webkitCancelFullScreen) {
	   			document.webkitCancelFullScreen();
			}

		},
		changeStatus:function(n){
			this._H_=n;
		},
        newAdr: function() {
			var s = this._E_['v'];
            this._V_.pause();
			if(s.length==1){
            	this._V_.src=s[0].split('->')[0];
			}
			else{
				this._V_['innerHTML'] = this.getVideo();
			}
            this._V_.load();
        },
        isHtml5New: function(s) {
            if (s.indexOf('html5') == -1) {
                return false;
            }
            var a = s.replace(/{/g, '');
            var b = a.split('}');
            var c = '';
            for (var i = 0; i < b.length; i++) {
                if (b[i].indexOf('html5') > -1) {
                    c = b[i].replace('html5->', '').split(',');
                    break;
                }
            }
            return c;
        },
        changeParams: function(f) {
            if (f) {
                var a = f.replace(/{/g, '');
                var b = a.split('}');
                var c = '';
                for (var i = 0; i < b.length; i++) {
                    var d = b[i].split('->');
					if(d.length == 2){
						switch(d[0]){
							case 'p':
								if(parseInt(d[1]) == 1){
									this._V_.autoplay = true;
								}
								else if(parseInt(d[1]) == 2){
									this._V_.preload = 'metadata';
								}
								else{
									this._V_.autoplay = false;
									if(this._I_!=null){
										clearInterval(this._I_);
										this._I_=null;
									}
								}
								break;
							case 'e':
								if(parseInt(d[1]) == 1){
									this._V_.loop = true;
								}
								else{
									this._V_.loop = false;
								}
								break;
							case 'i':
								this._V_.poster = d[1];
								break;
							default:
								break;
						}
					}
                }
            }
        },
        frontAdPause: function(s) {
            this.getNot();
        },
        frontAdUnload: function() {
            this.getNot();
        },
        changeFace: function(s) {
            this.getNot();
        },
        plugin: function(a, b, c, d, e, f, g) {
            this.getNot();
        },
        videoClear: function() {
            this.getNot();
        },
        videoBrightness: function(s) {
            this.getNot();
        },
        videoContrast: function(s) {
            this.getNot();
        },
        videoSaturation: function(s) {
            this.getNot();
        },
        videoSetHue: function(s) {
            this.getNot();
        },
        videoWAndH: function(a, b) {
            this.getNot();
        },
        videoWHXY: function(a, b, c, d) {
            this.getNot();
        },
		changeFlashvars: function(a) {
            this.getNot();
        },
		changeMyObject: function(a, b) {
            this.getNot();
        },
		getMyObject: function(a, b) {
            this.getNot();
        },
		changeeFace: function() {
            this.getNot();
        },
		changeStyle: function(a, b) {
            this.getNot();
        },
		promptLoad: function() {
            this.getNot();
        },
		promptUnload: function() {
            this.getNot();
        },
		marqueeLoad: function(a,b) {
            this.getNot();
        },
		marqueeClose: function(s) {
            this.getNot();
        },
        getNot: function() {
            var s='The ckplayer\'s API for HTML5 does not exist';
			return s;
        },
        volumeChangeHandler: function() {
            var C = CKobject;
            if (C._V_.muted) {
                C.returnStatus('volumechange:0', 1);
                C._O_['volume'] = 0;
                C._O_['mute'] = true;
            } else {
                C._O_['mute'] = false;
                C._O_['volume'] = C._V_['volume'] * 100;
                C.returnStatus('volumechange:'+C._V_['volume'] * 100, 1);
            }
        },
        endedHandler: function() {
            var C = CKobject;
			var e=parseInt(C.getVars('e'));
            C.returnStatus('ended', 1);
			if(C._I_){
				clearInterval(C._I_);
				C._I_=null;
			}
            if ( e!= 0 && e !=4 && e !=6) {
                return;
            }
			if(e==6){
				this.quitFullScreen();
			}
			var f='playerstop()';
			if (C.getSn('calljs', 2)!='') {
				f=C.getSn('calljs', 2)+'()';
			}
			try {
				if (typeof(eval(f)) == 'function') {
					eval(f);
					return;
				}
			} catch(e) {
				try {
					if (typeof(eval(playerstop)) == 'function') {
						playerstop();
						return;
					}
				} catch(e) {
					return;
				}
			}
        },
        loadedMetadataHandler: function() {
            var C = CKobject;
            C.returnStatus('loadedmetadata', 1);
            C._O_['totaltime'] = C._V_['duration'];
            C._O_['width'] = C._V_['width'];
            C._O_['height'] = C._V_['height'];
            C._O_['awidth'] = C._V_['videoWidth'];
            C._O_['aheight'] = C._V_['videoHeight'];
            if (C._V_.defaultMuted) {
                C.returnStatus('volumechange:0', 1);
                C._O_['mute'] = true;
                C._O_['volume'] = 0;
            } else {
                C._O_['mute'] = false;
                C._O_['volume'] = C._V_['volume'] * 100;
                C.returnStatus('volumechange:'+C._V_['volume'] * 100, 1);
            }
			if (parseInt(C.getVars('p')) == 1) {
				C.playHandler();
			}
        },
        errorHandler: function() {
            CKobject.returnStatus('error', 1);
        },
        playHandler: function() {
            var C = CKobject;
            if (C._V_.paused) {
                C.returnStatus('pause', 1);
                C.addO('play', false);
				if(C._I_!=null){
					clearInterval(C._I_);
					C._I_=null;
				}
            } else {
                C.returnStatus('play', 1);
                C.addO('play', true);
                if (!C._P_) {
                    C.returnStatus('play', 1);
                    C._P_ = true;
                }
                C._I_ = setInterval(C.playTime, parseInt( C.getSn('setup', 37)));
				if(!C._G_){
					C._G_=true;
					for(var k in C._A_){
						if(k=='g' && C._A_[k]){
							var g=parseInt(C._A_[k]);
							C.videoSeek(g);
						}	
					}
				}
				if(!C._Y_){
					C._Y_=true;
					for(var k in C._A_){
						if(k=='j' && C._A_[k]){
							var j=parseInt(C._A_[k]);
							if(j>0){
								C._J_=j;
							}
							else{
								C._J_=parseInt(C._O_['totaltime'])+j;
							}
						}	
					}
				}
            }
        },
		html5Click: function(){
			var C = CKobject;
			if(C.getVars('m')!='' && C.getVars('m')!=null){
				window.open(C.getVars('m'));
			}
		},
        returnStatus: function(s, j) {
            var h = s;
            if (this._H_ == 3) {
                h = this._E_['p'] +'->'+ h;
            }
            if (this._M_ && j <= this._H_ ) {
                this._L_(h);
            }
        },
        addO: function(s, z) {
            this._O_[s] = z;
        },
        getStatus: function() {
            return this._O_;
        },
        playTime: function() {
            var C = CKobject;
            var t = C._V_['currentTime'];
            C._O_['time'] = t;
			if(C._J_>0 && t>C._J_){
				C._J_=0;
				C.videoSeek(C._O_['totaltime']);
			}
            C.returnStatus('time:' + t, 1);
        }
    }
    window.CKobject = CKobject;
})();

2.2、修改ckplayer.xml

<?xml version="1.0" encoding="utf-8"?>
<ckplayer>
  <style>
		<cpath></cpath>
		<!--
		播放器風格壓縮包檔案的路徑,預設的是style.swf
		如果呼叫不出來可以試著設定成絕對路徑試試
		如果不知道路徑並且使用的是預設配置,可以直接留空,播放器會自動尋找
		-->
		<language></language>
		<!--
		播放器所使用的語言配置檔案,需要和播放器在同目錄下,預設是language.xml
		-->
		<flashvars>{b->1}{p->1}</flashvars>
		<!--
		這裡是用來做為對flashvars值的補充,除了c和x二個引數以外的設定都可以在這裡進行配置
			                     1 1 1 1   1 1 1 1 1 1 2 2 2  2 2 2 2 2    2 2 3 3 3 3 3 3 3 3 3   3 4  4 4 4
       		   1 2 3 4 5 6 7 8 9 0 1 2 3   4 5 6 7 8 9 0 1 2  3 4 5 6 7    8 9 0 1 2 3 4 5 6 7 8   9 0  1 2 3
		-->
		<setup>1,1,1,1,1,2,0,1,2,0,0,1,200,0,2,1,0,1,1,1,0,10,3,0,1,2,3000,0,0,0,0,1,1,1,1,1,1,250,0,90,0,0,0</setup>
		<!--
		這是配置檔案裡比較重要的一個引數,共有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、控制欄隱藏延