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橋接並實現監聽與控制的方式,具體各事件的監聽處理,還是需要進一步研究的。