【Android RTMP】RTMP 數據格式 ( FLV 視頻格式分析 | 文件頭 Header 分析 | 標籤 Tag 分析 | 視頻標籤 Tag 數據分析 )





安卓直播推流專欄博客總結



Android RTMP 直播推流技術專欄 :


0 . 資源和源碼地址 :


1. 搭建 RTMP 服務器 : 下面的博客中講解了如何在 VMWare 虛擬機中搭建 RTMP 直播推流服務器 ;

2. 準備視頻編碼的 x264 編碼器開源庫 , 和 RTMP 數據包封裝開源庫 :

3. 講解 RTMP 數據包封裝格式 :

4. 圖像數據採集 : 從 Camera 攝像頭中採集 NV21 格式的圖像數據 , 並預覽該數據 ;

5. NV21 格式的圖像數據編碼成 H.264 格式的視頻數據 :

6. 將 H.264 格式的視頻數據封裝到 RTMP 數據包中 :

7. 階段總結 : 阿里雲服務器中搭建 RTMP 服務器 , 並使用電腦軟件推流和觀看直播內容 ;

8. 處理 Camera 圖像傳感器導致的 NV21 格式圖像旋轉問題 :

9. 下面這篇博客比較重要 , 裏面有一個快速搭建 RTMP 服務器的腳本 , 強烈建議使用 ;

10. 編碼 AAC 音頻數據的開源庫 FAAC 交叉編譯與 Android Studio 環境搭建 :

11. 解析 AAC 音頻格式 :

12 . 將麥克風採集的 PCM 音頻採樣編碼成 AAC 格式音頻 , 並封裝到 RTMP 包中 , 推流到客戶端 :






Android 直播推流流程 : 手機採集視頻 / 音頻數據 , 視頻數據使用 H.264 編碼 , 音頻數據使用 AAC 編碼 , 最後將音視頻數據都打包到 RTMP 數據包中 , 使用 RTMP 協議上傳到 RTMP 服務器中 ;


本篇博客會詳細分析 , 音視頻數據是如何打包成 RTMP 數據的 , 以及 RTMP 數據格式 ;





一、 RTMP 格式解析



RTMP 視頻數據包格式與 flv 視頻格式類似 , 使用二進制分析工具分析 flv 視頻文件 , 相關工具都在博客資源中 ;



分析 flv 文件格式 :


① flv 視頻文件構成 : flv 視頻由一個文件頭 Header若干標籤 Tag 組成 ;


② 使用二進制查看器 , 打開 flv 視頻文件 , 如下圖所示 :

在這裏插入圖片描述

③ 使用 flvAnalyser 工具打開 flv 視頻文件 :

在這裏插入圖片描述





二、 文件頭 Header 分析



文件頭 Header 分析 :

① flv 視頻文件文件頭 : 46 4C 56 ( 16 進制格式 ) , 這是 FLV 字母的 ASCII 碼 ; 只要是 flv 格式的文件 , 前三個字節必定是這三個值 ;

在這裏插入圖片描述

② 文件版本 :44 個字節時 FLV 格式的版本 , 這裏是 01 ; ( 參考上圖 )





三、 標籤 Tag 分析



flv 標籤數據結構 :


① 標籤類型 ( tag type ) : 11 字節 , 索引區間 [0][0] , 0x08 代表音頻 , 0x09 代表視頻 , 0x12 代表腳本信息 ;

② 標籤數據大小 ( data size ) : 33 字節 , 索引區間 [1,3][1,3] , 除了包頭之外的數據大小 , 包頭一般是 1111 字節, 整個標籤大小是該 標籤數據大小 ( data size ) + 11 ;

③ 時間戳 ( time stamp ) : 33 字節 , 索引區間 [4,6][4,6] , 表示從開始播放到當前時刻的播放時間 , 單位毫秒 , 也就是當前標籤的時間與第一個標籤時間的差值 ;

④ 時間戳擴展位 ( time stamp ext ) : 11 字節 , 索引區間 [7][7] , 如果時間戳較大 , 33 位裝不下 , 擴展一位 ;

⑤ 流編號 ( stream id ) : 33 字節 , 索引區間 [8,10][8,10] , 一般都是 0 ;


上述 1111 字節時包頭信息 , 下面就是實際的數據信息 , 有 標籤數據大小 ( data size ) 個字節的數據 ;


⑥ 數據區 ( data ) : 標籤數據大小 字節 , 索引區間 [9,][9, 標籤數據大小] , 標籤數據大小 ( data size ) 個字節的數據 ;



視頻標籤 與 音頻標籤 : 在 flvAnalyser 中可以清晰的看到文件頭 Header 與 標籤 Tag 的結構 , 其中 紅色的框表示 視頻數據標籤 , 綠色的框表示 音頻數據標籤 ;

在這裏插入圖片描述





四、 視頻標籤 Tag 數據分析



1 . 打開視頻標籤數據 : 在 flvAnalyser 工具中 , 雙擊 1 號標籤 , 該標籤是 h264 視頻標籤 , 彈出如下對話框 , 開始分析該視頻標籤中的數據 ;

在這裏插入圖片描述



2 . 視頻標籤數據詳情 :

0x00000182	:   09 00 00 2E 00 00 00 00 
0x0000018a	:   00 00 00 17 00 00 00 00 
0x00000192	:   01 64 00 32 FF E1 00 19 
0x0000019a	:   67 64 00 32 AC D9 80 78 
0x000001a2	:   02 27 E5 84 00 00 03 00 
0x000001aa	:   04 00 00 1F 40 3C 60 C6 
0x000001b2	:   68 01 00 05 68 E9 7B 2C 
0x000001ba	:   8B 00 00 00 39


3 . flv 視頻標籤數據分析 : 以下所有的數據都是十六進制數據 , 這裏省略 0x 前綴 ;


① 標籤類型 ( tag type ) : 11 字節 , 索引區間 [0][0] , 此處是 09 表示音頻數據

在這裏插入圖片描述

② 標籤數據大小 ( data size ) : 33 字節 , 索引區間 [1,3][1,3] , 00 00 2E , 46 字節 , 視頻數據有 46 字節 , 該標籤的總數據是 46 + 11 = 57 字節 ;

在這裏插入圖片描述

③ 時間戳 ( time stamp ) : 33 字節 , 索引區間 [4,6][4,6] , 00 00 00 , 當前時間戳是 0 , 這是第 1 個標籤 , 與其本身差值自然是 0 ;

在這裏插入圖片描述

④ 時間戳擴展位 ( time stamp ext ) : 11 字節 , 索引區間 [7][7] , 00 , 該位也是 0 ;

在這裏插入圖片描述

⑤ 流編號 ( stream id ) : 33 字節 , 索引區間 [8,10][8,10] , 00 00 00 , 這個值一般都是 0 ;

在這裏插入圖片描述


上述 1111 字節時包頭信息 , 下面就是實際的數據信息 , 有 標籤數據大小 ( data size ) 個字節的數據 ;


⑥ 數據區 ( data ) : 標籤數據大小 字節 , 索引區間 [9,][9, 標籤數據大小] , 後面有 46 字節的視頻數據 ;

在這裏插入圖片描述

下面開始分析這 46 字節的視頻數據 ;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章