FLV format分析

hello大家好!我叫石頭~
今天我想跟大家掰扯掰扯FLV相關的技術,如果你們之前有看過相關的文章,應該對FLV HeaderFLV Body有所耳聞,先給2個圖泄私,混混眼熟,第一張是對flv format格式的抽象解讀备闲,第二章是對一個具體文件的格式解析晌端。

flv format

streamAnalyzer4分析工具

streamAnalyzer4分析工具鏈接
接下來的文章里面我會以真實數(shù)據(jù)控制數(shù)據(jù)來區(qū)分人為添加的數(shù)據(jù)和音視頻真正的數(shù)據(jù)。

真實數(shù)據(jù):就是用來真正記錄我們視頻顯示浅役,音頻播放的數(shù)據(jù)斩松。
描述數(shù)據(jù):就是用來告訴取數(shù)據(jù)(解析)的程序,這個文件里面的數(shù)據(jù)觉既,你該怎么去處理。

我們都知道乳幸,數(shù)據(jù)是以二進制(010111001...)的形式存在存儲介質(zhì)的瞪讼,但是這些01數(shù)據(jù)表示什么東西呢,如果我們不加一些其他的信息的話粹断,這些01數(shù)據(jù)我們就沒辦法去解析符欠,所以flv格式的文件就是一些人為規(guī)定的描述信息?實際的數(shù)據(jù)組成。
到這里我們就知道flv是某些人或者某些組織共同約定的一種存數(shù)據(jù)瓶埋,讀數(shù)據(jù)的方式
這里我想舉個例子希柿,嚴謹性不做過多討論。
flv文件 = flv header + flv body
老外也很喜歡用header + body來也形象的描述他們想表達的事物养筒,那我就用人來類比flv文件曾撤。我們?nèi)耸窃?維的空間,所以我們可以用3維(距離我多遠晕粪,在房間的哪里挤悉,),或者二維(高度巫湘,寬度装悲,膚色)的信息來刻畫一個具體的人在空間的具體位置,但是如果我們要是把一個人壓縮到一維的空間去存儲(類似與存儲視頻數(shù)據(jù),因為文件數(shù)據(jù)都是在一維空間上存儲)尚氛,等到時候還原到3維的時候我們該怎么還原呢诀诊,所以我們在一維的空間存一個人的肉的時候就要插入一些說明信息,比如:說明從哪里到哪里是表示手阅嘶,哪里到哪里是表示手指属瓣,等等,所以我們在計算機中約定的一些協(xié)議,格式奠涌,等都是為了我們能在讀真實的數(shù)據(jù)的時候能通過控制數(shù)據(jù)來還原真實數(shù)據(jù)原有的樣子宪巨。如果不加這些描述數(shù)據(jù),那么一個人從3維放到1維去存儲溜畅,到時取出來的時候就是一坨肉泥了.
順便說一句:出現(xiàn)各種協(xié)議捏卓,數(shù)據(jù)格式,等等加了描述數(shù)據(jù)的數(shù)據(jù)都是由于我們的計算機體系結構決定的慈格,目前計算機是以存儲器為中心怠晴,所以在時間維度上,必定”取數(shù)據(jù)“不知道怎么還原數(shù)據(jù)浴捆。


2.FLV Header(flv 頭信息 9Byte)

flv header就是人為加的描述數(shù)據(jù)蒜田,但是這個“頭“應該設置多大呢,我們該表示什么信息呢选泻,這些東西經(jīng)過一堆人開n個會議冲粤,巴拉巴拉...討論N久之后終于決定設置為9Byte

flv format

1-3:文件格式標識页眯,必須為 46 4C 56【Signature】
(46, 4c, 56是16進制梯捕,對應的ASCII為 46 = "F", 4c = "L", 56 = "V")
4-4:版本,必須為 01【Version】
5-5:媒體標識位(flags):上面的是0x05(0000 0101)下面的順序都是從左到右
        1-5bit窝撵,必須為 0傀顾;【TypeFlagsReserved】
        6-6bit,音頻標識碌奉;【TypeFlagsAudio】
        7-7bit短曾,必須為 0;【TypeFlagsReserved】
        8-8bit赐劣,視頻標識嫉拐;【TypeFlagsVideo】
