基于MFC的SWF动画文件解析设计*
2011-11-27鲁云飞何明华
鲁云飞,何明华
(1.福州大学 电气工程与自动化学院,福建 福州 350108;2.福州大学 物理与信息工程学院,福建 福州 350108)
SWF作为Flash动画文件的一个重要分枝,是嵌入网页或独立播放的Flash影片压缩格式,具有非常优秀的压缩性、传输性与交互性,且因其能将矢量图、位图、音频、视频和深一层交互动作等有机地、灵活地结合在一起,所以该矢量图形文件格式的动画具有美观、新奇、交互性强的效果[1]。伴随着Flash技术的不断发展,SWF动画以其众多的优点被人们广泛应用于生活的方方面面,特别是在娱乐方面,更是占有相当大的市场[2-3]。 同时,随着嵌入式技术的迅速发展,人们对生活娱乐的需求越来越大,其要求也越来越高,如对娱乐设备的便携性需求。然而,纵观国内外,嵌入式设备对SWF动画播放的支持存在很多不足,特别是嵌入式WinCE设备。因而,研究与解析SWF动画文件以获取文件中各个元素信息及识别动画信息,具有更加现实而迫切的意义。
目前,已有人在对SWF动画文件开发上投入大量时间与精力,但大多是用其他开发工具进行开发,如借用具有强大数据库支持的Delphi为开发媒介[4]。嵌入式系统对编程语言的限制,使得如将以Pascal编程语言为媒介的Delphi开发平台开发的PC应用程序移植到嵌入式系统中,其难度及工作量将大大增加,不利于其后续的开发与研究;而MFC是微软基础类库,提供了所有一般C++编程的优点,且封装了成千上万行正确、优化和功能强大的Windows代码,能极大地加快程序开发速度及简化开发工作量,同时MFC还具有良好的移植性能[5-6]。因而,考虑到后续在嵌入式WinCE操作系统上开发SWF动画播放器,本文在分析与研究SWF动画文件的基础上,充分利用MFC的众多优点,以VS 2005为开发平台,C++语言为编程工具,实现了对SWF文件的解析与文件信息的读取,并利用MFC界面窗口的人性化,构建了一个简洁而直观的窗口对文件的解析信息进行显示。
1 解析方法设计
1.1 SWF结构简析
SWF文件主要由文件头和多个标签组成,且最后以一个结束标签(End Tag)结束[7]。SWF文件的文件头具有一个标准格式,即包括了SWF文件的标识符、版本号、文件大小、影片尺寸、帧速率以及文件总帧数等信息,如表1所示。
而文件标签则主要包含标签头和标签数据两个部分信息。标签的数据部分紧跟在标签头后,承载了该标签所有的数据信息;标签头则主要包含标签类型(即标签的ID值)两方面的信息和该标签的长度。由于长度大小的差异,标签头存在短格式和长格式两种格式,详见2.2.2。当按照各自的功能划分时,又可将SWF文件中所有的标签划分为描述标签和控制标签。描述标签描述了SWF影片的内容,如形状、文本、图像、声音等;而控制标签可以对描述标签所定义的元素进行操作,以控制动画的播放。
1.2 解析工程架构设计
简单分析SWF动画文件结构后,现对整个解析工程构架进行设计。图1所示为所设计的SWF文件解析工程整体构架图。该架构主要分为工程平台搭建与解析工程实现两大部分,前者为整个项目的基础,后者则是核心。
对于一个SWF文件而言,由于文件头信息是固定的,但其标签远不止一个,因而在解析工程实现进程中,解析数据的显示实现采用了分开显示的方法,即对于文件头数据边解析边显示;而对于标签数据则是边解析边存储,当所有标签全解析完成后再显示。
2 解析的实现
MFC(Microsoft Foundation Class Library)实现了对应用程序概念的封装,能为Windows应用程序开发提供程序控制框架,并能完成一定的预定义或事件和消息处理等。根据图1所示的解析流程图,在VS 2005程序开发平台下利用MFC编程实现对SWF文件的解析。
2.1 工程平台搭建
在VS 2005开发平台上,新建一个基于对话框的MFC项目工程,图2所示为新建项目工程中的一个工程设置界面。
项目工程设置完毕后,为方便而直观地呈现本应用程序的解析结果,本文在对SWF文件进行解析前,先对应用程序显示界面进行了设计。该界面设计主要分为功能按钮和窗口显示两个部分。功能按钮部分实现 “打 开 ”、“退 出 ”、“确定”以及“取消”等操作,而窗口显示部分则完成对SWF文件解析信息的显示功能。
图1 解析工程整体构架
图2 工程项目设置
2.2 解析工程实现
当搭建完项目工程平台并设计完应用程序显示界面外观后,接下来进行本项目工程的核心工作——实现SWF文件解析。此处涉及显示界面通信与解析主程序两方面的程序编写与功能实现,其中,解析主程序为本项目工程的重点部分。
2.2.1显示界面的通信
显示界面主要是与解析主程序通信,以实现对SWF文件解析完成后的结果显示。为减小通信操作的复杂度,在程序编写时充分使用MFC所封装的消息机制及程序参变量存储等方式,将文件解析所得数据传送到显示界面相应显示部分。
以SWF文件的选中与打开为例,显示解析界面部分主要通过编程使用MFC中封装的CFileDialog类,定义一个文件对话框对象lpszOpenFile来完成对SWF文件的过滤选取操作。当点击界面中的“打开”按钮在过滤框中选中需解析的SWF文件后,再点击界面中的“确定”按钮,lpszOpenFile实例化对象就可通过MFC封装的消息机制返回得到已选中打开SWF文件的路径参数。将此路径作为参变量传入到解析主程序的文件打开接口后,即可在文件解析主程序中实现对SWF文件打开、存盘及后续的数据解析操作。
2.2.2解析核心的实现
如上,解析主程序开始前,先将解析界面已选中的SWF文件以二进制读写方式打开。文件被成功打开之后,开始完成SWF文件解析的第一步——文件头解析实现。
如表 1所示,SWF文件头一般以 0x46、0x57、0x53(FWS)或 0x43、0x57、0x53(CWS)开始。 使用 Windows API函数fread读取并存储文件头的前3个字节,若该字节内容为“FWS”,则表示未被压缩;否则,则表示文件被压缩过,此时如要正确解析该文件,就需要先调用ZLIB解压包,对从文件头第9个字节直至文件结束的所有数据进行解压,解压还原后的数据操作即与“FWS”所对应数据处理相一致。
紧接文件头前3个字节处理之后的数据操作如下:读取1 B的版本号信息及4 B的文件长度信息,以及帧尺寸RECT数据。其中,RECT型数据是从第9个字节开始的,其数据结构如表2所示。由于该类型数据大小不确定,因而该部分数据的分析很关键。分析及计算RECT数据占用总字节大小过程如图3所示,式(1)为Buff2大小的计算方法。
表2 帧尺寸RECT的数据结构
图3 RECT数据占用字节计算
由于该段数据存储内容使用twip(1 pixel=20 twips)为单位,因而还需对读取的Buff3个字节长度的数据进行相应计算处理,将其最终还原为SWF动画文件编码前的帧尺寸数据。紧接此后,将帧速率数据读取出来,并使用Ctring类中小数点操作成员函数Format对读取的数据进行相应的小数点格式化处理,以得到文件帧速率。最后为帧总数大小数据处理,此时只需紧接帧速率数据后读取两个字节数据并进行相应存储即可。
其次,则是对SWF文件标签解析的实现。此时,要想解析工作准确无误地展开,就需先解决长、短标签头的问题。所谓短标签,其紧跟的标签数据总长度小于或等于62 B,其标签头结构如表3所示。而长标签头结构如表4所示,其前16 bit数据结构与短标签头结构相似,其后的一个无符号32 bit数据才是该标签头后紧跟的标签数据实际长度。
表3 短标签头结构
表4 长标签头结构
依据表3、表4结构规则及各标签在文件中出现的先后次序,依次将各标签的Tag类型号、数据长度及偏移字节数等信息读取出来,并做相应处理,处理流程如图4所示。
图4 Tag解析流程
其中,标签类型值计算如式(2)所示。而标签长度则需进行 “与”操作以取出参变量Code中数据的后6 bit数据,且如该标签为短标签时,标签的实际长度即为“与”操作后的数据值,即 TagLen=Code&0x3F,否则,则需从读取Code参变量后的位置开始继续向后读取4个无符号的字节数据,作为该标签的实际长度。
解析主程序着重从文件头与文件标签两方面完成对SWF文件的解析,并通过MFC的消息反馈机制及参数传递完成了与显示窗口通信,实现了对所得解析数据的显示。当然,在主程序编程过程中,需特别注意文件数据读取中位置指针及偏移量的改变,同时,为减少频繁更新偏移量与指针定位操作,本文在必要时使用了指针变量替代单个参变量存储的方法,既确保数据的准确读取,又有效减少了读取的工作量。
3 性能测试与分析
3.1 界面介绍
为方便而直观地查看本设计的解析效果,本文充分利用MFC面向对象编程方法的优越性能,将解析结果以人性化的对话框形式展现出来。其界面主要包括以下几个方面:Header信息显示、Tag数据信息显示及基本操作按键。其中,标签数据信息显示部分则包括两部分内容,即当前标签数据信息的显示和下一标签数据基本信息的显示。
3.2 测试结果与分析
本文以一个SWF格式的网络动画文件为测试对象,用二进制查看器UltraEdit查看该测试文件的部分数据,如图5所示。而用所开发的软件解析程序对该测试动画文件进行解析后,其实现效果如图6所示。
图5 测试文件的部分二进制信息
图6 解析效果
通过对图5中数据进行分析,可得该测试动画文件的信息:文件的版本为7.0,总帧数为1 083帧,文件总大小为611 726 B,且其播放时的帧频为 12.0帧/s,画面尺寸大小为602 Pixel×420.9 Pixel。图 6显示了该测试文件的头数据信息及TagID为18的标签数据。当点击TagID后的下拉菜单时,可对随意选取的测试文件中任意标签数据信息进行显示。因而,本设计软件解析出来的数据信息与以上分析所得相一致,且数据参看操作便捷。由此可见,本设计已能成功对SWF动画文件进行解析,且解析数据精准,效果理想。
本文以MFC编程为手段,在简析了SWF动画文件结构后,充分利用MFC高效的编程效率及一系列优秀性能,在VS 2005开发平台上重点实现了对SWF动画文件头及文件标签的解析。在此基础上,利用MFC直观而便捷地将解析与提取的SWF动画文件信息在对话框窗口上进行了显示。随着嵌入式技术的迅速发展及人们日益增长的生活娱乐需求,在便携的嵌入式设备上实现对功能强大的SWF动画文件播放功能开发变得越来越迫切,而本文基于MFC对SWF动画信息进行解析开发,为嵌入式WinCE操作系统上SWF播放器的设计奠定了坚实基础。
[1]Yang Jun, Li Qing, Liu Wenyin, et al.Searching for Flash movies on the Web:a content and context based framework [C].Internetand Web Information Systems,2005:1-27.
[2]李丽华,毛淑华,魏树全.基于嵌入式应用的 SWF文件文本信息的提取研究[J].长沙大学学报,2010,24 (2):65-67.
[3]SWAMINATHAN A.Creating interactive and reusable learning contents using Flash and XML to make E-learning interesting.ITE TEACHERS′CONFERENCE,2005:1-7.
[4]曾益民,叶汝强.使用ActiveX控件实现对Flash电影的支持[J].计算机应用研究,2000(8):66-76.
[5]甄力,郭宝增.MFC中的消息映射和命令传递[J].计算机与数字工程,2005,35(7):46-48.
[6]范跃华,张素芹,徐飞.基于 WinCE平台的应用程序移植研究[J].西安工业大学学报,2007,27(1):91-94.
[7]AdobeSystemsIncorporated.MacromediaFlash (SWF)File Format Specification Version[EB/OL].http://www.macromedia.com/support/documentation/doctypes.html.2008-11.