FLV格式分析

Rtmp 分析參見:https://blog.csdn.net/fdsafwagdagadg6576/article/details/109462544

image

本文主要內容來自:FLV格式詳解 https://blog.csdn.net/weixin_42462202/article/details/88661883
該文一層一層介紹了FLV格式.
本文對其內容增加了思維導圖并補充了實例.

1 定義:

FLV是一種文件格式.類似的還有Mp4.

作用:

將H264,Aac裸流封裝成文件格式.

為什么要對裸流做文件格式封裝?即FLV文件和原始文件區別?
1 文件播放. 原始文件播放讀一幀解析一幀. 沒有整體時長,不能拖拽,倍速播放等音視頻控制了.
FLV文件因為有FLV tag保存音視頻信息。所以可以顯示視頻時長,播放進度,拖拽,倍速播放等.
2 是協議支持,rtmp協議要求,數據必須Flv格式. rtc協議數據才是裸流。

關鍵字:tag

****2 整體介紹:****

Flv由 “Flv header” 和 “Flv Body”組成。
Flv Body由一系列的Tag組成,每個Tag又有一個preTagSize字段,標記著前面一個Tag的大小


在這里插入圖片描述

2.1 Flv Header

Header長度一般都是固定的9個字節:

image

2.2 Flv Body

Flv Body由一個一個Tag組成,每個Tag都有一個preTagSize字段,標記著前面一個Tag的大小。

在這里插入圖片描述

Tag有三種類型,Audio Tag(音頻Tag),Video Tag(視頻Tag),script Tag(又稱Metadata Tag).
每個Tag由“Tag Header”和“Tag Data”組成.Tag=Tag Header+Tag Data.
對于不同類型的Tag,“Tag Header”的格式都是相同的,“Tag Body”的格式就不一樣了.

2.2.1 Tag header:

在這里插入圖片描述

圖片說明:3種tag的tag header格式一樣,只有Tag type 域的值不同,分別是08(音頻),09(視頻),12(script data).
Notes:注意Flv header和Flv tag header是不同的.

下面這張圖歸納一下上面講的內容,看完后對flv應該有個總體的了解了

在這里插入圖片描述

一般一個flv文件由一個頭部信息,一個script Tag,以及若干個video Tag和audio Tag組成。

在這里插入圖片描述

圖片說明:tag之間是previous tag size

2.2.2 每種類型的Tag Data詳解

Flv有三種tag:“Audio Tag Data”、“Video Tag Data”、“Script Tag Data”

1)、Audio Tag Data

在這里插入圖片描述

如果SoundFormat=10,那么音頻數據就是AAC AUDIO DATA。
notes:音頻參數只有一個字節

  • **AAC ** AUDIO DATA 格式如下:
在這里插入圖片描述

2)、Video Tag Data

在這里插入圖片描述

a) 視頻參數:
對于H.264數據來說,CodecID = 7。
當CodecID = 7時,視頻數據就是AVCVIDEOPACKET格式。

b) 視頻數據:
下面講解一下AVCVIDEOPACKET

在這里插入圖片描述
  • 如果 AVCPacketType = 0,那么Data就是AVCDecoderConfigurationRecord格式。

以下是AVCDecoderConfigurationRecord的結構

在這里插入圖片描述

notes: SPS/PPS 說明

  • 如果 AVCPacketType = 1,那么Data結構就簡單多了。
在這里插入圖片描述

notes: I,P,B幀.h264 沒有start code 0x00 00 00 01

c) 實例分析:

在這里插入圖片描述

i)Tag Header:

Type:09(Tag的類型,包括音頻(0x08)、視頻(0x09)、script data(0x12))
Datasize:00 00 2e(Tag Data 部分的大小)
Timestamp:00 00 00(時間戳)
Timestamp_ex:00(時間戳的擴展部分)
StreamID:00 00 00(總是0)

ii) Tag data:

FrameType | CodecID:17(keyframe | AVC)(視頻tag的參數)

因為CodecID=7,所以視頻數據就是AVCVIDEOPACKET格式

  • AVCVIDEOPACKET:
AVCPaketType:00(ACVPacket的類型,0: AVC sequence header;1: AVC NALU;2: AVC end of sequence)
CompositionTime:00 00 00

因為ACVPaketType==0,所以Data=AVCDecoderConfigurationRecord

  • AVCDecoderConfigurationRecord:
configurationVersion:01
AVCProfileIndication:64
profile_compatibility:00
AVCLevelIndication:1e
lengthSizeMinusOne:ff (NALUSize的長度,計算方法為:1 + (lengthSizeMinusOne & 3)=4)
numOfSequenceParameterSets:e1(低五位為SPS的個數,計算方法為:numOfSequenceParameterSets & 0x1F=1)
sequenceParameterSetLength:00 18(SPS的長度,24)
sequenceParameterSetNALUnits:67 64 00 1e ac d9 40 a0 33 b0 11 00 00 03 02 47 00 00 6d 34 0f 16 2d 96(SPS)
numOfPictureParameterSets:01(PPS的個數)
pictureParameterSetLength:00 06(PPS的長度)
pictureParameterSetNALUnits:68 eb e3 cb 22 c0(PPS)
previousTagSize:00 00 00 39

3) Script Tag Data

該類型Tag又通常被稱為MetadataTag,會放一些關于FLV視頻和音頻的元數據信息如:duration、width、height等。通常該類型Tag會跟在FileHeader后面作為第一個Tag出現,而且只有一個。
notes:用amf語法實現metadata數據key-value存儲.amf 數據的都是"類型+[長度]+值"的形式.

結構如下圖所示

在這里插入圖片描述

AMF包:第一個字節表示AMF包的類型

在這里插入圖片描述

第一個AMF包:
第一個字節一般為0x02,表示字符串,第2-3個字節表示字符串的長度,一般為0x000A,后面跟的就是字符串,一般為"onMetaData"。

第二AMF包:
第一個字節為0x08,表示數組,第2-5個字節表示數組元素個數,后面跟著就是數組的元素,格式為:元素名長度(UI16) + 元素名(UI8[n]) + 元素的值(double),最后以“009”結尾。

常見的數組元素

在這里插入圖片描述

補充: Nginx-rtmp之 AMF0 的處理 https://www.cnblogs.com/jimodetiantang/p/8975945.html
這篇blog:有具體的抓包實例分析. 對script tag data論述更詳細.
notes: amf0和amf3有什么區別?:通常都是amf0, amf3是它的特殊補充.
參見 https://blog.csdn.net/HandSome696/article/details/72518927

總結:

image

圖片說明:此圖沒有對script tag,video tag,audio tag做區分和具體介紹.

其他參考:多媒體文件格式之FLV: https://www.cnblogs.com/jimodetiantang/p/8992425.html
(有audio,video各個域的詳細說明)

本文如果對您有幫助,請隨手點個贊,謝謝

5805c0b3b799b.jpg
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375