《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于MFC的SWF動(dòng)畫文件解析設(shè)計(jì)
基于MFC的SWF動(dòng)畫文件解析設(shè)計(jì)
來源:微型機(jī)與應(yīng)用2011年第17期
魯云飛1,,何明華2
(1.福州大學(xué) 電氣工程與自動(dòng)化學(xué)院,,福建 福州 350108,;2.福州大學(xué) 物理與信息工程學(xué)院,
摘要: 提出了以MFC為開發(fā)工具對(duì)SWF動(dòng)畫文件進(jìn)行解析開發(fā),,在分析SWF動(dòng)畫文件頭結(jié)構(gòu)和標(biāo)簽結(jié)構(gòu)的基礎(chǔ)上,設(shè)計(jì)了SWF動(dòng)畫文件的解析流程,,并利用MFC優(yōu)越的C++語言編程性能,,在VS 2005開發(fā)平臺(tái)上實(shí)現(xiàn)了對(duì)SWF動(dòng)畫環(huán)境、動(dòng)畫元素等信息的讀取,為嵌入式WinCE操作系統(tǒng)下Flash播放器的研制奠定了堅(jiān)實(shí)的基礎(chǔ),。
Abstract:
Key words :

摘  要: 提出了以MFC為開發(fā)工具對(duì)SWF動(dòng)畫文件進(jìn)行解析開發(fā),,在分析SWF動(dòng)畫文件頭結(jié)構(gòu)和標(biāo)簽結(jié)構(gòu)的基礎(chǔ)上,,設(shè)計(jì)了SWF動(dòng)畫文件的解析流程,,并利用MFC優(yōu)越的C++語言編程性能,在VS 2005開發(fā)平臺(tái)上實(shí)現(xiàn)了對(duì)SWF動(dòng)畫環(huán)境,、動(dòng)畫元素等信息的讀取,,為嵌入式WinCE操作系統(tǒng)下Flash播放器的研制奠定了堅(jiān)實(shí)的基礎(chǔ)。
關(guān)鍵詞: SWF,;解析,;文件結(jié)構(gòu);MFC,;VS 2005

 SWF作為Flash動(dòng)畫文件的一個(gè)重要分枝,,是嵌入網(wǎng)頁或獨(dú)立播放的Flash影片壓縮格式,具有非常優(yōu)秀的壓縮性,、傳輸性與交互性,,且因其能將矢量圖、位圖,、音頻,、視頻和深一層交互動(dòng)作等有機(jī)地、靈活地結(jié)合在一起,,所以該矢量圖形文件格式的動(dòng)畫具有美觀,、新奇、交互性強(qiáng)的效果[1],。伴隨著Flash技術(shù)的不斷發(fā)展,,SWF動(dòng)畫以其眾多的優(yōu)點(diǎn)被人們廣泛應(yīng)用于生活的方方面面,特別是在娛樂方面,,更是占有相當(dāng)大的市場(chǎng)[2-3],。同時(shí),隨著嵌入式技術(shù)的迅速發(fā)展,,人們對(duì)生活?yuàn)蕵返男枨笤絹碓酱?,其要求也越來越高,如?duì)娛樂設(shè)備的便攜性需求,。然而,,縱觀國內(nèi)外,嵌入式設(shè)備對(duì)SWF動(dòng)畫播放的支持存在很多不足,,特別是嵌入式WinCE設(shè)備,。因而,研究與解析SWF動(dòng)畫文件以獲取文件中各個(gè)元素信息及識(shí)別動(dòng)畫信息,,具有更加現(xiàn)實(shí)而迫切的意義,。
 目前,,已有人在對(duì)SWF動(dòng)畫文件開發(fā)上投入大量時(shí)間與精力,但大多是用其他開發(fā)工具進(jìn)行開發(fā),,如借用具有強(qiáng)大數(shù)據(jù)庫支持的Delphi為開發(fā)媒介[4],。嵌入式系統(tǒng)對(duì)編程語言的限制,使得如將以Pascal編程語言為媒介的Delphi開發(fā)平臺(tái)開發(fā)的PC應(yīng)用程序移植到嵌入式系統(tǒng)中,,其難度及工作量將大大增加,,不利于其后續(xù)的開發(fā)與研究;而MFC是微軟基礎(chǔ)類庫,,提供了所有一般C++編程的優(yōu)點(diǎn),,且封裝了成千上萬行正確、優(yōu)化和功能強(qiáng)大的Windows代碼,,能極大地加快程序開發(fā)速度及簡(jiǎn)化開發(fā)工作量,,同時(shí)MFC還具有良好的移植性能[5-6]。因而,,考慮到后續(xù)在嵌入式WinCE操作系統(tǒng)上開發(fā)SWF動(dòng)畫播放器,,本文在分析與研究SWF動(dòng)畫文件的基礎(chǔ)上,充分利用MFC的眾多優(yōu)點(diǎn),,以VS 2005為開發(fā)平臺(tái),,C++語言為編程工具,實(shí)現(xiàn)了對(duì)SWF文件的解析與文件信息的讀取,,并利用MFC界面窗口的人性化,,構(gòu)建了一個(gè)簡(jiǎn)潔而直觀的窗口對(duì)文件的解析信息進(jìn)行顯示。
