Проблема связи JSON Javascript с Flash (с ExternalInterface): жестко закодированная строка работает, иначе она не будет - PullRequest
1 голос
/ 05 августа 2011

Я столкнулся со странной проблемой при попытке отправить команду 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 () + '"' и т. Д.), Но пока что не повезло. 1012 *

Есть идеи? Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

Если вы не нашли решение, использующее строки JSON, возможно, вы могли бы вместо этого попытаться отправить объект - объект JavaScript, а не представление объекта в формате JSON - поскольку ExternalInterface позаботится о сериализации для вас.

Другими словами, объекты можно отправлять между JavaScript и ActionScript напрямую, используя ExternalInterface, без каких-либо собственных сериализаций и десериализации.

2 голосов
/ 06 августа 2011

код, который вы опубликовали

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 );
}

Этот код не проверен, но он должен дать вам представление

...