FLV文件格式解析

FLV(Flash Video)是現在非常流行的流媒體格式,由于其視頻文件體積輕巧、封裝播放簡單等特點,使其很適合在網絡上進行應用,目前主流的視頻網站無一例外地使用了FLV格式。另外由于當前瀏覽器與Flash Player緊密的結合,使得網頁播放FLV視頻輕而易舉,也是FLV流行的原因之一。

????FLV視頻格式是Adobe公司設計開發的,目前已經免費開放,現在的版本是v10。下面我們就了解一下FLV文件格式。

????FLV是流媒體封裝格式,我們可以將其數據看為二進制字節流。總體上看,FLV包括文件頭(File Header)和文件體(File Body)兩部分,其中文件體由一系列的Tag及Tag Size對組成。因此一個FLV文件看上去是下面的結構:

FLV文件格式解析

??? 其中,Previous Tag Size緊跟在每個Tag之后,占4個字節表示一個UI32類型的數值,表示前面一個Tag的大小。需要注意的是,Previous Tag Size #0的值總是為0Tag類型包括視頻、音頻和Script,且每個Tag只能包含一種類型的數據。下面我們看看File HeaderTag的具體結構,為了方便大家理解,我貼一個實際FLV文件的字節流圖片,圖片中把不同部分區分了顏色。

FLV文件格式解析

?

一、File Header結構

??? File Header在當前版本中總是由9個字節組成,如圖中藍色區域所示。

??? 第1-3字節為文件標識(Signature),總為“FLV”(0x46 0x4C 0x56),如圖中紫色區域。

??? 第4字節為版本,目前為1(0x01)。

??? 第5個字節的前5位保留,必須為0。

??? 第5個字節的第6位表示是否存在音頻Tag。

??? 第5個字節的第7位保留,必須為0。

??? 第5個字節的第8位表示是否存在視頻Tag。

??? 第6-9個字節為UI32類型的值,表示從File Header開始到File Body開始的字節數,版本1中總為9。

?

二、Previous Tag Size結構

??? 如圖中紅色位置所示。

?

三、Tag結構

??? Tag包括Tag Header和Tag Data兩部分。不同類型的Tag的Header結構是相同的,但是Data結構各不相同。如圖中綠色和黃色區域分別表示Tag Header數據和Tag Data數據。

??? 當前版本的Tag Header結構占用11個字節。

??? 第1個字節表示Tag類型,包括音頻(0x08)、視頻(0x09)和script data(0x12),其他類型值被保留。

??? 第2-4字節為UI24類型的值,表示該Tag Data部分的大小。

??? 第5-7字節為UI24類型的值,表示該Tag的時間戳(單位為ms),第一個Tag的時間戳總是0。

??? 第8個字節為時間戳的擴展字節,當24位數值不夠時,該字節作為最高位將時間戳擴展為32位值。

??? 第9-11字節為UI24類型的值,表示stream id,總是0。

??? 后面的字節為Tag Data數據,Data的大小由第2-4字節的數值指示,根據第1個字節指示的Tag類型,按照不同的結構解析Tag Data。下面分別介紹。

?

四、Audio Tag Data結構

??? 音頻Tag開始的第1個字節包含了音頻數據的參數信息,從第2個字節開始為音頻流數據。

