【Android RTMP】音頻數據採集編碼 ( AAC 音頻格式解析 | FLV 音頻數據標籤解析 | AAC 音頻數據標籤頭 | 音頻解碼配置信息 )





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



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 服務器中 ;


視頻推流 : 之前的一系列博客中完成手機端採集視頻數據操作 , 並將視頻數據傳遞給 JNI , 在 NDK 中使用 x264 將圖像轉爲 H.264 格式的視頻 , 最後將 H.264 格式的視頻打包到 RTMP 數據包中 , 上傳到 RTMP 服務器中 ;


音頻推流 : 開始進行音頻直播推流操作 , 先採集音頻 , 將音頻編碼爲 AAC 格式 , 將編碼後的音頻打包成 RTMP 包 , 然後推流到服務器中 ;





一、 AAC 音頻格式解析



1 . AAC 音頻文件格式 :


① ADIF 格式 : 音頻數據交換格式 ( Audio Data Interchange Format ) , 只有一份音頻解碼信息 , 存儲在文件開頭 , 這種格式適合存儲音頻文件 , 節省空間 , 但是必須從開始播放纔可以 , 從中間位置無法播放 ;

② ADTS 格式 : 音頻數據傳輸流格式 ( Audio Data Transport Stream ) , 每隔一段音頻數據 , 就會有一份音頻解碼信息 , 這種格式適合音頻流傳輸 , 可以在任何位置開始解碼播放 ;


2 . 推流數據分析 : 當前的需求是需要將 FAAC 編碼後的 AAC 數據推流到 RTMP 服務器中 , 推流時 , 需要推流的 AAC 格式不是上述兩種格式 , 而是純 AAC 裸數據 ;


3 . 音頻幀數據必須完整 : 音頻幀與視頻幀存儲機制不同 , 視頻幀分爲關鍵幀和非關鍵幀 , 音頻採樣都是關鍵幀 , 少一個採樣都會有問題產生 , 如電流 , 卡頓等問題 ;





二、 FLV 音頻數據標籤解析





1. 分析 FLV 格式中的 AAC 音頻格式數據


分析 FLV 格式中的 AAC 音頻格式數據 : 下圖中的第 22 個音頻數據標籤 , 存儲了音頻特殊配置 , 之後的 AAC 音頻數據標籤都是普通的音頻採樣數據 ;


① 視頻解碼數據配置 : 視頻的第一個視頻標籤數據是 H.264 , AVC 序列頭數據 ( H.264 : AVC Sequence Header ) , 指導後續視頻幀如何解碼 ;

② 音頻解碼數據配置 : 音頻的第一個音頻標籤數據是 AAC , 音頻特殊配置數據 ( AAC : Audio Specific config ) , 指導後續音頻採樣如何解碼 ;

在這裏插入圖片描述



2. AAC 音頻特殊配置


打開第 22 個音頻數據標籤 : 內容如下 , 這是完整的音頻標籤數據 ;

0x000001bf	:   08 00 00 07 00 00 00 00 
0x000001c7	:   00 00 00 AF 00 12 10 56 
0x000001cf	:   E5 00 00 00 00 12

在這裏插入圖片描述



3. AAC 音頻數據標籤


AAC 音頻數據標籤 : 該標籤中封裝實際的音頻採樣 , AAC 格式的 ;

0x00017494	:   08 00 00 13 00 00 85 00 
0x0001749c	:   00 00 00 AF 01 21 1A 93 
0x000174a4	:   40 7D 6B 94 64 A0 9A 03 
0x000174ac	:   EB 5C A3 25 05 C0 00 00 
0x000174b4	:   00 1E

在這裏插入圖片描述





三、 FLV 音頻數據標籤頭



音頻標籤數據標籤頭解析 : 前 11 個字節時標籤頭信息 ; 1111 個字節僅做參考 , 在 RTMP 中是不封裝這個標籤頭的 ;

0x000001bf	:   08 00 00 07 00 00 00 00 
0x000001c7	:   00 00 00

① 標籤類型 ( tag type ) : 11 字節 , 索引區間 [0][0] , 08 代表音頻 , 09 代表視頻 , 12 代表腳本信息 , 這裏是 08 , 代表音頻數據 ;

② 標籤數據大小 ( data size ) : 33 字節 , 索引區間 [1,3][1,3] , 除了包頭之外的數據大小 , 包頭一般是 1111 字節, 整個標籤大小是該 標籤數據大小 ( data size ) + 11 , 本標籤的數據大小是 77 字節, 總的數據大小是 1818 字節, 十六進制對應 0x1212

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

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

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


組裝 RTMP 包的時候 , 是不需要封裝標籤頭的 , 直接將 AAC 裸數據 , 也就是這 77 個字節封裝到 RTMP 包中 ;





四、 音頻解碼配置信息





1. AAC 音頻數據


AAC 音頻數據 : 分爲兩類 , 解碼配置數據, 音頻採樣數據 ;


① AAC 格式音頻解碼配置信息 : 下面的 77 個字節時音頻解碼配置信息 ;


0x000001bf	:   
0x000001c7	:            AF 00 12 10 56 
0x000001cf	:   E5

② AAC 音頻數據標籤數據採樣信息 :

0x0001749c	:            AF 01 21 1A 93 
0x000174a4	:   40 7D 6B 94 64 A0 9A 03 
0x000174ac	:   EB 5C A3 25 05 C0


2. 第 11 字節 AF 數據解析


11 字節 AF 數據解析 :44 位表示音頻格式 , 之後的 22 位表示採樣率 , 之後的 11 位表示採樣長度 , 最後一位表示音頻類型 ;


① 0xAF 使用二進制表示爲 0b‭1010 1111‬ ;

② 音頻格式 : 44 位 [ 7 : 4 ] : 0b1010 = 10 , 值爲 10 , 表示 AAC 格式 ;

③ 採樣率 : 22 位 [ 3 : 2 ] : 0b11 = 3 , 代表 44000 Hz 採樣率 , AAC 格式一般都是 44000 採樣率

採樣率
0 5500Hz
1 11000Hz
2 22000Hz
3 44000Hz

④ 採樣位數 : 11 位 [ 1 ] : 0b1 = 1 , 代表採樣長度 16 位 ;

採樣位數
0 8 位 / 1 字節
1 16 位 / 2字節

⑤ 音頻通道 : 11 位 [ 0 ] : 0b1 = 1 , 代表立體聲 ;

音頻通道
0 單聲道
1 立體聲

該位一般也就是聲道不同 , 其它參數基本都是默認的值 , 立體聲 AF , 單聲道 AE ;



3. 音頻數據類型


音頻數據類型 :


① 音頻解碼配置信息 : 前兩位是 AF 00 , 指導 AAC 數據如何解碼 ;

② 音頻採樣信息 : 前兩位是 AF 01 , 實際的 AAC 音頻採樣數據 ;

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