1. 程式人生 > >將h.264視訊流封裝成flv格式檔案(一.flv格式)

將h.264視訊流封裝成flv格式檔案(一.flv格式)

其實flv還是挺簡單的一個視訊格式,下面就來先談一談FLV的格式吧。

FLV是一個二進位制檔案,簡單來說,其是由一個檔案頭(FLV header)和很多tag組成(FLV body)。tag又可以分成三類:audio,video,script,分別代表音訊流,視訊流,指令碼流,而每個tag又由tag header和tag data組成。

檔案頭由9bytes組成

 

前3個bytes是檔案型別,總是“FLV”,也就是(0x46 0x4C 0x56)。第4btye是版本號,目前一般是0x01。第5byte是流的資訊,倒數第一bit是1表示有視訊(0x01),倒數第三bit是1表示有音訊(0x4),有視訊又有音訊就是0x01 | 0x04(0x05),其他都應該是

0。最後4bytes表示FLV 頭的長度,3+1+1+4 = 9

FLV header後面就是FLV body,FLV body由若干個tag 組成。每一個tag第一部分是tag header,tag header長度為11bytes,但是每個tag header前面有4bytes記錄著上一個tag的長度,此待會兒再說。tag header的第1個byte為記錄著tag的型別,音訊(0x8),視訊(0x9),指令碼(0x12);第2到4bytes是資料區的長度,也就是tag data的長度;再後面3個bytes是時間戳,單位是毫秒,型別為0x12則時間戳為0,時間戳控制著檔案播放的速度,可以根據音視訊的幀率類設定;時間戳後面一個byte是擴充套件時間戳,時間戳不夠長的時候用;最後3bytes是streamID,但是總為0,再後面就是資料區了(tag data),也即是h264的裸流,tag header 長度為1+3+3+1+3=11。

0x12前面的00 00 00 00 就是剛剛說的記錄著上一個tag的長度的4bytes,這裡因為前面沒有tag,所以為0。

tag data如果是音訊資料,第一個byte記錄audio資訊:

前4bits表示音訊格式(全部格式請看官方文件):

·0 -- 未壓縮

·1 -- ADPCM

·2 -- MP3

·4 -- Nellymoser 16-kHz mono

·5 -- Nellymoser 8-kHz mono

·10 -- AAC

下面兩個bits表示samplerate:

·0 -- 5.5KHz

·1 -- 11kHz

·2 -- 22kHz

·3 -- 44kHz

下面1bit表示取樣長度:

·0 -- snd8Bit

·1 -- snd16Bit

下面1bit表示型別:

·0 -- sndMomo

·1 -- sndStereo

之後是資料。

如果是視訊資料,第一個byte記錄video資訊:

前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,等會再說。之前說每個tag前面會有一個記錄上個tag長度的4個bytes(previous tag size),整個的flv檔案其實是:FLV header + previous tag size0 + tag1 + previous tag size1 + tag2 + previous tag size2 + ... +tagN + previous tag sizeN。第一個previous tag size因為前面沒有tag,所以為0,其他的總是記錄著前面一個tag 長度(tag data size + tag header size)。

如果tag data是指令碼資料,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個位元組表示元素值的型別。

   後面跟著為對應值,佔用位元組數取決於值的型別

到此flv格式的解析就差不多了,如有寫錯的地方請指出。