狂人日记·技术版

挖掘.NET的全部潜力

用.NET读取Flash格式文件信息

一直以来存在这么一个问题,就是当用户上传的Flash文件时都需要附带输入Flash的宽和高,否则显示的时候由于不知道这些数值而导致Flash比例不正常。

近日我做网站也涉及到了这方面的问题,于是打算解决一下。

首先在Google上搜索,可以找到获取Flash宽和高的JavaScript,但是是在Flash载入后而不是之前,而且也没法动态更改object标记的宽和高,最重要的是有Flash Player的安全警告信息,所以放弃了在客户端读取,转而考虑服务器端。

在VS内导入flash.ocx控件,试图获取Flash文件信息,结果在调用TGetProperty()方法是总是以返回E_FAIL错误而失败,如果哪位高手知道如何在.NET下使用,欢迎指明。

想来想去,只剩下一个办法,也是最可行的办法,就是直接读取Flash文件并分析格式。

在Google上搜到 Macromedia Flash (SWF) File Format Specification Version 7 (http://www.xiaowowo.com/gt_book/new/flashfileformat.rar)

经过反复阅读和尝试,最终写出了 FlashInfo 类,调用方法如下:

FlashInfo flashInfo = new FlashInfo(@"c:\test.swf"); // 构造函数,参数是Flash文件地址
Console.WriteLine(
string.Format("Version: {0}", flashInfo.Version)); // Flash版本
Console.WriteLine(
string.Format("Compressed: {0}", flashInfo.IsCompressed)); //是否被压缩
Console.WriteLine(
string.Format("Width: {0}", flashInfo.Width)); // Flash的宽度
Console.WriteLine(
string.Format("Height: {0}", flashInfo.Height)); // Flash的高度
Console.WriteLine(
string.Format("FrameRate: {0}", flashInfo.FrameRate)); // 帧速率
Console.WriteLine(
string.Format("FrameCount: {0}", flashInfo.FrameCount)); // 总帧数
Console.WriteLine(
string.Format("FileLength: {0}", flashInfo.FileLength)); // 未压缩时的文件大小

自从Flash格式版本6以后,增加了可压缩选项,用的是ZLib压缩,为了支持压缩格式,只好又在Google上找了一个ZLib .NET Wrapper (http://zlibnetwrapper.sourceforge.net/)

FlashInfo 类的源代码和编译好的库文件提供给有同样需求的朋友下载:http://files.cnblogs.com/gmm/FlashInfo.zip

水平有限,不足之处难免,请各位指正!

posted on 2006-01-04 12:42 狂人 阅读(2606) 评论(15)  编辑 收藏

评论

#1楼  2006-01-04 16:40 zitiger      

没用过,但是很有吸引力哦.哈,谢谢 谢谢    回复  引用  查看    

#2楼  2006-01-04 16:55 AA [未注册用户]

楼主
你提供的
FlashInfo 类的源代码和编译好的库文件提供给有同样需求的朋友下载:http://www.cnblogs.com/Files/gmm/FlashInfo.zip
是什么格式
根本打不开
  回复  引用    

#3楼 [楼主] 2006-01-04 17:21 狂人      

To AA:

标准的zip格式啊,难道现在zip压缩都不流行了?   回复  引用  查看    

#4楼  2006-01-04 18:33 fuyude.net      

能打开   回复  引用  查看    

#5楼  2006-01-04 19:42 C# hack      

不错   回复  引用  查看    

#6楼  2006-01-04 19:46 jeky      

老大,如何让swf转exe,并且可以修改exe的图标?
我想要一些这方面的资料!谢谢~   回复  引用  查看    

#7楼  2006-01-05 11:14 HardRock      

关于ZLib,倒是建议使用SharpzipLib,这个是完全C#实现的,是http://www.icsharpcode.net 的一个开源产品,我的blog上也有些介绍,另外iTextSharp就是使用SharpzipLib。   回复  引用  查看    

#8楼  2006-03-21 17:29 800abc [未注册用户]

当读取的不是真正的压缩FLASH时,内存暴涨,各位可以试下,,把任何文件的前三字符改成CWS,然后测试,   回复  引用    

#9楼  2007-05-16 15:29 小谢 [未注册用户]

好东西啊.谢谢,楼主...
我弄了很久....

终于找到了..

还是google的搜索比百度好啊.   回复  引用    

#10楼  2007-07-17 17:19 sakura [未注册用户]

我用这段代码读取Flash文件的高度和宽度,可结果不对,请问是什么原因啦?   回复  引用    

#11楼  2007-10-15 20:29 Howard Queen [未注册用户]

实在是佩服!帮了大忙,不说几句感谢的话心里实在过意不去!
非常感谢!   回复  引用    

#12楼  2007-12-19 21:02 chengLei [未注册用户]

好东西,好东西,谢谢!!!   回复  引用    

#13楼  2008-01-02 18:22 Chris Liu      

支持一下   回复  引用  查看    

#14楼  2008-05-08 10:07 笨笨蜗牛      

--引用--------------------------------------------------
800abc: 当读取的不是真正的压缩FLASH时,内存暴涨,各位可以试下,,把任何文件的前三字符改成CWS,然后测试,
--------------------------------------------------------
这个是当然的,因为managedzlib这个模块只简单的把数据流当作是zlib压缩格式处理,没有进行安全检测(事实上,具体的内容是否是zlib压缩格式是由cws标记识别的)。

感觉大大的这句话很有意思。

另:求managedzlib源代码。   回复  引用  查看    

#15楼  2008-05-30 16:40 簡簡單單..      

实用实用..   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: