FLV(Flash Video)是一種用於透過網際網路傳輸影片和音訊的檔案格式。以下是對FLV檔案格式的詳細講解:
1. FLV Header
FLV檔案頭部包含檔案的基本資訊,是檔案的開頭部分,通常佔據9個位元組。其結構如下:
Signature (3 bytes): 表示檔案型別,固定為 "FLV"。
Version (1 byte): 表示FLV檔案版本,常見的是版本1。
Type Flags (1 byte): 表示檔案中是否包含音訊和影片資料。第5位表示音訊,第6位表示影片。
Data Offset (4 bytes): 表示FLV頭部的長度,通常為9,表示頭部之後的資料開始位置。
2. FLV Body
FLV Body包含實際的影片、音訊和後設資料,由多個FLV Tag組成。
FLV Tag
FLV Tag是FLV檔案中資料的基本單元,每個Tag包含一個tag header和tag body。
Tag Header
Tag Header描述了Tag的基本資訊:
Type (1 byte): 表示Tag的型別,0x08為音訊,0x09為影片,0x12為指令碼資料。
Data Size (3 bytes): 表示Tag Body的大小。
Timestamp (3 bytes) and Extended Timestamp (1 byte): 表示Tag的時間戳,用於同步音影片。
StreamID (3 bytes): 保留位,通常為0。
Tag Body
根據Tag型別的不同,Tag Body的結構也不同,主要有以下幾種型別:
Script Tag Data結構(指令碼型別)
Script Tag用於儲存後設資料,比如影片時長、寬高等。通常以AMF(Action Message Format)編碼。
Audio Tag Data結構(音訊型別)
音訊Tag包含音訊資料,其資料結構如下:
Sound Format (4 bits): 表示音訊格式,比如AAC、MP3等。
Sound Rate (2 bits): 表示音訊取樣率。
Sound Size (1 bit): 表示音訊樣本大小,0為8位,1為16位。
Sound Type (1 bit): 表示音訊聲道型別,0為單聲道,1為立體聲。
AAC Packet Type (1 byte, if AAC): 表示AAC音訊包型別,0為AAC sequence header,1為AAC raw。
AAC Audio Data
AAC音訊資料包含實際的音訊內容,編碼方式為AAC。
Video Tag Data結構(影片型別)
影片Tag包含影片資料,其資料結構如下:
Frame Type (4 bits): 表示幀型別,1為關鍵幀,2為間隔幀,3為顯示幀。
CodecID (4 bits): 表示影片編碼方式,比如AVC(H.264)。
AVC Packet Type (1 byte, if AVC): 表示AVC影片包型別,0為AVC sequence header,1為AVC NALU,2為AVC end of sequence。
Composition Time (3 bytes, if AVC): 表示幀的顯示時間,與解碼時間的差值。
AVCVIDEOPACKET
包含實際的影片資料,以NALU的形式儲存。
3. 附錄
附錄部分包含一些額外的資訊,比如檔案格式的品牌和版本資訊。
Major Brand && Minor Version
Major Brand (4 bytes): 表示檔案格式的主要品牌。
Minor Version (4 bytes): 表示檔案格式的次要版本。
FLV時間戳計算
FLV時間戳用於音影片的同步播放,通常在Tag Header中表示。時間戳的計算公式為:
其中:
Timestamp Low: 為3位元組,包含時間戳的低24位。
Extended Timestamp: 為1位元組,包含時間戳的高8位。
結論
FLV檔案格式透過其頭部、主體和Tag結構,實現了音影片資料的高效封裝和傳輸。理解FLV檔案格式的各個組成部分和資料結構,有助於在音影片處理和流媒體傳輸中更好地應用FLV格式,提升音影片的傳輸效率和播放質量。