1 解析方法設(shè)計(jì)
1.1 SWF結(jié)構(gòu)簡(jiǎn)析

 SWF文件主要由文件頭和多個(gè)標(biāo)簽組成,,且最后以一個(gè)結(jié)束標(biāo)簽(End Tag)結(jié)束[7],。SWF文件的文件頭具有一個(gè)標(biāo)準(zhǔn)格式,即包括了SWF文件的標(biāo)識(shí)符,、版本號(hào),、文件大小、影片尺寸,、幀速率以及文件總幀數(shù)等信息,,如表1所示。

 而文件標(biāo)簽則主要包含標(biāo)簽頭和標(biāo)簽數(shù)據(jù)兩個(gè)部分信息,。標(biāo)簽的數(shù)據(jù)部分緊跟在標(biāo)簽頭后,,承載了該標(biāo)簽所有的數(shù)據(jù)信息;標(biāo)簽頭則主要包含標(biāo)簽類型(即標(biāo)簽的ID值)兩方面的信息和該標(biāo)簽的長(zhǎng)度,。由于長(zhǎng)度大小的差異,,標(biāo)簽頭存在短格式和長(zhǎng)格式兩種格式,詳見2.2.2。當(dāng)按照各自的功能劃分時(shí),,又可將SWF文件中所有的標(biāo)簽劃分為描述標(biāo)簽和控制標(biāo)簽,。描述標(biāo)簽描述了SWF影片的內(nèi)容,如形狀,、文本,、圖像、聲音等,;而控制標(biāo)簽可以對(duì)描述標(biāo)簽所定義的元素進(jìn)行操作,,以控制動(dòng)畫的播放,。
1.2 解析工程架構(gòu)設(shè)計(jì)
 簡(jiǎn)單分析SWF動(dòng)畫文件結(jié)構(gòu)后,,現(xiàn)對(duì)整個(gè)解析工程構(gòu)架進(jìn)行設(shè)計(jì)。圖1所示為所設(shè)計(jì)的SWF文件解析工程整體構(gòu)架圖,。該架構(gòu)主要分為工程平臺(tái)搭建與解析工程實(shí)現(xiàn)兩大部分,,前者為整個(gè)項(xiàng)目的基礎(chǔ),后者則是核心,。

 對(duì)于一個(gè)SWF文件而言,,由于文件頭信息是固定的,但其標(biāo)簽遠(yuǎn)不止一個(gè),,因而在解析工程實(shí)現(xiàn)進(jìn)程中,,解析數(shù)據(jù)的顯示實(shí)現(xiàn)采用了分開顯示的方法,即對(duì)于文件頭數(shù)據(jù)邊解析邊顯示,;而對(duì)于標(biāo)簽數(shù)據(jù)則是邊解析邊存儲(chǔ),,當(dāng)所有標(biāo)簽全解析完成后再顯示。
2 解析的實(shí)現(xiàn)
 MFC(Microsoft Foundation Class Library)實(shí)現(xiàn)了對(duì)應(yīng)用程序概念的封裝,,能為Windows應(yīng)用程序開發(fā)提供程序控制框架,,并能完成一定的預(yù)定義或事件和消息處理等。根據(jù)圖1所示的解析流程圖,,在VS 2005程序開發(fā)平臺(tái)下利用MFC編程實(shí)現(xiàn)對(duì)SWF文件的解析,。
