flv文件分析

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í)例

flv header

上圖是以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í)例

flv first tag

如上圖所示

  • 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).

ScriptData Value-1
ScriptData Value-2

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í)例

OnMetaData

如上圖所示:

  • 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中
SCRIPTDATASTRING

在讀完OnMetaData這個(gè)數(shù)據(jù)后,接下來的數(shù)據(jù)是類型是ECMA ARRAY刷袍,如下圖

ECMA ARRAY
  • 08表示這個(gè)數(shù)據(jù)為ECMA ARRAY
  • 0000 0010 表示ECMA ARRAY內(nèi)包含的屬性為16(0x10)個(gè)
SCRIPTDATAECMAARRAY

接下來的數(shù)據(jù)則是SCRIPTDATAOBJECTPROPERTY數(shù)據(jù)對(duì)象翩隧,它包含流的一些屬性,有一系列name和value組成呻纹。

SCRIPTDATAOBJECTPROPERTY

第一個(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

VIDEODATA

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
Video Tag header

接下來的70個(gè)字節(jié)為video tag的數(shù)據(jù)嘁圈,1表示video的frame類型為keyframe省骂,7表示編碼ID為AVC

video tag data

現(xiàn)在知道這個(gè)video tag數(shù)據(jù)是AVC格式的數(shù)據(jù)蟀淮,接著來分析一下AVCVIDEOPACKET。

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轧粟。

avc data
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末策治,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子兰吟,更是在濱河造成了極大的恐慌通惫,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件混蔼,死亡現(xiàn)場(chǎng)離奇詭異履腋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)惭嚣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門遵湖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晚吞,你說我怎么就攤上這事延旧。” “怎么了载矿?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵垄潮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我闷盔,道長(zhǎng)弯洗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任逢勾,我火速辦了婚禮牡整,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溺拱。我一直安慰自己逃贝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布迫摔。 她就那樣靜靜地躺著沐扳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪句占。 梳的紋絲不亂的頭發(fā)上沪摄,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼杨拐。 笑死祈餐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哄陶。 我是一名探鬼主播帆阳,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼屋吨!你這毒婦竟也來了蜒谤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤离赫,失蹤者是張志新(化名)和其女友劉穎芭逝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渊胸,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旬盯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翎猛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胖翰。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖切厘,靈堂內(nèi)的尸體忽然破棺而出萨咳,到底是詐尸還是另有隱情,我是刑警寧澤疫稿,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布培他,位于F島的核電站,受9級(jí)特大地震影響遗座,放射性物質(zhì)發(fā)生泄漏舀凛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一途蒋、第九天 我趴在偏房一處隱蔽的房頂上張望猛遍。 院中可真熱鬧,春花似錦号坡、人聲如沸懊烤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腌紧。三九已至,卻和暖如春畜隶,著一層夾襖步出監(jiān)牢的瞬間寄啼,已是汗流浹背逮光。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留墩划,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓嗡综,卻偏偏與公主長(zhǎng)得像乙帮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子极景,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容