我在尝试向公司的flash播放器发送JSON命令时遇到了一个奇怪的问题。基本上,我无法传递播放列表到这个播放器-什么都没有发生-使用以下命令:
player.sendEvent("LOAD_PLAYLIST", json_str);
,但最奇怪的部分是,如果我使用Firebug的console.log打印整个命令,复制它并将其粘贴到代码中(因此硬编码播放列表),一切都像魔法一样工作。
例如:
player.sendEvent("LOAD_PLAYLIST", "{"streams": [{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname1/prog_1_20110804.mp4"},{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname2/prog_2_20110804.mp4"},{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname3/prog_3_20110804.mp4"}]}");
由
得到console.log('[loadNewListofContents] playing the following content list: player.sendEvent("LOAD_PLAYLIST", ' + json_str.toString() + ');');
如果我硬编码它,它就能工作!我已经尝试了我能想到的所有toString()技巧(例如:json_str.toString(), '"' + json_str.toString() + '"'等…),但到目前为止还没有这样的运气。
任何想法?提前感谢!
如果您找不到使用JSON字符串的解决方案,也许您可以尝试发送一个对象—一个JavaScript对象,而不是对象的JSON表示—因为ExternalInterface会为您处理序列化。
换句话说,对象可以直接使用ExternalInterface在JavaScript和ActionScript之间发送,而不需要你自己做任何序列化和反序列化。
您发布的代码
player.sendEvent("LOAD_PLAYLIST", "{"streams": [{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname1/prog_1_20110804.mp4"},{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname2/prog_2_20110804.mp4"},{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname3/prog_3_20110804.mp4"}]}");
是一个使用""转义引号的字符串。AS3有已知的问题
只需将JavaScript对象直接传递给SWf。
// And in your AS3 code add this
if(ExternalInterface.available){
ExternalInterface.addCallBack("AS3functiontocall", AS3functiontocall );
}
function AS3functiontocall( var obj:Object ):void{
trace( obj.streams[0] ); // might have to eval or JSON.decode the obj
}
// JavaScriptcode should look something like
function sendList( ){
var container;
if (navigator.appName.indexOf("Microsoft") >= 0){
container = document;
}else{
container = window;
}
var obj = {
"streams": [
{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname1/prog_1_20110804.mp4"},
{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname2/prog_2_20110804.mp4"},
{"src": "rtmp://xxx.xxx.xx:80/redirectvodxxx/nas2.share/h264/512x384/progname3/prog_3_20110804.mp4"}
]
}
var result = container["yourswfnamehere"].AS3functiontocall ( obj );
}
这段代码是未经测试的,但它应该给你一个想法