2.1 工程平臺(tái)搭建
 在VS 2005開發(fā)平臺(tái)上,新建一個(gè)基于對(duì)話框的MFC項(xiàng)目工程,,圖2所示為新建項(xiàng)目工程中的一個(gè)工程設(shè)置界面,。


 項(xiàng)目工程設(shè)置完畢后,為方便而直觀地呈現(xiàn)本應(yīng)用程序的解析結(jié)果,,本文在對(duì)SWF文件進(jìn)行解析前,,先對(duì)應(yīng)用程序顯示界面進(jìn)行了設(shè)計(jì)。該界面設(shè)計(jì)主要分為功能按鈕和窗口顯示兩個(gè)部分,。功能按鈕部分實(shí)現(xiàn)“打開”,、“退出”、“確定”以及“取消”等操作,而窗口顯示部分則完成對(duì)SWF文件解析信息的顯示功能,。
2.2 解析工程實(shí)現(xiàn)
 當(dāng)搭建完項(xiàng)目工程平臺(tái)并設(shè)計(jì)完應(yīng)用程序顯示界面外觀后,,接下來進(jìn)行本項(xiàng)目工程的核心工作——實(shí)現(xiàn)SWF文件解析。此處涉及顯示界面通信與解析主程序兩方面的程序編寫與功能實(shí)現(xiàn),,其中,,解析主程序?yàn)楸卷?xiàng)目工程的重點(diǎn)部分。
2.2.1 顯示界面的通信
 顯示界面主要是與解析主程序通信,,以實(shí)現(xiàn)對(duì)SWF文件解析完成后的結(jié)果顯示,。為減小通信操作的復(fù)雜度,在程序編寫時(shí)充分使用MFC所封裝的消息機(jī)制及程序參變量存儲(chǔ)等方式,,將文件解析所得數(shù)據(jù)傳送到顯示界面相應(yīng)顯示部分,。
 以SWF文件的選中與打開為例,顯示解析界面部分主要通過編程使用MFC中封裝的CFileDialog類,,定義一個(gè)文件對(duì)話框?qū)ο髄pszOpenFile來完成對(duì)SWF文件的過濾選取操作,。當(dāng)點(diǎn)擊界面中的“打開”按鈕在過濾框中選中需解析的SWF文件后,再點(diǎn)擊界面中的“確定”按鈕,,lpszOpenFile實(shí)例化對(duì)象就可通過MFC封裝的消息機(jī)制返回得到已選中打開SWF文件的路徑參數(shù),。將此路徑作為參變量傳入到解析主程序的文件打開接口后,即可在文件解析主程序中實(shí)現(xiàn)對(duì)SWF文件打開,、存盤及后續(xù)的數(shù)據(jù)解析操作,。
2.2.2 解析核心的實(shí)現(xiàn)
 如上,解析主程序開始前,,先將解析界面已選中的SWF文件以二進(jìn)制讀寫方式打開,。文件被成功打開之后,開始完成SWF文件解析的第一步——文件頭解析實(shí)現(xiàn),。
 如表1所示,,SWF文件頭一般以0x46、0x57,、0x53(FWS)或0x43,、0x57、0x53(CWS)開始,。使用Windows API函數(shù)fread讀取并存儲(chǔ)文件頭的前3個(gè)字節(jié),,若該字節(jié)內(nèi)容為“FWS”,,則表示未被壓縮,;否則,,則表示文件被壓縮過,,此時(shí)如要正確解析該文件,就需要先調(diào)用ZLIB解壓包,,對(duì)從文件頭第9個(gè)字節(jié)直至文件結(jié)束的所有數(shù)據(jù)進(jìn)行解壓,,解壓還原后的數(shù)據(jù)操作即與“FWS”所對(duì)應(yīng)數(shù)據(jù)處理相一致,。
 緊接文件頭前3個(gè)字節(jié)處理之后的數(shù)據(jù)操作如下:讀取1 B的版本號(hào)信息及4 B的文件長(zhǎng)度信息,以及幀尺寸RECT數(shù)據(jù),。其中,,RECT型數(shù)據(jù)是從第9個(gè)字節(jié)開始的,其數(shù)據(jù)結(jié)構(gòu)如表2所示,。由于該類型數(shù)據(jù)大小不確定,,因而該部分?jǐn)?shù)據(jù)的分析很關(guān)鍵。分析及計(jì)算RECT數(shù)據(jù)占用總字節(jié)大小過程如圖3所示,,式(1)為Buff2大小的計(jì)算方法,。

 

 

 Buff2=5+Buff2×4(1)
 由于該段數(shù)據(jù)存儲(chǔ)內(nèi)容使用twip(1 pixel=20 twips)為單位,因而還需對(duì)讀取的Buff3個(gè)字節(jié)長(zhǎng)度的數(shù)據(jù)進(jìn)行相應(yīng)計(jì)算處理,,將其最終還原為SWF動(dòng)畫文件編碼前的幀尺寸數(shù)據(jù),。緊接此后,將幀速率數(shù)據(jù)讀取出來,,并使用Ctring類中小數(shù)點(diǎn)操作成員函數(shù)Format對(duì)讀取的數(shù)據(jù)進(jìn)行相應(yīng)的小數(shù)點(diǎn)格式化處理,,以得到文件幀速率,。最后為幀總數(shù)大小數(shù)據(jù)處理,,此時(shí)只需緊接幀速率數(shù)據(jù)后讀取兩個(gè)字節(jié)數(shù)據(jù)并進(jìn)行相應(yīng)存儲(chǔ)即可。
