将h.264视频流封装成flv格式文件(一.flv格式)
原帖地址:http://blog.csdn.net/yeyumin89/article/details/7932368
?
原帖雖然貴為好貼,看感覺看起來有點亂,沒有層次感,貼過來,修改下格式,閱讀起來方便。
一、綜述:
?
flv文件的格式其實網上資料還是不少,但是怎么封裝成flv卻不多??戳瞬簧儋Y料,找到了一個覺得還比較靠譜的:http://www.cnblogs.com/chef/archive/2012/07/18/2597279.html
其實flv還是挺簡單的一個視頻格式,下面就來先談一談FLV的格式吧。
?
FLV是一個二進制文件,簡單來說,其是由一個文件頭(FLV header)和很多tag組成(FLV body)。
tag可以分成三類:audio,video,script,分別代表音頻流,視頻流,腳本流。
每個tag由tag header和tag data組成。
?
二、FLV header + FLV body
1. flv header (9個字節)
?
前3個bytes是文件類型,總是“FLV”,也就是(0x46 0x4C 0x56)。
第4btye是版本號,目前一般是0x01。
第5byte是流的信息,倒數第一bit是1表示有視頻(0x01),倒數第三bit是1表示有音頻(0x4),有視頻又有音頻就是0x01 | 0x04(0x05),其他都應該是0。
最后4bytes表示FLV 頭的長度。
2.FLV body?
? ? ? ?FLV header后面就是FLV body,FLV body由若干個tag 組成。
? ? ? ?每個tag由pre?tag?size(4Byte)??+??tag?header(11Byte)?+?tag?data ?3部分組成。
2.1 pre tag size (4字節):
? ? ? 代表上一個tag的長度。
2.2 tag header(11字節):
? ? ? 第1個byte為記錄著tag的類型,音頻(0x8),視頻(0x9),腳本(0x12);
? ? ? 第2到4bytes是數據區的長度,也就是tag data的長度;
? ? ? 再后面3個bytes是時間戳,單位是毫秒,類型為0x12則時間戳為0,時間戳控制著文件播放的速度,可以根據音 ? ? ? ? 視頻的幀率類設置;
? ? ? 時間戳后面一個byte是擴展時間戳,時間戳不夠長的時候用;
? ? ? 最后3bytes是streamID,但是總為0。
? ? ? tag header 長度為1+3+3+1+3=11。
?
? ? ?例如:
? ? ?此tag為script類型的header
? ??
?
2.3 tag data
2.3.1 音頻數據類型:
第一個byte記錄audio信息:08
前4bits表示音頻格式(全部格式請看官方文檔):
·0 -- 未壓縮
·1 -- ADPCM
·2 -- MP3
·4 -- Nellymoser 16-kHz mono
·5 -- Nellymoser 8-kHz mono
·A -- AAC
下面兩個bits表示samplerate:
·0 -- 5.5KHz
·1 -- 11kHz
·2 -- 22kHz
·3 -- 44kHz
下面1bit表示采樣長度:
·0 -- snd8Bit
·1 -- snd16Bit
下面1bit表示類型:
·0 -- sndMomo
·1 -- sndStereo
之后是數據。
?
2.3.2 視頻數據類型:
第一個byte記錄video信息:09
前4bits表示類型:
·1-- keyframe
·2 -- inner frame
·3 -- disposable inner frame (h.263 only)
·4 -- generated keyframe
后4bits表示解碼器ID:
·2 -- seronson h.263
·3 -- screen video
·4 -- On2 VP6
·5 -- On2 VP6 with alpha channel
·6 -- Screen video version 2
·7 -- AVC (h.264)
之后是數據。
?
如果是AAC和AVC的音視頻,則在放入數據前有一個音頻和視頻的配置信息需要寫入前兩個tag,等會再說。
?2.3.3 腳本數據類型:
該類型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個字節表示元素值的類型。
???后面跟著為對應值,占用字節數取決于值的類型。
?
?
到此flv格式的解析就差不多了,如有寫錯的地方請指出。
?
附上一個網友寫的flv的查看工具:http://download.csdn.net/detail/yeyumin89/4534822?
總結
以上是生活随笔為你收集整理的将h.264视频流封装成flv格式文件(一.flv格式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis作为mysql的缓存服务器(读
- 下一篇: 解复用FLV文件(基于FFMPEG解析F