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桥接的更多相关文章

  1. swift开源项目精选

    Swift 开源项目精选-v1.0 2016-03-07 22:11 542人阅读 评论(0) 收藏 举报  分类: iOS(55)   Swift(4)    目录(?)[+]   转自 http: ...

  2. 微信开放平台API开发资料

    微信大概两年前开启了微信公众平台的API供开发者使用,从账号登陆.消息发送.用户账号管理.公众号菜单.客服接口.微信商店接口.用户卡券接口 以及微信支付接口.可以说是全方面覆盖了电商所需要的要素,与阿 ...

  3. 收藏的js学习小例子

    1.js模拟java里的Map function Map(){ var obj = {} ; this.put = function(key , value){ obj[key] = value ; ...

  4. ios_swift开发资源整理

    目录 1.苹果官方资源 2.国内外视频网站推荐 3.中文文档 4.demo网站 5.开发工具推荐 6.国内外开发网站论坛 7.技术博客推荐 8.书籍推荐 9.第三方框架推荐 10.第三方发布平台 11 ...

  5. Android开源项目库汇总

    最近做了一个Android开源项目库汇总,里面集合了OpenDigg 上的优质的Android开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个star. 抽 ...

  6. GitHub上受欢迎的Android UI Library

    GitHub上受欢迎的Android UI Library 内容 抽屉菜单 ListView WebView SwitchButton 按钮 点赞按钮 进度条 TabLayout 图标 下拉刷新 Vi ...

  7. Android UI相关开源项目库汇总

    最近做了一个Android UI相关开源项目库汇总,里面集合了OpenDigg 上的优质的Android开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个st ...

  8. Flutter与Dart 入门

    Flutter简介 Flutter是google推出的,一个使用Dart语言开发的跨平台移动UI框架,通过自建绘制引擎,能高性能.高保真地进行Android和IOS开发. Flutter是什么 Flu ...

  9. html5 经验记录 持续更新

    1 关于page cache 由于移动端浏览器webkit基本都实现了page cache(火狐叫做back-forwoad cache);所以回退操作基本不会触发onload操作了,不过上一页的状态 ...

随机推荐

  1. 解决Linux环境下Tomcat启动卡住问题

    最近发现在服务器上启动tomcat,会存在卡住的情况,这种情况是每次必现,通过搜索发现是随机数生成问题.解决方案如下 将$JAVA_HOME/jre/lib/security/Java.securit ...

  2. git patch生成方法

    先把改动commit掉,然后生产改动patch给提交代码的同事,详细操作过程例如以下: 改动代码的同事: git format-patch al821_xxx origin/al821_xxx 会生成 ...

  3. hdu6070 Dirt Ratio 二分+线段树

    /** 题目:hdu6070 Dirt Ratio 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意:给定n个数,求1.0*x/y最小是多少.x ...

  4. Lua一般都用来干什么,有什么优点

    Lua一般用于嵌入式应用,现在越来越多应用于游戏当中,魔兽世界,愤怒的小鸟都有用到. Lua极易嵌入到其他程序,可当做一种配置语言. 还有很多需要性能的地方,比如:游戏脚本,nginx,wiresha ...

  5. C++ 类的多态二(函数重载--函数重写--函数重定义)

    //函数重载--函数重写--函数重定义 #include<iostream> using namespace std; /* 函数重载: 必须在一个类中进行(子类无法重载父类中的函数) 子 ...

  6. Attention Mechanism

    首先介绍Attention机制: 转自:http://blog.csdn.net/malefactor/article/details/50550211 上面讲的是Soft Attention Mod ...

  7. 描述J2EE框架的多层结构,并简要说明各层的作用。

    描述J2EE框架的多层结构,并简要说明各层的作用. 解答: 1) Presentation layer(表示层) a. 表示逻辑(生成界面代码) b. 接收请求 c. 处理业务层抛出的异常 d. 负责 ...

  8. <!>连结格式

    <base href=位址>(预设好连结路径) <a href=位址></a>外部连结 <a href=位址 target=’_blank’></ ...

  9. Spring中HttpInvoker远程方法调用总结

    Spring为各种远程訪问技术的集成提供了工具类.Spring远程支持是由普通(Spring)POJO实现的,这使得开发具有远程訪问功能的服务变得相当easy. 眼下,Spring支持四种远程技术: ...

  10. 关于Eclipse配置tomcat

    本人花了2-3天检索如何配置tomcat,终于在今天中午安装成功了!!!(本人用的是安装版) 1.首先安装tomcat 7到自己想要安装的盘(以D:\IT程序需求\Tomcat为例,且跳过JDK的安装 ...