其次,,則是對(duì)SWF文件標(biāo)簽解析的實(shí)現(xiàn),。此時(shí),要想解析工作準(zhǔn)確無誤地展開,,就需先解決長(zhǎng),、短標(biāo)簽頭的問題。所謂短標(biāo)簽,,其緊跟的標(biāo)簽數(shù)據(jù)總長(zhǎng)度小于或等于62 B,,其標(biāo)簽頭結(jié)構(gòu)如表3所示。而長(zhǎng)標(biāo)簽頭結(jié)構(gòu)如表4所示,,其前16 bit數(shù)據(jù)結(jié)構(gòu)與短標(biāo)簽頭結(jié)構(gòu)相似,,其后的一個(gè)無符號(hào)32 bit數(shù)據(jù)才是該標(biāo)簽頭后緊跟的標(biāo)簽數(shù)據(jù)實(shí)際長(zhǎng)度。

 依據(jù)表3,、表4結(jié)構(gòu)規(guī)則及各標(biāo)簽在文件中出現(xiàn)的先后次序,,依次將各標(biāo)簽的Tag類型號(hào)、數(shù)據(jù)長(zhǎng)度及偏移字節(jié)數(shù)等信息讀取出來,,并做相應(yīng)處理,,處理流程如圖4所示。

 其中,,標(biāo)簽類型值計(jì)算如式(2)所示,。而標(biāo)簽長(zhǎng)度則需進(jìn)行“與”操作以取出參變量Code中數(shù)據(jù)的后6 bit數(shù)據(jù),,且如該標(biāo)簽為短標(biāo)簽時(shí),標(biāo)簽的實(shí)際長(zhǎng)度即為“與”操作后的數(shù)據(jù)值,,即TagLen=Code&0x3F,,否則,則需從讀取Code參變量后的位置開始繼續(xù)向后讀取4個(gè)無符號(hào)的字節(jié)數(shù)據(jù),,作為該標(biāo)簽的實(shí)際長(zhǎng)度,。
 TagID=Code>>6 (2)
 解析主程序著重從文件頭與文件標(biāo)簽兩方面完成對(duì)SWF文件的解析,并通過MFC的消息反饋機(jī)制及參數(shù)傳遞完成了與顯示窗口通信,,實(shí)現(xiàn)了對(duì)所得解析數(shù)據(jù)的顯示,。當(dāng)然,在主程序編程過程中,,需特別注意文件數(shù)據(jù)讀取中位置指針及偏移量的改變,,同時(shí),為減少頻繁更新偏移量與指針定位操作,,本文在必要時(shí)使用了指針變量替代單個(gè)參變量存儲(chǔ)的方法,,既確保數(shù)據(jù)的準(zhǔn)確讀取,又有效減少了讀取的工作量,。
3 性能測(cè)試與分析
3.1 界面介紹

 為方便而直觀地查看本設(shè)計(jì)的解析效果,,本文充分利用MFC面向?qū)ο缶幊谭椒ǖ膬?yōu)越性能,將解析結(jié)果以人性化的對(duì)話框形式展現(xiàn)出來,。其界面主要包括以下幾個(gè)方面:Header信息顯示,、Tag數(shù)據(jù)信息顯示及基本操作按鍵。其中,,標(biāo)簽數(shù)據(jù)信息顯示部分則包括兩部分內(nèi)容,,即當(dāng)前標(biāo)簽數(shù)據(jù)信息的顯示和下一標(biāo)簽數(shù)據(jù)基本信息的顯示。
