hello大家好!我叫石頭~
今天我想跟大家掰扯掰扯FLV相關的技術,如果你們之前有看過相關的文章,應該對FLV Header
和FLV Body
有所耳聞,先給2個圖泄私,混混眼熟,第一張是對flv format格式的抽象解讀备闲,第二章是對一個具體文件的格式解析晌端。
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。
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 類型
第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 類型
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ù)進行理解
第1個字節(jié)表示AMF包類型坎弯,一般總是0x08纺涤,表示數(shù)組。
第2-5個字節(jié)為UI32類型值抠忘,表示數(shù)組元素的個數(shù)撩炊。
后面即為各數(shù)組元素的封裝,數(shù)組元素為元素名稱和值組成的對褐桌。表示方法如下:
第1-2個字節(jié)表示元素名稱的長度衰抑,假設為L。
后面跟著為長度為L的字符串荧嵌。
第L+3個字節(jié)表示元素值的類型呛踊。
后面跟著為對應值砾淌,占用字節(jié)數(shù)取決于值的類型。
例如:
等等谭网。汪厨。。
后面準備分析下mp4格式愉择,這篇文章就這樣了劫乱,…………。