萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 軟體知識 >  >> 影像處理 >> Flash 教學

SWF 檔案頭結構深度解析:獲取幀率、總幀數、尺寸、版本

前言

在無 Flash Player 情況下(如伺服器端、行動裝置、靜態分析工具)解析 SWF 檔案頭,可快速獲取版本、尺寸、幀率、總幀數、背景色等關鍵中繼資料,適用於內容審核、自動化處理、資產管理系統。

SWF 檔案頭結構(未壓縮 FWS / 壓縮 CWS)

位移長度欄位說明
03SignatureFWS (0x46 0x57 0x53) 未壓縮 / CWS (0x43 0x57 0x53) 壓縮 (Zlib, 從第 9 字節起)
31VersionFlash Player 版本號(如 0x07 = FP7)
44FileLength整個檔案長度(含檔頭),Little-Endian,單位 Byte
8NFrameSize (RECT)位元組對齊的矩形:Nbits (5 bits) + Xmin + Xmax + Ymin + Ymax,各佔 Nbits。Twips 單位 (1 px = 20 twips)
8+N/82FrameRateFixed8.8 格式:高 8 位整數部、低 8 位小數部。通常小數部為 0。
10+N/82FrameCount總幀數,UI16 Little-Endian
12+N/83BackgroundColorRGB 各 1 字節

實例解析

46 57 53 05 B4 66 07 00 70 00 0F A0 00 00 BB 80
00 0C 9F 03
  1. Signature: 46 57 53 = "FWS" (未壓縮)
  2. Version: 05 = Flash 5
  3. FileLength: B4 66 07 00 → LE 0x000766B4 = 485,044 Bytes
  4. FrameSize: 第 9 字節 70 = 0b01110000 → 前 5 bits = 14 = Nbits
    接續 8 字節 (64 bits) 依 14 bits 切分:
    Xmin=0, Ymin=0, Xmax=8000, Ymax=6000 (twips) → 400×300 px
  5. FrameRate: 00 0C → 整數部 0x0C = 12 fps
  6. FrameCount: 9F 03 → LE 0x039F = 927 幀
  7. BackgroundColor: 後續 3 字節 (未列出)

壓縮 SWF (CWS) 處理流程

  1. 讀前 8 字節確認 Signature = "CWS"、取得 FileLength (未壓縮總長)。
  2. 從第 9 字節讀取剩餘資料 → Zlib 解壓(需傳入精確解壓後長度 = FileLength - 8)。
  3. 解壓後資料前 4 字節即為 FrameSize 起始,依上述邏輯解析。

VB / C# / Python 解析關鍵點

  • 位元組序:所有多字節整數均為 **Little-Endian**。
  • 位元組對齊:RECT 以位元為單位,需逐位讀取或用位運算組合。
  • Twips 轉換:除以 20 得像素。
  • Zlib 庫:VB 可用 zlib.dll 的 uncompress,C# 用 System.IO.Compression.DeflateStream,Python 用 zlib.decompress()。

常見坑點

只用基本元件卻發現 CWS
使用了 Button 等內建組件、或匯入位圖/聲音並勾選「壓縮影片」,即觸發壓縮。
FileLength 不等於實際檔案大小
CWS 時 FileLength 為**解壓後**大小;FWS 時等於檔案大小。
FrameRate 小數部非零
極少見,但規範支援 Fixed8.8,解析時應 (byteHigh + byteLow/256)。

工具推薦

  • JPEXS Free Flash Decompiler:GUI + 命令列,完整解析檔頭與標籤樹。
  • swfdump (swftools):swfdump -h file.swf 即時輸出檔頭資訊。
  • 自製腳本:Python 20 行即可完成檔頭解析,適合批次掃描資產庫。
copyright © 萬盛學電腦網 all rights reserved