萬盛學電腦網

 萬盛學電腦網 >> 圖文處理 >> Flash教程 >> 如何獲取Flash文件信息

如何獲取Flash文件信息

  WinCE6.0下多媒體播放、flash播放需要獲得視頻源文件的播放時長,針對嵌入浏覽器的Flash控件,如何獲得flash文件的播放時長,參考信息!

  以一個實際的SWF文件頭為例:

  46 57 53 05 B4 66 07 00 70 00 0F A0 00 00 BB 80

  00 0C 9F 03

  字節 1-3 (46 57 53): SWF文件頭標志,FWS表示未壓縮,CWS表示壓縮的SWF文件,需要從第9個字節起用ZLib解壓

  字節 4 (05): Flash文件的版本,這裡表明它是用Flash5生成的

  字節 5-8 (B4 66 07 00):一個Integer表示文件的長度,低在前,高在後,這裡是0766B4 = 485044字節,這裡應該等於未壓縮的SWF文件實際大小或壓縮過的SWF解壓後的長度+文件頭(8字節)

  字節 9 - 。。。: SWF顯示區域,(左上角坐標,右下角坐標),用下面的方法計算得到:第9字節前5位(70 shr 3 = 14),以後的字節以14位進行分割,所需位數為 14*4+5 = 61,需要 8 個字節來表示,那麼:

  70 00 0F A0 00 00 BB 80

  01110 00000000000 00001111 10100000 00000000 0000000 010111011 10000000

  01110 00000000000000 01111101000000 00000000000000 01011101110000 000

  14 0 8000 0 6000

  因為Flash的坐標是TWIP格式的,需要除以20的,所以實際為(0,400,0,300)

  接下來的兩字節 (00 0C):表示幀速率,前一字節表示小數位,後一字節表示整數位,不過一般極少有小數位的幀率,所以一般我們只計整數就可以了,這裡 C = 12,即每秒12幀再接下來的兩字節 (9F 03):表示總幀數,WORD類型,9F=927幀,與ShockwaveFlash.TotalFrames 得到的數值是一樣的。

  .................

  以上是我搜索的swf文件頭的結構資料,例子中400*300的尺寸是如何得到的我看得稀裡糊塗,哪位可以具體說明一下用VB如何實現?

  zlib中不是有個叫umcompress的導出函數,它可以從字節數組解壓到字節數組

  文件頭"FWS"和"CWS"有什麼區別?

  FWS和CWS是flash的swf影片標志。

  CWS是在Flash6及以後版本中,發布影片時選中了“壓縮影片”這一項,才有的。

  flash文件頭結構詳細介紹:

  用ultraedit打開swf文件,可以看出一個典型的flash文件的文件頭結構如下:

  46 57 53 07 FC DC 14 00 78 00 05 5F 00 00 0F A0

  00 00 0C B7 0C 43 02 00 00 00

  第1、2、3字節是flash文件的標志,46、57、53分別代表字符FWS,如果是壓縮過的Flash,則是43、57、53,即CWS,壓縮過的Flash文件從第9個字節起是用ZLib壓縮過的;

  第4字節是版本號,07即flash7;

  第5、6、7、8字節是flash文件的大小,FC DC 14 00按高低位重新排序為00 14 DC FC,轉換為十進制為1367292,單位為字節;

  從第9字節開始是flash的尺寸,即舞台的寬度和高度(用左下角和右上角的坐標來表示)。其中第9字節是一個控制碼,根據這個控制碼的不同,後面標識尺寸所占用的字節數也不同。其計算過程說來比較麻煩,但由於受flash尺寸的限制,控制碼只有固定的8種情況,所以計算方法可以簡化為:

  控制碼 尺寸數據舉例 所代表尺寸(寬*高)

  50 * * * * * * * * 18×18

  0 0 B 4 0 0 0 B 4 0

  58 # # # # * * * * 36×18

  0 0 5 A 0 0 0 0 B 4 0 0

  60 * * * * * * * * 100×48

  0 0 3 E 8 0 0 0 1 E 0 0

  68 # # # # * * * * 160×100

  0 0 1 9 0 0 0 0 0 3 E 8 0 0

  70 * * * * * * * * 400×320

  0 0 0 F A 0 0 0 0 0 C 8 0 0

  78 # # # # * * * * 550×400

  0 0 0 5 5 F 0 0 0 0 0 F A 0 0 0

  80 * * * * * * * * 1600×1200

  0 0 0 3 E 8 0 0 0 0 0 2 E E 0 0

  88 # # # # # # * * * * 2880×2880

  0 0 0 1 C 2 0 0 0 0 0 0 7 0 8 0 0 0

  說明:每個*或#(占半個字節)對應一個有效數據,前面幾個連續的*或#對應的數據記錄了高度值,後面幾個連續的*或#對應的數據記錄了寬度值。*所對應十六進制數據轉為十進制時除以10,#則除以40。上例中控制碼為78,就用8字節來存放尺寸值,最終可得到其尺寸為550×400。

  (由於表示flash尺寸的數據在swf文件中字節數並不相同,所以下面的字節數只是相對的。)

  第18、19字節為flash的祯速,此處為000C,即12祯/秒;

  第20、21字節為flash總的祯數,計算方法與flash文件大小的計算方法相同;

  第22、23、24字節為flash的背景顏色,分別是紅、綠、藍值。

  網上可以查得到的關於Flash文件頭的信息大概就這麼多,以下是我在實踐中獲取的經驗:

  如果制作flash時只使用了文字、形狀等這些基本內置元素,那麼在導出時無論是否選擇了壓縮,生成的swf文件都是未壓縮的,其文件頭符合上述結構;一旦導入了圖片、swf等外部元素,甚至只是使用了如button這樣的flash集成的組件,而且在導出時選擇了壓縮,那麼生成的swf文件才是真正壓縮的,此時文件頭的前8位還符合常規,但從第9位開始就是用ZLib壓縮過的。

  舉個例子:

  43 57 53 07 6F BE 0C 00 78 9C 9C BB 67 54 53 DB

  F7 36 BA 43 42 09 BD 04 04 0C 10 20 12 82 8A 94

  A0 09 35 F4 04 08 1D 45 44 A5 89 84 E3 51 8A 4A

  。。。。。。。。。。。。。。。。。。。。。。。。

  前8個字節可以按照常規獲得Flash文件標志CWS、Flash版本7.0、文件大小835183字節這3個信息,從第9個字節開始必須先解壓縮再按照常規來分析。ZLib解壓縮時必須傳入精確的未壓縮時的數據大小(很多情況下壓縮數據的頭4個字節就是該數值),但是在flash文件中該數值要從已得到的Flash文件大小進行計算得到。比如該例中的文件大小835183字節,這個大小是未壓縮前的Flash文件的精確尺寸,即包括完整的文件頭和數據區的大小,所以該數值減去8(Flash文件標志、版本號、文件大小所占用的字節數),就是ZLib壓縮過的數據解壓後的大小。

copyright © 萬盛學電腦網 all rights reserved