將H264和AAC封裝成FLV

FLV官方標(biāo)準(zhǔn)文檔
http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf

FLV是一個二進(jìn)制文件,F(xiàn)LV Header和FLV Body構(gòu)成。

FLV Header一般有9個字節(jié),前3個字節(jié)是”FLV”,即0x46 0x4c 0x56。

第4個字節(jié)是版本號,目前一般是0x01。

第5個字節(jié)的前五位保留為0當(dāng)有音頻時第六位置1第七位保留為0當(dāng)有視頻時第八位置1。

第6到9字節(jié)為FLV Header的長度,一般為9。

FLVBody由一連串的PreviousTagSize+Tag構(gòu)成。PreviousTagSize表示前一個Tag的長度,一共占4字節(jié)。Tag有三種類型,分別是VideoTag、AudioTag、ScriptsTag。ScriptsTag總是第一個tag,并且只有一個。每個Tag都有TagHeader和TagData。

1、TagHeader占11個字節(jié)。

image.png

2、ScriptsTagData中包含2個AMF Packet。第一個AMF Packet包含13個字節(jié)是固定的。

image.png

第二個AMF Packet包含了很多音視頻的信息,比如,視頻長度、比特率、甚至關(guān)鍵幀索引等信息。它開頭是1個字節(jié)的AMF包類型,一般是0x08,表示數(shù)組。第2-5個字節(jié)表示數(shù)組的個數(shù)。再后面就是metadata數(shù)組了。最后會有3個字節(jié)的結(jié)束符(0x0 0x0 0x9)。

3、VideoTagData包含VideoHeader和VideoData。

VideoHeader第一個字節(jié)是video info。前4bit表示視頻數(shù)據(jù)幀的類型,后4bit表示編碼器的類型。

如果是H264的視頻,則VideoHeader還要多4個字節(jié)。包含1個字節(jié)的avc_packet_type和3個字節(jié)的composition_time。

avc_packet_type:0x0表示avc sequence header,0x01表示NALU。

VideoData需要完整的一幀的數(shù)據(jù),而在RTP傳輸中,由于一幀數(shù)據(jù)太大,不利于傳輸,在傳輸時會對一幀進(jìn)行分片。所以在這里需要將接收到的FU_A的NALU轉(zhuǎn)換成原始的NALU,然后將多個NALU組成完成的一幀視頻數(shù)據(jù),存入VideoData中。至此VideoTagData就封裝完成了。

4、AudioTagData也包含AudioHeader和AudioData。

AudioHeader第一個字節(jié)是audio info。前4bit是音頻格式,第5-6bit是采樣率,第7bit是采樣精度,第8bit是聲道數(shù)。如果音頻格式是AAC的則還要多一個字節(jié)的aac_packt_type。

aac_packt_type:0x0表示AAC Sequence Header,0x01表示AAC Raw。

AAC一幀數(shù)據(jù)通常較小,在RTP傳輸中,每次都是一個包一幀數(shù)據(jù),不像H264視頻需要分開。所以取出RTP中的音頻數(shù)據(jù),加上ADTS頭就可以直接放入AudioData。至此AudioTagData就封裝完成了。

備注:
FLV存儲的都是大端數(shù)據(jù),所以需要把小端數(shù)轉(zhuǎn)成大端數(shù)再寫入文件中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容