日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

将h.264视频流封装成flv格式文件(一.flv格式)

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将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格式)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。