首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

用 .NET 讀取 Flash (SWF) 檔案資訊:解析寬高、版本、幀率等中繼資料

     編輯:關於.NET

問題背景

使用者上傳 Flash 檔案時,若不提供寬/高,前端顯示易變形。客戶端讀取 (JavaScript) 需載入後才能取得,且有 Flash Player 安全警告。伺服器端解析 SWF 格式是最佳方案。

嘗試過的失敗方案

  • VS 匯入 flash.ocx COM 元件,呼叫 TGetProperty() 總回傳 E_FAIL

解決方案:直接解析 SWF 檔案格式

參考 Macromedia Flash (SWF) File Format Specification Version 7,實作 FlashInfo 類別。

使用範例


FlashInfo flashInfo = new FlashInfo(@"c:\test.swf");

Console.WriteLine($"Version: {flashInfo.Version}");           // Flash 版本
Console.WriteLine($"Compressed: {flashInfo.IsCompressed}");   // 是否壓縮 (ZLib)
Console.WriteLine($"Width: {flashInfo.Width}");               // 寬度 (twips, 1/20 pt)
Console.WriteLine($"Height: {flashInfo.Height}");             // 高度
Console.WriteLine($"FrameRate: {flashInfo.FrameRate}");       // 幀率
Console.WriteLine($"FrameCount: {flashInfo.FrameCount}");     // 總幀數
Console.WriteLine($"FileLength: {flashInfo.FileLength}");     // 未壓縮檔案大小

關鍵技術細節

SWF 檔案頭結構

  • 前 3 位元組:簽名 FWS (未壓縮) 或 CWS (壓縮,ZLib)
  • 第 4 位元組:版本號
  • 第 5-8 位元組:檔案長度 (未壓縮大小,小端序)
  • 接著:矩形區域 (Rect) 編碼寬高
    • 第一個位元組:位元數 (nBits),決定後續座標各佔幾位元
    • 依序:Xmin, Xmax, Ymin, Ymax (各 nBits 位元)
    • 寬度 = (Xmax - Xmin) / 20 (twips → pixels)
    • 高度 = (Ymax - Ymin) / 20
  • 幀率 (Fixed8) 與 幀數 (UI16)

壓縮支援

下載資源

程式碼架構概要


public class FlashInfo
{
    public byte Version { get; private set; }
    public bool IsCompressed { get; private set; }
    public int Width { get; private set; }      // pixels
    public int Height { get; private set; }     // pixels
    public double FrameRate { get; private set; }
    public int FrameCount { get; private set; }
    public int FileLength { get; private set; } // uncompressed bytes

    public FlashInfo(string filePath)
    {
        using (FileStream fs = File.OpenRead(filePath))
        {
            ParseHeader(fs);
        }
    }

    private void ParseHeader(Stream stream)
    {
        // 1. 讀取簽名 (3 bytes)
        // 2. 讀取版本 (1 byte)
        // 3. 讀取檔案長度 (4 bytes, little-endian)
        // 4. 若壓縮,用 ZLib 解壓縮到 MemoryStream
        // 5. 解析 Rect (位元級讀取 nBits + 座標)
        // 6. 解析 FrameRate (Fixed8) 與 FrameCount (UI16)
    }
}

應用場景

  • 檔案上傳驗證:自動填寬高、限制尺寸/版本
  • 內容管理系統:索引 Flash 中繼資料
  • 轉碼服務:依幀率/尺寸決定轉檔參數

水平有限,歡迎指正!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved