FLV頭
FLV頭包含以下字段
Field Type Comment
Signature UI8 Signature byte always 'F' (0x46)
Signature UI8 Signature byte always 'L' (0x4C)
Signature UI8 Signature byte always 'V' (0x56)
Version UI8 File version (for example, 0x01 for FLV
version 1)
TypeFlagsReserved UB[5] Must be 0
TypeFlagsAudio UB[1] Audio tags are present
TypeFlagsReserved UB[1] Must be 0
TypeFlagsVideo UB[1] Video tags are present
DataOffset UI32 Offset in bytes from start of file to start of body (that is, size of header version 1 always is 9)
實(shí)例
上圖是以16進(jìn)制顯示一個(gè)flv文件:
- 464c56 表示"FLV"
- 01表示 FLV的版本號(hào)
- 05的二進(jìn)制為00000101得院,表示這個(gè)flv包含音頻包和數(shù)據(jù)包
- 00000009表示flv包體的偏移量為9個(gè)字節(jié)
FLV包體
FLV的包體是有一個(gè)一個(gè)的tag組成的:
FLV Body = tag0 size + tag1 + tag1 size + ...... + tagN + tagN size
tag的結(jié)構(gòu)為:
tag type | DataSize | Timestamp | TimestampExtended | StreamID | Data |
---|---|---|---|---|---|
8bit | 24bit | 24bit | 8 bit | 24bit |
- tag type表示這個(gè)tag的類型
- 8:audio
- 9:video
- 18: script data
其它的值保留摩梧。 - data size 表示數(shù)據(jù)包的大小
- timestamp和timestampExtended表示這個(gè)包的時(shí)間錯(cuò)
- StreamID永遠(yuǎn)為0
- Data 表示包的具體數(shù)據(jù)
實(shí)例
如上圖所示
- 12表示這個(gè)tag是 script data(flv的第一個(gè)永遠(yuǎn)是onMetaData)
- 0001 66 表示這個(gè)tag數(shù)據(jù)的大小
- 00 0000 00 表示 timestamp和timestampExtended
- 接下來的0x166(358)個(gè)字節(jié)數(shù)據(jù)為tag data數(shù)據(jù)养晋,0009是tag data的結(jié)束
Tag 類型
ScriptData Tag
如果TAG包中的TagType==18時(shí),就表示這個(gè)TAG是SCRIPT.
SCRIPTDATA 結(jié)構(gòu)十分復(fù)雜协屡,定義了很多格式類型虏劲,每個(gè)類型對(duì)應(yīng)一種結(jié)構(gòu).
onMetaData
onMetaData是一種ScriptData,包含流的許多屬性粘都,通用的屬性有:
- duration: double
- width: double
- height: double
- videodatarate:double
- framerate:double
- videocodecid:double
- audiosamplerate:double
- audiosamplesize:double
- stereo: bool
- audiocodecid:double
- datasize:double
- onMetaData:
- lasttimestamp
- totalframes
- hasAudio
- hasVideo
- hasCuePoints
- hasMetadata
- hasKeyframes
實(shí)例
如上圖所示:
- 02表示這個(gè)數(shù)據(jù)為string類型
- 00 0a表示數(shù)據(jù)的長(zhǎng)度為10(0x0a)
- 接下來的10字節(jié)表示OnMetaData,這個(gè)數(shù)據(jù)總是出現(xiàn)在OnMetaData Tag的第一個(gè)data中
在讀完OnMetaData這個(gè)數(shù)據(jù)后,接下來的數(shù)據(jù)是類型是ECMA ARRAY刷袍,如下圖
- 08表示這個(gè)數(shù)據(jù)為ECMA ARRAY
- 0000 0010 表示ECMA ARRAY內(nèi)包含的屬性為16(0x10)個(gè)
接下來的數(shù)據(jù)則是SCRIPTDATAOBJECTPROPERTY數(shù)據(jù)對(duì)象翩隧,它包含流的一些屬性,有一系列name和value組成呻纹。
第一個(gè)屬性是duration鸽心,它的長(zhǎng)度為8字節(jié)(0008),names為6475 7261 7469 6f6e(duration),00表示這個(gè)屬性為Number類型居暖,它隊(duì)形的數(shù)據(jù)值為Double:
40 62d3 7ced 9168 73(表示這個(gè)文件的時(shí)長(zhǎng))
接著一次讀剩余的屬性值,直到遇到000 0009(SCRIPTDATAOBJECTEND,SCRIPTDATAECMAARRAY的終止符則表示OnMetaData數(shù)據(jù)處理完了)藤肢。
Video Tag
OnMetaData的下一個(gè)tag為Video tag太闺,具體數(shù)據(jù)如下圖:
- 00 0009 OnMetaData的結(jié)束標(biāo)志
- 0000 0171 上一個(gè)tag的長(zhǎng)度
- 09 表示這個(gè)tag為video tag
- 00 0046 這個(gè)tag data的大小
- 0000 0000 tag的Timestamp和TimestampExtended
- 0000 00 StreamID,總是0
接下來的70個(gè)字節(jié)為video tag的數(shù)據(jù)嘁圈,1表示video的frame類型為keyframe省骂,7表示編碼ID為AVC
現(xiàn)在知道這個(gè)video tag數(shù)據(jù)是AVC格式的數(shù)據(jù)蟀淮,接著來分析一下AVCVIDEOPACKET。
下圖是一個(gè)AVC data的頭幾個(gè)字節(jié)钞澳,00表示這個(gè)data是 AVC sequence header怠惶,00 0000表示CompositionTime。AVC sequence header格式說明參考H.264-AVC-ISO_IEC_14496-15.pdf轧粟。