3.2 測(cè)試結(jié)果與分析
 本文以一個(gè)SWF格式的網(wǎng)絡(luò)動(dòng)畫文件為測(cè)試對(duì)象,,用二進(jìn)制查看器UltraEdit查看該測(cè)試文件的部分?jǐn)?shù)據(jù),,如圖5所示。而用所開發(fā)的軟件解析程序?qū)υ摐y(cè)試動(dòng)畫文件進(jìn)行解析后,,其實(shí)現(xiàn)效果如圖6所示,。

 通過對(duì)圖5中數(shù)據(jù)進(jìn)行分析,可得該測(cè)試動(dòng)畫文件的信息:文件的版本為7.0,,總幀數(shù)為1 083幀,,文件總大小為611 726 B,且其播放時(shí)的幀頻為12.0幀/s,,畫面尺寸大小為602 Pixel×420.9 Pixel,。圖6顯示了該測(cè)試文件的頭數(shù)據(jù)信息及TagID為18的標(biāo)簽數(shù)據(jù)。當(dāng)點(diǎn)擊TagID后的下拉菜單時(shí),,可對(duì)隨意選取的測(cè)試文件中任意標(biāo)簽數(shù)據(jù)信息進(jìn)行顯示,。因而,,本設(shè)計(jì)軟件解析出來的數(shù)據(jù)信息與以上分析所得相一致,且數(shù)據(jù)參看操作便捷,。由此可見,,本設(shè)計(jì)已能成功對(duì)SWF動(dòng)畫文件進(jìn)行解析,且解析數(shù)據(jù)精準(zhǔn),,效果理想,。
 本文以MFC編程為手段,在簡(jiǎn)析了SWF動(dòng)畫文件結(jié)構(gòu)后,,充分利用MFC高效的編程效率及一系列優(yōu)秀性能,,在VS 2005開發(fā)平臺(tái)上重點(diǎn)實(shí)現(xiàn)了對(duì)SWF動(dòng)畫文件頭及文件標(biāo)簽的解析。在此基礎(chǔ)上,,利用MFC直觀而便捷地將解析與提取的SWF動(dòng)畫文件信息在對(duì)話框窗口上進(jìn)行了顯示,。隨著嵌入式技術(shù)的迅速發(fā)展及人們?nèi)找嬖鲩L(zhǎng)的生活?yuàn)蕵沸枨螅诒銛y的嵌入式設(shè)備上實(shí)現(xiàn)對(duì)功能強(qiáng)大的SWF動(dòng)畫文件播放功能開發(fā)變得越來越迫切,,而本文基于MFC對(duì)SWF動(dòng)畫信息進(jìn)行解析開發(fā),,為嵌入式WinCE操作系統(tǒng)上SWF播放器的設(shè)計(jì)奠定了堅(jiān)實(shí)基礎(chǔ)。
參考文獻(xiàn)
[1] Yang Jun,, Li Qing,, Liu Wenyin, et al. Searching for Flash movies on the Web: a content and context based framework[C]. Internet and Web Information Systems,, 2005:1-27.
[2] 李麗華,,毛淑華,魏樹全.基于嵌入式應(yīng)用的SWF文件文本信息的提取研究[J].長(zhǎng)沙大學(xué)學(xué)報(bào),,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] 曾益民,,葉汝強(qiáng).使用ActiveX控件實(shí)現(xiàn)對(duì)Flash電影的支持[J].計(jì)算機(jī)應(yīng)用研究,2000(8):66-76.
[5] 甄力,,郭寶增.MFC中的消息映射和命令傳遞[J].計(jì)算機(jī)與數(shù)字工程,,2005,35(7):46-48.
[6] 范躍華,,張素芹,,徐飛.基于WinCE平臺(tái)的應(yīng)用程序移植研究[J].西安工業(yè)大學(xué)學(xué)報(bào),2007,,27(1):91-94.
[7] Adobe Systems Incorporated.Macromedia Flash (SWF)File Format Specification Version[EB/OL]. http://www.macromedia. com/support/documentation/doctypes.html.2008-11.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。