6-9:FLV頭長度,必須為 00 00 00 09【DataOffset】

3.FLV Body

FLV Body =( previousTagsize +Tag) * N,仔細看第一張圖隆豹。
Tag = Tag Header + Tag Data

3.1 previousTagsize

大型盅摇: 4字節(jié)
表示前一個tag的大小

3.2 Tag Header

TAG類型:

  • 音頻類型(0x08)
  • 視頻類型(0x09)
  • 腳本類型(0x12)
Tips:下面的順序都是從左到右

1-1:TAG類型 下面的順序都是從左到右
        1-2bit,必須為 0璃赡;【Reserved】
        3-3bit判哥,0 = 未加密,1 = 加密碉考;【Filter】
        4-8bit塌计,8 = 音頻,9 = 視頻侯谁,12(16進制) = 腳本數(shù)據(jù)锌仅;【TagType】
2-4:數(shù)據(jù)大小章钾,從 StreamID 到 Tag 結尾,也等于 TagLen -11【DataSize】
    數(shù)據(jù)區(qū)的大小热芹,不包括包頭贱傀。包頭總大小是11個字節(jié)。
5-7:時間戳伊脓,當前幀時戳府寒,單位是毫秒。相對于FLV文件的第一個TAG時戳报腔。第一個tag的時戳總是0株搔。
    ——不是時戳增量,rtmp中是時戳增量纯蛾。
8-8:擴展時間戳纤房,如果時戳大于0xFFFFFF,將會使用這個字節(jié)翻诉。這個字節(jié)是時戳的高8位炮姨,
    上面的三個字節(jié)是低24位。單位毫秒【TimestampExtended】
9-11:流ID【StreamID】 總是0
3.3 Tag Data
3.3.1 Tag Data: video 類型
video 類型 tag

第1個字節(jié)的前4位的數(shù)值表示幀類型碰煌。
第1個字節(jié)的后4位的數(shù)值表示剑令。

1-1:視頻參數(shù)【VideoTagHeader】
        1-4bit,幀類型【FrameType】
                1 = keyframe (for AVC, a seekable frame)——h264的IDR拄查,關鍵幀,可重入幀棚蓄。
                2 = inter frame (for AVC, a non-seekable frame)——h264的普通幀
                3 = disposable inter frame (H.263 only)
                4 = generated key frame (reserved for server use only)
                5 = video info/command frame
        5-8bit堕扶,編碼類型【CodecID】
                1 = JPEG (currently unused)
                2 = Sorenson H.263
                3 = Screen video
                4 = On2 VP6
                5 = On2 VP6 with alpha channel
                6 = Screen video version 2
                7 = AVC(H.264)
[2-5]:H.264視頻類型,注梭依,只有在 CodecID=AVC 時稍算,才有此數(shù)據(jù)
        AVCPacketType
       CompositionTime (ISO 14496-12, 8.15.3)
3.3.2 Tag Data : Audio 類型
audio 類型 tag
1-1:音頻頭【AudioTagHeader】
        1-4bit,音頻格式【SoundFormat】
                0 = Linear PCM, platform endian
                1 = ADPCM
                2 = MP3
                3 = Linear PCM, little endian
                4 = Nellymoser 16 kHz mono
                5 = Nellymoser 8 kHz mono
                6 = Nellymoser
                7 = G.711 A-law logarithmic PCM , reserved
                8 = G.711 mu-law logarithmic PCM , reserved
                9 = reserved
                10 = AAC (supported in Flash Player 9,0,115,0 and higher)
                11 = Speex (supported in Flash Player 10 and higher)
                14 = MP3 8 kHz , reserved
                15 = Device-specific sound , reserved
        5-6bit役拴,采樣率【SoundRate】
                0 = 5.5kHz
                1 = 11kHz
                2 = 22kHz
                3 = 44kHz
        7-7bit糊探,位寬,0 = 8bit samples, 1= 16bit samples【SoundSize】
        8-8bit河闰,通道科平,0 = Mono, 1 = Stereo【SoundType】
[2-2]:AAC音頻類型,注姜性,只有在 SoundFormat=AAC 時瞪慧,才有此數(shù)據(jù)
        0 = AAC sequence header
        1 = AAC raw

