显示标签为“flash”的博文。显示所有博文
显示标签为“flash”的博文。显示所有博文

2007年6月4日

使用了ExternalInterface的swf在ie中如果id中有点(.)将会报错。

swf using ExternalInterface in IE, if there is dot(.) in it's id, IE will be fired error.

这几天研究flash flv player,发现了似乎bug的东西,前几天或者说是更早的时候我发现当swf使用了ExternalInterface接口和javascript通信的时候,在ie中如果id中有点(.)将会报错,ie则会报错,通过vs2005跟踪到以下代码:

__flash__removeCallback(nebula.player.FLVPlayer, "_stop");

这是其一。 在调用通信接口时会看到:

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, "&amp;").replace(/"&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
}
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__addCallback(instance, name) {
  instance[name] = function () { 
    return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
  }
}
function __flash__removeCallback(instance, name) {
  instance[name] = null;
}

这是其二,一般是在__flash__addCallback这个方法里报错, 一般是说instance没有定义。我的浏览器是IE6.0,flash player的版本是9,0,45,0,这个问题只有在IE中存在。

我们知道在IE里我们可以在JavaScript直接使用一个HtmlElement的Id来引用它而不用事先声明它或使用getElementById获取它,我想问题就存在这里了,当Id中存在点"."的时候,如果仍然这样引用显然会报错,比如在这个例子中会说"nebula未定义",从Adobe的代码似乎这样写的了。显然是无法将dom的带“点”的id直接声明成变量。

依我看,这应该是一个地地道道的bug。

我不知道如何submit或confirm Adobe的bug,有谁知道,不妨指点一下。

2007年6月1日

nebula flash FLVPlayer 0.1.05.30测试发布了

这个版本经过测试解决了大多问题,大小10,479 字节。使用“_open”方法可以打开flv地址。具有以下特性:

  • 对于已经buffer的部分快进快退
  • 对于逐帧的flv文件可以按帧播放(在转flv时使用了key frame placement:custom, key frame interval 1 frame)
  • 全屏
  • 音量控制
  • 保持画面比例/拉伸切换

你可以访问这个页面来参考它是如何工作的:http://swanky.wu.googlepages.com/nebula.player.FLVPlayer.html

你可以通过http://swanky.wu.googlepages.com/nebula.player.FLVPlayer.0.1.05.30.swf这个地址来下载它。

大多的属性或方法没有通过ExternalInterface共享出来,对于这个0.1版本可能是越简单越好。

2007年5月28日

swf in browsers wmode bug or design ?

当我在浏览器里将wmode这个属性改为transparent的时候,我发现在这个属性为window时没有任何问题“全屏”功能不在可用。 我开始觉得这是一个bug,因为在IE,FF, Opera上都有此问题。
于是Google之 flash wmode transparent fullscreen发现这个问题正在adobe的bug提交中,依我看,如果是设计的的话可以说是“不合理”,如果是bug的话,为何仍未解决?

暂时的解决方案

使用脚本在flash调用fullscreen的时候,通知javascript将wmode设置为“wndow”,然后再回调action进行全屏。
[Update]经过测试只用脚本更改wmode无法达到目的,需要将html进行重写,我在写脚本的模块的时候同时发现在Parameters and attributes 描述的有些属性和参数在浏览器渲染swf之后的更改是无效的,这可能不是做为swf的SDK开放出来的,下一步如何做还需进一步研究。

最后我不太清除如何confirm adobe的bug,地址是http://labs.adobe.com/wiki/index.php/Talk:Flash_Player:9:Update:Full-Screen_Mode:Demos 哪位好心人去确认一下吧。