代碼生成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的長度.
然後後面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
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:程序員小新人學習 |