FLV文件格式分析


FLV文件格式分析

作者:Eric.wang ( 273578147@qq.com)

 於 2012-04-04 14:43:45,轉載請注明。

 少點轉載,多點原創。

最近做RTMP Client,費力很大功夫終於把H264碼流推送到Red5服務器上,封裝包的時候用到FLV文件格式,下面是結合FLV Format Specification進行的分析。

1.        FLV文件對齊方式

FLV文件以大端對齊方式存放多字節整型。

如存放數字無符號16位的數字300(0x012C),那么在FLV文件中存放的順序是:|0x01|0x2C|。

如果是無符號32位數字300(0x0000012C),那么在FLV文件中的存放順序是:|0x00|0x00|0x00|0x01|0x2C。

2.        FLV文件格式

FLV文件格式比較簡單,分為Header和Body兩部分。

即:|FLV_Header(9)|FLV_Body(n)|,括號里是長度,以byte為單位。

以下分別介紹Header和Body的具體內容格式。

3.        FLV Header格式

FLV Body的內容長度是固定的,格式如下:

| F(8) | L(8) | V(8) | Version(8) | TypeFlagsReserved(5) | TypeFlagsAudio(1)| TypeFlagsReserved(1) | TypeFlagsVideo(1) | DataOffset(32) |.

可知FLV Header頭部的長度為9 bytes。

前三個字節為FLV,十六進制表示為 0x46 0x4C 0x56。

Version為FLV的版本號,一般為0x01。

TypeFlagsReserved為保留位,均為0

TypeFlagsAudio為FLV文件中是否包括音頻數據,1是有,0是沒有。

TypeFlagsVideo為FLV文件中是否包括視頻數據,1是有,0是沒有。

DataOffset為FLV Header的長度,為固定值0x00000009。

4.        FLV Body格式

FLV Body的內容為多個Tag和Tag的長度組成。

即:

| PreviousTagSize0(32) | Tag1(PreviousTagSize1) |PreviousTagSize1(32) | Tag2 | ……| PreviousTagSizeN-1(32) | TagN(previousTagSizeN)| previousTagSizeN(32) |

PreviousTagSize0為0x00000000。

Tag為每一個內容,目前包括音頻、視頻、腳本。

previousTagSize為前一個Tag的長度。

5.        FLV Tag格式

FLV Tag是FLV Body的內容,具體Tag同樣是由Tag Header和Tag Data組成。

即FLV Tag Format :

| TagType(8) | DataSize(24) | Timestamp(24) |TimestampExtended(8) | StreamID(24) | Data(DataSize) |

TagType為Tag的類型:

目前支持的類型:

音頻為0x08;

視頻為0x09;

腳本數據為0x12。

DataSize為Data的長度。

Timestamp為相對第一個Tag的時間戳,因此第一個Tag的時間戳為0。也可以將所有Tag的時間戳全配置為0,解碼器會自動處理。

StreamID為默認的全為0。

Data為具體的數據內容,

如果TagType=0x08,為AudioData;

如果TagType=0x09,為VideoData;

如果TagType=0x12,為ScriptDataObject,但該項因為內容不固定,所以在FLV文件中可以沒有該Tag內容。

6.        VideoData格式

VideoData的內容,同樣包括VideoData Header和VideoData Body。

即VideoData Format:

Video Header = | FrameType(4) | CodecID(4) |

VideoData = | FrameType(4) | CodecID(4) | VideoData(n) |

FrameType為數據類型,1為關鍵幀,2為非關鍵幀,3為h263的非關鍵幀,4為服務器生成關鍵幀,5為視頻信息或命令幀。

CodecID為包裝類型,1為JPEG,2為H263,3為Screen video,4為On2 VP6,5為On2 VP6,6為Screen videoversion 2,7為AVC。

VideoData為數據具體內容:

如果CodecID=2,為H263VideoPacket;

如果CodecID=3,為ScreenVideopacket;

如果CodecID=4,為VP6FLVVideoPacket;

如果CodecID=5,為VP6FLVAlphaVideoPacket;

如果CodecID=6,為ScreenV2VideoPacket;

如果CodecID=7,為AVCVideoPacket;

7.        AVCVideoPacket格式

AVCVideoPacket同樣包括Packet Header和Packet Body兩部分:

即AVCVideoPacket Format:

| AVCPacketType(8)| CompostionTime(24) | Data |

AVCPacketType為包的類型:

         如果AVCPacketType=0x00,為AVCSequence Header;

         如果AVCPacketType=0x01,為AVC NALU;

         如果AVCPacketType=0x02,為AVC end ofsequence

CompositionTime為相對時間戳:

         如果AVCPacketType=0x01, 為相對時間戳;

         其它,均為0;

Data為負載數據:

         如果AVCPacketType=0x00,為AVCDecorderConfigurationRecord;

         如果AVCPacketType=0x01,為NALUs;

         如果AVCPacketType=0x02,為空。

8.        AVCDecorderConfigurationRecord格式

AVCDecorderConfigurationRecord包括文件的信息。

具體格式如下:

| cfgVersion(8) | avcProfile(8) | profileCompatibility(8) |avcLevel(8) | reserved(6) | lengthSizeMinusOne(2) | reserved(3) | numOfSPS(5) |spsLength(16) | sps(n) | numOfPPS(8) | ppsLength(16) | pps(n) |

 

未完,待續...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM