當前位置:
首頁 > 知識 > 代碼生成x264編碼flv記錄

代碼生成x264編碼flv記錄

代碼生成x264編碼flv記錄

最近研究h264+aac 的flv直播 ,把flv格式完全的啃了下。下面簡單說下。

flv 文件開始是9個位元組的flv頭。 46 4c 56 就是 F L V 的十六進位。第4個位元組 01 表示FLV版本號

第5個位元組表示文件音視頻信息。1是只有視頻, 5 音頻和視頻混合 4 只有音頻。

再後面4個位元組 0x00 0x00 0x00 0x09,轉十進位為9,表示FLV header的長度.

代碼生成x264編碼flv記錄

然後後面4個位元組是0 0 0 0 ,prev tag size 該值永遠為0,因為文件才開始,一個tag都還沒有呢。

然後後面就是tag了,通常都是第一個tag是腳本, 一個位元組0x12 ,腳本里記錄了flv一些必要的參數。比如視頻音頻編碼,視頻寬高

聲音採樣率,聲道,文件大小,播放長度。tag結束後,會記錄4個位元組的prev tag size,標明上一個tag 的總長度

-------------------------------------------------------------------------------------------------------------------------------

聲音tag 格式

tag head 11位元組

11位元組 = TYPE 1位元組 + Size 3位元組 + timestamp 4位元組 +streamID 3位元組

TYPE 0x8表示音頻tag

Size 為後面具體數據長度

streamID 永久為0

timestamp 時間戳

head後面接tag body

代碼生成x264編碼flv記錄

代碼生成x264編碼flv記錄

1個位元組 定義了聲音 編碼 聲道 採樣率 。

如果這個聲音是0x10 AAC編碼,則後面有個1個AACPacketType 位元組的數據。

然後後面就是聲音實際數據了。

結束了就寫入4位元組的prev tag size, 一個tag就寫入完畢。(注:aac 的編碼還有個aac tag頭 標明一些額外的aac信息,aac具體百度)

-----------------------------------------------------------------------------------------------------------------------------------

視頻tag

tag head 11位元組

11位元組 = TYPE 1位元組 + Size 3位元組 + timestamp 4位元組 +streamID 3位元組

TYPE 0x9表示視頻tag

Size 為後面具體數據長度

streamID 永久為0

timestamp 時間戳

head後面接tag body

-------------------------------------------------------------

由於x264編碼,我們flv文件必須在實際視頻tag之前把pps sps相關參數標明,不然後續解碼器無法工作。

即flv頭+prevsize+ 0x12的腳本tag + 0x9視頻tag頭(11位元組)+ 0x17 0x00 0x00 0x00 0x00 0x01 sps[1] sps[2] sps[3] 0xff 0xe1 ....0x9視頻tag整體包長4位元組+ xTag+xBody+PrevTagSize+.....

最先開始的0x9視頻tag 即裝的是sps pps數據。然後後續的視頻tag才裝實際的nalu數據。

數據包格式

0x9視頻tag頭(11位元組)+ frametype&codecID 1位元組+ 0x01(avcPacketType)+ 0x00 0x00 0x00 (composition3位元組,具體值要看avcPacketType)+ 4位元組記錄後面NALU數據的長度 + 具體NALU數據+ prev tag size.

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Webservice簡單使用
一步步拆解 LeakCanary

TAG:程序員小新人學習 |