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) |
未完,待續...