终于找到miniblink播放jwplayer不了的原因了
来源:互联网 发布:pscc序列号2015 mac 编辑:程序博客网 时间:2024/04/20 21:33
var loadConfig = [{ // this.load = function(e) type: "qt", levels: e.list}];A().load(loadConfig); A().play(!0); _.init({ player: p(), game_id: 1 * w.game_id || 0, room_id: 1 * w.roomid || 0, subroom_id: 1 * w.subroomid || 0, file: A().getPlaylistItem().file, use_p2p: I ? 1 : 0 });
起因是网友“国王与乞丐”反馈的http://lpl.qq.com/es/live.shtml页面播放不了flash。
看了下,有两个问题,一个是这个是windowless flash,播放的时候如果滚动会花屏。这个bug好改,是我在拿到flash传过来的贴图的时候,贴的位置不对。
还有个就是flash一直提示在加载中。
调试了下js,发现是http://gpcd.gtimg.cn/qt/gpack/zhibo/js/2.b4f5f94d.chunk.min.js里面负责加载jwplayer的。jwplayer是一个曾经开源的flash播放器,看来腾讯的同事也是拿来就用啊。
现在的主要问题就是
这几句之后,getPlaylistItem获取到的播放列表是空的。我用原版webkit也试了下,
居然是能正常加载的。所以就怀疑这个 A().load没加载成功。这个A().load其实内部,就是拿到<object>对象后,直接obj["jwLoad"](loadConfig);这种形式加载的。
这一阶段的时候我陷入了很长时间的困惑,一直没搞明白哪里没成功。甚至还把jwplayer的代码找来对比。开始怀疑是权限,后来又怀疑是我少写了什么辅助函数。
最后发现原因是NPV8Object.cpp里的createValueListFromVariantArgs问题。这个函数会在flash调用到blink里用来转换 NPVariant* arguments到v8参数,在_NPN_Invoke里用到。而我的NPVariant的结构体,是从qq浏览器里代码拷出来的,没想到被同事多加了一个字段!
附一些调试记录:
flash会事先加载一段js:
function __flash__arrayToXML(obj) {var s = "<array>";for (var i=0; i<obj.length; i++) {s += "<property id=\"" + i + "\">" + __flash__toXML(obj[i]) + "</property>";}return s+"</array>";}function __flash__argumentsToXML(obj,index) {var s = "<arguments>";for (var i=index; i<obj.length; i++) {s += __flash__toXML(obj[i]);}return s+"</arguments>";}function __flash__objectToXML(obj) {var s = "<object>";for (var prop in obj) {s += "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>";}return s+"</object>";}function __flash__escapeXML(s) {return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");}function __flash__toXML(value) { var type = typeof(value);if (type == "string") {return "<string>" + __flash__escapeXML(value) + "</string>";} else if (type == "undefined") { return "<undefined/>";} else if (type == "number") { return "<number>" + value + "</number>";} else if (value == null) { return "<null/>";} else if (type == "boolean") { return value ? "<true/>" : "<false/>";} else if (value instanceof Date) { return "<date>" + value.getTime() + "</date>"; } else if (value instanceof Array) { return __flash__arrayToXML(value); } else if (type == "object") { return __flash__objectToXML(value); } else { return "<null/>"; //???}}function __flash__request(name) { return "<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,1) + "</invoke>";}
这样到as里绑定js的函数:ExternalInterface.addCallback("toASS", callHandler); 的时候,如果你在js里调用了toASS(["sdfasdfasdf"])这个函数,flash会先执行
__flash__request("toASS", ["sdfasdfasdf"]
把js的调用转成xml,类似
<invoke name="toASS" returntype="javascript">
<arguments>
<array>
<property id="0">
<string>asdfasdfasdf</string>
</property>
</array>
</arguments>
</invoke>
这样,再传给as处理,as内部根据这个xml识别成as里的对应对象,如数组、字符串等。
另外third_party\WebKit\Source\bindings\core\v8\V8NPObject.cpp 的npObjectInvokeImpl是负责从blink的js层调用到flash npapi里的函数。
webkit类似的地方是Source\WebCore\bridge\c\c_instance.cpp的CInstance::invokeMethod。
webkit的Source\WebKit\win\Plugins\PluginPackage.cpp的NPN_Invoke和blink的third_party\WebKit\Source\bindings\core\v8\NPV8Object.cpp的NPV8Object.cpp做的事情是flash npapi调用到blink的js。
String json = JSC::JSONStringify(exec, resultObj, 4);可以用来转换jsc的js object成json。
- 终于找到miniblink播放jwplayer不了的原因了
- 终于找到包裹打不开的原因了
- 终于找到BalloonTip一直弄不出的原因了
- 终于找到程序员无休止加班的原因了
- 终于找到程序员无休止加班的原因了
- 终于找到程序员无休止加班的原因了
- 【转载】终于找到程序员无休止加班的原因了!
- 哇塞!!!不同的播放器,终于被我找到了。
- 单片机烧录不了,找到原因了
- miniblink 0.1 demo版本终于出来了
- 困扰了我很久STM32的TIM1时钟走慢的问题终于找到原因了
- 谢娜终于透露了至今未生孩子的原因,网友直呼接受不了
- 大家久等了,miniblink终于开源了!!
- 终于找到了 (enterFrame) 事件让swf“卡死”的原因
- mysql 短连接压测遇到的问题及查找解决思路[终于找到原因了]
- 走访2000人:终于找到诺基亚销量不好的原因了
- 在火狐浏览器下,脚本被拖死的原因终于找到了!
- 终于找到jquery ajxa请求传图片时为什么总是失败的原因了!
- 得到根目录下文件夹路径
- TCP/IP 之 大明王朝邮差
- E-R 图
- SpringCloud分布式开发五大神兽
- iOS开发生成PHP推送的pem证书
- 终于找到miniblink播放jwplayer不了的原因了
- Android 集成Line登陆提示无法正常处理
- Tastypie 资源过滤器的相关机制介绍
- iOS-响应上下左右滑动手势
- 2017CCPC秦皇岛现场赛
- springAOP拦截并打印controller层请求日志---注解方式实现
- 大数据面试题及答案-汇总版
- php 获取全路径中的文件名
- android studio gradle 两种更新方法更新