2012年10月31日 星期三

[多媒體] FLV文件格式解析 Part 1 - 概說

Flash Video (FLV),是一種流行的網路視訊格式。隨著視訊網站的豐富,這個格式已經非常普及。另外,由於Adobe Flash Player與瀏覽器緊密的結合,使得瀏覽器能夠播放網頁上的.FLV影音,也是FLV格式流行的主因之一。FLV視頻格式是Adobe公司設計開發的,目前已經免費開放,現在的版本是v10,官方規格文件。下面我們就瞭解一下FLV檔案格式:

FLV是一種流媒體封裝格式,其資料可試為二進位位元組流。總體來說,FLV包括 file header 與 file body 兩部分,其中 file body 由一系列的 tag 及 tag size 對組成。因此一個FLV檔概念上結構長這樣:[#3]


標準的FLV文件用HEX編輯軟體來看大致上長這個樣子:
Figure 2. 標準FLV文件在HEX編輯軟體中的呈現畫面 [#2]

1. File Header
File header 用來表示FLV版本以及是否提供影像、聲音,長度固定為 9 bytes (但允許有延伸格式)。具體格式如下:(Figure 2藍色部份)
文件類型3 bytes“FLV”
版本1 byte一般為0×01
串流信息1 byte倒數第一位是1表示有視頻,倒数第三位是1表示有音頻,倒數第二、四位必須為0
header長度4 bytes整個header的長度,一般為9;大於9表示下面還有擴展訊息

2. File Body
File body可分成 tag size 與 tag。tag size 用來表示 tag 長度,長度固定為 4 bytes,其中 PreviousTagSize 0 總是 0x00 0x00 0x00 0x00。tag 可分成三個類型 meta tag、video tag、audio tag,其中個別 tag 又可細分為 tag header 以及 tag body 兩部份。tag header 放置一些描述 tag 屬性的相關資訊,tag body 則放置實際的多媒體資訊。

   2.1 Meta Tag
   又稱為腳本 tag,腳本 tag 一般只有一個,是 FLV 文件的第一個 tag,用於存放 FLV 的資訊。
   tag 資訊細分成資料名稱 + 資料類型 (+ 資料長度) + 資料的格式呈現。資料名稱為字串、資料  類型佔 1 byte,資料長度的存在相依於資料類型,後面才是資料。

   資料類型的種類有:
       0 = Number type
       1 = Boolean type
       2 = String type
       3 = Object type
       4 = MovieClip type
       5 = Null type
       6 = Undefined type
       7 = Reference type
       8 = ECMA array type
       10 = Strict array type
       11 = Date type
       12 = Long string type

  如果類型為String,後面的 2 bytes 為字串的長度 (Long String是4bytes),再後面才是字串資料;如果是Number類型,後面的 8 bytes 為 Double 類型的資料;Boolean類型,後面 1 byte 為 Bool 類型。

   知道了這些後再來看看FLV 實例中的腳本,一般開頭是0×02,表示String類型,後面的2bytes為字串長度,一般是0x000a (“onMetaData”的長度),再後面就是字串“onMetaData”。好像 FLV 格式的檔都有onMetaData標記,在運行ActionScript的時候會用到它。後面跟的是0×08,表示ECMA Array類型,這個和Map比較相似,一個鍵跟著一個值。鍵都是String類型的,所以開頭的0×02被省略了,直接跟著的是字串的長度,然後是字串,再是值的類型,也就是上面介紹的那些了。

   2.2 Audio Tag

   2.3 Video Tag




[ Reference ]
#1> Wikipedia - Flash Video
#2> 可下人間的blog - FLV文件格式解析
#3> Wuyuan's blog - FLV文件格式解析
#4> RTMP中FLV流到标准h264、aac的转换

沒有留言: