StrobeMediaPlayback的Javascript橋接

StrobeMediaPlayback是Adobe官方出的流媒體播放器,支持RTMP協議,在項目中運用到了,卻在網上怎麼都找不到相關資料,可以說是寥寥無幾。

無奈之下,稍微看了點源代碼,對播放器與JS橋接的方式進行了整理,於是有了此文。

 

關鍵代碼:

/**
 * 初始化播放器
 */
function initPlayer(){
	var p = {
		//視頻地址
		src : rtmpUrl,
		//是否自動隱藏控制欄
		controlBarAutoHide : "false",
		//控制欄位置
        	controlBarPosition: "bottom",
        	//流類型
		streamType : "vod",
		//是否自動播放
		autoPlay : "true",
		//不顯示詳細信息
		verbose : "false",
		//是否顯示緩衝中字樣
		bufferingOverlay : "true",
		//播放前顯示的自定義畫面
		//poster : ctx + "/images/homepage/logo.png",
		//播放結束的自定義畫面
		//endOfVideoOverlay : ctx + "/images/homepage/logo.png",
		//是否自動切換清晰度(客戶端),無作用
		autoSwitchQuality : "true",
		//超時時間
		rtmpNetConnectionFactoryTimeout : 20,
		//js事件橋接
		javascriptCallbackFunction: "onJavaScriptBridgeCreated"
	};
	var ppi = ctx + "/lib/flashplayer/playerProductInstall.swf";
	var params = {
		quality : "high",
		bgcolor : "#000000",
		allowscriptaccess : "sameDomain",
		allowfullscreen	: "true",
		wmode:"Opaque"
	};
	var attributes = {
		id : "player",
		name : "player",
		align : "middle"
	};
	$("#flashContent").html("");
	swfobject.embedSWF(ctx + "/lib/flashplayer/StrobeMediaPlayback.swf", "flashContent", "1020", "500", "10.3.0", ppi, p, params, attributes);
	swfobject.createCSS("#flashContent", "display:block;text-align:left;");
}

 

其中的javascriptCallbackFunction爲關鍵參數,用於指定Javascript橋接函數。Player在初始化後,會調用指定的函數並傳入player的id。但這還有一個前提, 就是允許flash訪問Javascript,所以,在flash參數中,需指定allowscriptaccess爲sameDomain或always,其中always代碼允許訪問所有js,sameDomain則指同域腳本。

 

再來看看onJavaScriptBridgeCreated函數,這個函數很簡單,就是傳入一個playerId,可以用這個playerId找到對應的player對象,如下:

function onJavaScriptBridgeCreated(id){
	player = document.getElementById(id);
}

 

拿到player對象了,然後就是可以用這個player對象做事件監聽和操作了。

以下是從源代碼中分析出來支持監聽的事件和支持直接調用的函數:
 

監聽事件 直接調用函數
volumeChange setMediaResourceURL
mutedChange addEventListener
panChange addEventListeners
audioSwitchingChange setCurrentTime
numAlternativeAudioStreamsChange play2
pingComplete stop2
pingError load
bufferingChange  
bufferTimeChange  
containerChange  
displayObjectChange  
mediaSizeChange  
drmStateChange  
isRecordingChange  
switchingChange  
numDynamicStreamsChange  
autoSwitchChange  
transitionComplete  
transition  
beginFragment  
endFragment  
downloadComplete  
downloadError  
fragmentDuration  
fileError  
indexError  
scriptData  
actionNeeded  
notifyBootstrapBox  
indexReady  
ratesReady  
requestLoadIndex  
loadStateChange  
bytesLoadedChange  
bytesTotalChange  
mediaElementChange  
traitAdd  
traitRemove  
metadataAdd  
metadataRemove  
canPlayChange  
canSeekChange  
temporalChange  
hasAudioChange  
hasAlternativeAudioChange  
isDynamicStreamChange  
canLoadChange  
canBufferChange  
hasDRMChange  
hasDisplayObjectChange  
mediaPlayerStateChange  
valueAdd  
valueRemove  
valueChange  
creationComplete  
creationError  
parseComplete  
parseError  
canPauseChange  
playStateChange  
pluginLoad  
pluginLoadError  
seekingChange  
currentChildChange  
currentTimeChange  
durationChange  
complete  
markerTimeReached  
markerDurationReached  
markerAdd  
markerRemove  

 

除了以上羅列的事件之外,該開源播放器,是支持插件以及自定義事件的,具體的實現方式,作者尚未研究。這裏主要是針對實現播放器常見功能重點研究幾個事件和函數。

其中最重要的事件,莫過於currentTimeChange事件,以該事件爲例,對播放器添加事件監聽,如下:

player.addEventListener("currentTimeChange", "onCurrentTimeChange");

/**
 * 播放器時間變化事件
 * @param time
 * @param duration
 */
function onCurrentTimeChange(time, duration){
	currentTime = time;
}


 該事件被觸發時,播放器會調用對應的js函數,並傳入當前時間和總時間兩個參數。

假設我們要做刷新後的繼續播放,就需要通過該函數記錄當前播放時間,並在下一次加載頁面的時候,通過setCurrentTime來進行跳轉(值得注意的是,該方法需要監聽playStateChange事件中在buffering狀態下執行),如下(省略添加監聽事件的代碼):

/**
 * 播放狀態變更事件
 * @param state
 */
function onMediaPlayerStateChange(state){
	//是否需要跳轉
	if(needJump){
		//當狀態爲緩衝中時,進行時間跳轉
		if(state == "buffering"){
			player.setCurrentTime(currentTime);
			//清除跳轉處理信息
			needJump = false;
			currentTime = null;
		}
	}
}


其他事件監聽的原理類似,具體入參,可以通過js的arguments獲取得知,或閱讀ActionScript的源代碼做確切瞭解。

 

本文主要是探討了StrobeMediaPlayback與js橋接並實現監聽與控制的方式,具體各事件的監聽處理,還是需要進一步研究的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章