??? 第1個字節的前4位的數值表示了音頻數據格式,各值代表的意義大家可以查閱Adobe公司發布的FLV格式說明文檔(可以到我的磁盤空間的“資料”目錄去下載 http://e.ys168.com/?tinyfun)。

??? 第1個字節的第5-6位的數值表示采樣率,0 = 5.5 kHz,1 = 11 kHz,2 = 22 kHz,3 = 44 kHz。

??? 第1個字節的第7位表示采樣精度,0 = 8bits,1 = 16bits。

??? 第1個字節的第8位表示音頻類型,0 = mono,1 = stereo。

?

五、Video Tag Data結構

??? 視頻Tag也用開始的第1個字節包含視頻數據的參數信息,從第2個字節開始為視頻流數據。

??? 第1個字節的前4位的數值表示幀類型。

??? 第1個字節的后4位的數值表示視頻編碼ID,1 = JPEG(現已不用),2 = Sorenson H.263,3 = Screen video,4 = On2 VP6,5 = On2 VP6 with alpha channel,6 = Screen video version 2。

?

六、Script Tag Data結構

??? 該類型Tag又通常被稱為Metadata Tag,會放一些關于FLV視頻和音頻的參數信息,如duration、width、height等。通常該類型Tag會跟在File Header后面作為第一個Tag出現,而且只有一個。

??? 一般來說,該Tag Data結構包含兩個AMF包。AMF(Action Message Format)是Adobe設計的一種通用數據封裝格式,在Adobe的很多產品中應用,簡單來說,AMF將不同類型的數據用統一的格式來描述。第一個AMF包封裝字符串類型數據,用來裝入一個“onMetaData”標志,這個標志與Adobe的一些API調用有,在此不細述。第二個AMF包封裝一個數組類型,這個數組中包含了音視頻信息項的名稱和值。具體說明如下,大家可以參照圖片上的數據進行理解。

?

??? 第一個AMF包:

?????? 第1個字節表示AMF包類型,一般總是0x02,表示字符串,其他值表示意義請查閱文檔。

?????? 第2-3個字節為UI16類型值,表示字符串的長度,一般總是0x000A(“onMetaData”長度)。

?????? 后面字節為字符串數據,一般總為“onMetaData”。

?

??? 第二個AMF包:

?????? 第1個字節表示AMF包類型,一般總是0x08,表示數組。

?????? 第2-5個字節為UI32類型值,表示數組元素的個數。

?????? 后面即為各數組元素的封裝,數組元素為元素名稱和值組成的對。表示方法如下:

?????? 第1-2個字節表示元素名稱的長度,假設為L。

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

?????? 第L+3個字節表示元素值的類型。

?????? 后面跟著為對應值,占用字節數取決于值的類型。

?

??? OK,到此FLV文件結構講完了,希望我已經講清楚了:)另外我自己寫了一個小工具,用它可以查看一個FLV文件的結構,并且能夠分析各個字段對應字節的具體值,截圖如下。目前還有一些小問題需要完善,后面我會加一個使用說明。想用的朋友可以到我磁盤空間的“工具”目錄去下載。(http://e.ys168.com/?tinyfun

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455142.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455142.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455142.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華院數據宣曉華:傳統零售商轉型電商需攻克大數據三關

現在電商發展起來的節奏,使得大眾更相信馬云所言“五年內將沒有線下銷售”的可信度。面對這樣的轉變最該緊張的似乎是傳統零售商了,日前在中美創新鏈接——大數據專題研討會上,華院數據創始人、董事長宣曉華談了傳統零售商在轉型過程中遭遇的…

部署到gcp_GCP 網絡系統Andromeda --- 概述篇

這個系列總共有三篇,分別在:肖宏輝:GCP 網絡系統Andromeda --- 概述篇肖宏輝:GCP 網絡系統Andromeda --- 控制面肖宏輝:GCP 網絡系統Andromeda --- 數據面最近看了Google在2018年的一篇NSDI文章,介紹他們的…

單例設計模式-懶漢式(線程不安全)

懶漢式(線程不安全) 優缺點說明 起到了Lazy Loading的效果,但是只能在單線程下使用 如果在多線程下, 一個線程進入if(singleton null)判斷 語句塊,還未來得及往下執行,另一個線程也通過了這個判斷語句,這時便會產生多個實例. 所以在多線程的環境下,不可使用種方式 結論:在…

南海發展大數據產業 建設新型智慧城市

今天(9月5日)上午,佛山市南海區將迎來一大盛事——“南海大數據及工業互聯網創新應用工作推進會”(以下簡稱“推進會”)召開,南海將與阿里巴巴、騰訊以及三大通信運營商等互聯網、大數據巨頭簽訂21個大數據建設亮點項目。同時,為吸引更多大數據產業集聚,南海將在推進會上同步發…

AMR音頻編碼器概述及文件格式分析

全稱Adaptive Multi-Rate,自適應多速率編碼,主要用于移動設備的音頻,壓縮比比較大,但相對其他的壓縮格式質量比較差,由于多用于人聲,通話,效果還是很不錯的。 一、分類 1. AMR: 又稱為AMR-NB&am…

查詢自己OpenGL的版本信息

GLvoid PrintVersion() {const GLubyte* name glGetString(GL_VENDOR); //返回負責當前OpenGL實現廠商的名字const GLubyte* biaoshifu glGetString(GL_RENDERER); //返回一個渲染器標識符,通常是個硬件平臺const GLubyte* OpenGLVersion glGetStr…

airpod藍牙耳機音量大解決辦法_關于AirPods的常見問題匯總 全面了解蘋果AirPods無線耳機...

小編帶來關于AirPods必知的24個問題,全面了解蘋果AirPods無線耳機。蘋果決定在iPhone7中拋棄3.5毫米耳機接口,這引發了許多爭議和不解。蘋果這樣做的原因部分在于,希望人們轉而使用無線耳機。因此蘋果也推出了自主的無線耳機AirPods。對于無線…

單例設計模式-懶漢式(線程安全)

懶漢式(線程安全) 有缺點說明 解決了線程不安全問題 效率太低了,每個線程在想獲得類的實例時候,執行getInstance()方法都要進行同步.而其實這個方法只執行了一次實例化代碼就夠了,后面的想獲取該類實例,直接return就行了.方法進行同步效率太低 結論: 在實際開發中,不推薦使用…

剖析Docker Swarm和Mesos:是什么?如何結合?有什么優勢?

本文講的是剖析Docker Swarm和Mesos:是什么?如何結合?有什么優勢?,【編者的話】本文來自Mesosphere,從生產環境的需求出發,簡要介紹了Docker Swarm的誕生背景,以及其與Mesos、 Mesos…

濮陽第二屆創客機器人比賽_咸陽市舉行第二屆機器人大賽暨第一屆創客大賽

11月14日,由陜西省教育信息化管理中心指導,市教育局主辦,咸陽師范學院、市少工委協辦的咸陽市第二屆機器人大賽暨第一屆創客大賽在咸陽師范學院舉辦。各個學校的同學展示自己的發明創造。咸陽日報全媒體記者 馬沅聰 攝據悉,來自各…

MP3文件格式解析

1, MP3簡介 MP3是今天一種常見的音樂格式,但恐怕除了工作要求之外,有興趣對此進行研究的人恐怕不多。所以,當我打算做MP3解碼方面的工作時,在找資料時也頗費了一番周折,同時也覺得很有趣。所以想在這里分…

懶漢式(線程安全,同步代碼塊兒)

懶漢式(線程安全,同步代碼塊兒) 代碼演示 // 懶漢式 (線程安全_ 同步放法_) class Singleton{private static Singleton instance;private Singleton() {}// 提供一個靜態的公有方法 加入了同步處理的代碼// 解決線程安全問題// 即懶漢式// 我們在這里加一個關鍵字 synchroni…

同余定理證明

轉載于:https://www.cnblogs.com/cmyg/p/7206474.html

非常抱歉,

非常抱歉,好長一段時間沒寫了,但是我在博客園偶爾還會寫寫這個行業必須不斷地學才不會被淘汰,幸好我是主動接受知識,我喜歡這個。。。。。。。。。。轉載于:https://blog.51cto.com/52770825/1962949

乘基取整法是什么_深入理解計算機系統(六):進制間的轉換原理

目錄1、進制的介紹2、二進制轉換成其他進制3、十進制轉換成其他進制4、十六進制轉換成其他進制5、總結上一篇博客我們講解了信息的在計算機中是如何存儲以及如何表示的。但是對于各個進制的轉換只是一筆帶過了,后來作者仔細研究了進制轉換的原理,發現還是…

單例設計模式-雙重檢查

雙重檢查 雙重檢查應用實例 代碼演示: class Singleton{private static volatile Singleton singleton;private Singleton(){}// 提供一個靜態公有方法public static Singleton getInstance() {if (instance null) {synchronized (Singleton.class) {if (instance null) {…

symbian系統開發教程(一)

第一章:Symbian OS簡介作者:謝興 enigma19971hotmail.com---轉載需注明出處 下載word文檔1.1. Symbian系統簡介當前有很多手機運行Symbian OS,數量甚至超出您的想象。到目前為止已經有超過7500 萬、100 多種型號的手機運行Sym…

小談c#數據庫存取圖片的方式

第一種方式 文件夾與數據庫配合 /// <summary>/// 上傳圖片/// </summary>/// <param name"FUSShopURL">FileUpload對象</param>/// <param name"UpladURL">圖片要放到的目錄名稱</param>/// <returns>如果Fi…

c#課程設計簡單題目_《C#項目案例》課程設計題目

1《C#項目案例》課程設計題目一、課程設計的基本目標1、通過本次課程設計&#xff0c;熟練掌握開發語言C#和開發環境——.NET。開發語言的熟練需要通過編寫一定長度的代碼(1000&#xff5e;2000行代碼)才能達到&#xff0c;開發環境的熟練需要反復的程序調試訓練。2、加深對軟件…

筆記吧

map的第一個為關鍵值&#xff0c;只可讀&#xff0c;不可寫。第二個為對應值&#xff1b;vector的消除有很大的困擾&#xff0c;感覺存在很大的局限性&#xff1b;問題——不能夠復雜話&#xff0c;一個問題先從較淺的方面想起&#xff0c;其實在現有基礎和請況下&#xff0c;不…