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桥接并实现监听与控制的方式,具体各事件的监听处理,还是需要进一步研究的。
StrobeMediaPlayback的Javascript桥接的更多相关文章
- swift开源项目精选
Swift 开源项目精选-v1.0 2016-03-07 22:11 542人阅读 评论(0) 收藏 举报 分类: iOS(55) Swift(4) 目录(?)[+] 转自 http: ...
- 微信开放平台API开发资料
微信大概两年前开启了微信公众平台的API供开发者使用,从账号登陆.消息发送.用户账号管理.公众号菜单.客服接口.微信商店接口.用户卡券接口 以及微信支付接口.可以说是全方面覆盖了电商所需要的要素,与阿 ...
- 收藏的js学习小例子
1.js模拟java里的Map function Map(){ var obj = {} ; this.put = function(key , value){ obj[key] = value ; ...
- ios_swift开发资源整理
目录 1.苹果官方资源 2.国内外视频网站推荐 3.中文文档 4.demo网站 5.开发工具推荐 6.国内外开发网站论坛 7.技术博客推荐 8.书籍推荐 9.第三方框架推荐 10.第三方发布平台 11 ...
- Android开源项目库汇总
最近做了一个Android开源项目库汇总,里面集合了OpenDigg 上的优质的Android开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个star. 抽 ...
- GitHub上受欢迎的Android UI Library
GitHub上受欢迎的Android UI Library 内容 抽屉菜单 ListView WebView SwitchButton 按钮 点赞按钮 进度条 TabLayout 图标 下拉刷新 Vi ...
- Android UI相关开源项目库汇总
最近做了一个Android UI相关开源项目库汇总,里面集合了OpenDigg 上的优质的Android开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个st ...
- Flutter与Dart 入门
Flutter简介 Flutter是google推出的,一个使用Dart语言开发的跨平台移动UI框架,通过自建绘制引擎,能高性能.高保真地进行Android和IOS开发. Flutter是什么 Flu ...
- html5 经验记录 持续更新
1 关于page cache 由于移动端浏览器webkit基本都实现了page cache(火狐叫做back-forwoad cache);所以回退操作基本不会触发onload操作了,不过上一页的状态 ...
随机推荐
- sql注入的防御和挖掘
首先我们可以在PHP.ini当中将display_errror关闭,以防止报错型的注入. 1.字符型防护 is_number 正则来判断是否是数字. ctype_digit() intval() st ...
- TCP/IP笔记(八)应用层协议
TCP/IP的应用层涵盖了OSI参考模型中第5.第6.第7层的所有功能,不仅包含了管理通信连接的会话层功能.转换数据格式的标识层功能,还包括与对端主机交互的应用层功能在内的所有功能. 利用网络的应用程 ...
- glob/globfree--找出匹配模式的路径名
语法 #include <glob.h> int glob(const char *pattern, int flags, int (*errfunc) (const char *epat ...
- Python中sort以及sorted函数初探
sorted(...) Help on built-in function sorted in module __builtin__: sorted(...) sorted(iterable, cmp ...
- Image Filter
香港中文大学研究成果 Rolling Guidance Filter http://www.cse.cuhk.edu.hk/~leojia/projects/rollguidance/ 100+ Ti ...
- python 2个版本如何共存
我们在安装Python3(>=3.3)时,Python的安装包实际上在系统中安装了一个启动器py.exe,默认放置在文件夹C:\Windows\下面.这个启动器允许我们指定使用Python2还是 ...
- HTML特殊字符的html、js、css写法汇总
⇠ 箭头类 符号 UNICODE 符号 UNICODE HTML JS CSS HTML JS CSS ⇠ ⇠ \u21E0 \21E0 ⇢ ⇢ \u21E2 \2 ...
- asp.net调用系统设置字体文本框的方法
本文实例展示了asp.net调用系统设置字体文本框的方法,是进行web开发中很实用的技巧.具体实现步骤如下: 一.调用系统字体文本框 首先在bin文件夹右击-->添加引用-->.net标签 ...
- uva748 - Exponentiation 高精度小数的幂运算
uva748 - Exponentiation Exponentiation Problems involving the computation of exact values of very ...
- 苹果手机输入中文不会触发onkeyup事件
今天同事的项目有这个问题,用我的安卓手机输入中文是ok的,但是苹果手机就不行 使用keyup事件检测文本框内容: $('#keyup_i').bind('keyup', function(){ ...