TIPS:
注:SoundFormat
如果 SoundFormat=10 即AAC格式,官方建議使用44.1kHz采樣率和雙聲道部念,即SoundType=1弃酌,SoundRate=3氨菇;Flash Player會忽略這兩個參數(shù),并從音頻比特流中解析獲得妓湘。
如果 SoundFormat=11 即Speex格式查蓉,音頻使用壓縮的16kHz采樣率的單聲道,各參數(shù)取值為SoundRate=0榜贴,SoundSize=1豌研,SoundType=0。

3.3.3 Tag Data : Script 類型

該類型Tag又通常被稱為Metadata Tag竣灌,這個Tag存放關于FLV視頻和音頻的參數(shù)信息聂沙,如duration、width初嘹、height等及汉。通常該類型Tag會跟在File Header后面作為第一個Tag出現(xiàn),而且只有一個屯烦,并且不是必須的坷随。

一般來說,該Tag Data結構包含兩個AMF包驻龟。
AMF(Action Message Format)是Adobe設計的一種通用數(shù)據(jù)封裝格式温眉,在Adobe的很多產(chǎn)品中應用,
簡單來說翁狐,AMF將不同類型的數(shù)據(jù)用統(tǒng)一的格式來描述类溢。
第一個AMF包封裝字符串類型數(shù)據(jù),用來裝入一個“onMetaData”標志露懒,這個標志與Adobe的一些API調(diào)用有闯冷,在此不細述。
第二個AMF包封裝一個數(shù)組類型懈词,這個數(shù)組中包含了音視頻信息項的名稱和值蛇耀。
具體說明如下,大家可以參照圖片上的數(shù)據(jù)進行理解
image
   第1個字節(jié)表示AMF包類型坎弯,一般總是0x08纺涤,表示數(shù)組。

   第2-5個字節(jié)為UI32類型值抠忘,表示數(shù)組元素的個數(shù)撩炊。

   后面即為各數(shù)組元素的封裝,數(shù)組元素為元素名稱和值組成的對褐桌。表示方法如下:

   第1-2個字節(jié)表示元素名稱的長度衰抑,假設為L。

   后面跟著為長度為L的字符串荧嵌。

   第L+3個字節(jié)表示元素值的類型呛踊。

   后面跟著為對應值砾淌,占用字節(jié)數(shù)取決于值的類型。

例如:

image
image

等等谭网。汪厨。。
后面準備分析下mp4格式愉择,這篇文章就這樣了劫乱,…………。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锥涕,一起剝皮案震驚了整個濱河市衷戈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌层坠,老刑警劉巖殖妇,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異破花,居然都是意外死亡谦趣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門座每,熙熙樓的掌柜王于貴愁眉苦臉地迎上來前鹅,“玉大人,你說我怎么就攤上這事峭梳〗⒒妫” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵葱椭,是天一觀的道長除盏。 經(jīng)常有香客問我,道長挫以,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任窃祝,我火速辦了婚禮掐松,結果婚禮上,老公的妹妹穿的比我還像新娘粪小。我一直安慰自己大磺,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布探膊。 她就那樣靜靜地躺著杠愧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逞壁。 梳的紋絲不亂的頭發(fā)上流济,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天锐锣,我揣著相機與錄音,去河邊找鬼绳瘟。 笑死雕憔,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的糖声。 我是一名探鬼主播斤彼,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蘸泻!你這毒婦竟也來了琉苇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤悦施,失蹤者是張志新(化名)和其女友劉穎并扇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歼争,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡拜马,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了沐绒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俩莽。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乔遮,靈堂內(nèi)的尸體忽然破棺而出扮超,到底是詐尸還是另有隱情,我是刑警寧澤蹋肮,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布出刷,位于F島的核電站,受9級特大地震影響坯辩,放射性物質(zhì)發(fā)生泄漏馁龟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一漆魔、第九天 我趴在偏房一處隱蔽的房頂上張望坷檩。 院中可真熱鬧,春花似錦改抡、人聲如沸矢炼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽句灌。三九已至,卻和暖如春欠拾,著一層夾襖步出監(jiān)牢的瞬間胰锌,已是汗流浹背骗绕。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匕荸,地道東北人爹谭。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像榛搔,于是被迫代替她去往敵國和親诺凡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

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