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操作了,不过上一页的状态 ...
随机推荐
- java 读写文件常用方法
package study.bigdata; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; ...
- jquery Ajax Queue 队列实现
有时候我们需要按顺序调用一组ajax,这些ajax需要有先后顺序,类似于同步的ajax,那么我们可以通过以下的方式来实现: (这个Ajax用到jQuery.post) //定义一个AJAX队列 $.n ...
- 简单而直接的Python web 框架:web.py
web.py 是一个Python 的web 框架,它简单而且功能强大.web.py 是公开的,无论用于什么用途都是没有限制的. 先让大家感受一下web.py 的简单而强大: import web ur ...
- JDK8集合的便捷操作
JDK8新特性,stream相关操作.把集合转换成stream,再对其进行相关操作,加上lambada表达式. demo: List<String> list = Arrays.asLis ...
- php+mysqli实现批量执行插入、更新及删除数据的方法
本文实例讲述了php+mysqli实现批量执行插入.更新及删除数据的方法.分享给大家供大家参考.具体如下: mysqli批量执行插入/更新/删除数据,函数为 multi_query(). 下面的代码只 ...
- ACM 博弈(难)题练习 (第二弹)
第一弹: Moscow Pre-Finals Workshop 2016 - Kent Nikaido Contest 1 Problem K. Pyramid Game http://opentra ...
- (转)java fail-fast机制
转自:http://blog.csdn.net/chenssy/article/details/38151189 Java提高篇(三四)-----fail-fast机制 标签: javajava提高篇 ...
- CodeFirst中DbContext动态添加DbSet
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- python3的安装,Window与linux
一.window安装 1.首先是window下的安装. 进入python网站https://www.python.org/downloads/下载页面,选择所需要的版本进行下载. 点击Download ...
- linux 安装php 然后跟nginx整合
php-fpm安装配置 nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端. nginx一般是把请求发fastcgi管理 ...