【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )
文章目錄
- 安卓直播推流專欄博客總結
- 一、 RTMP 協議
- 二、 RTMP 協議使用
- 三、 RTMPDump 源碼下載
- 四、 RTMPDump 源碼交叉編譯
- 五、 RTMPDump 源碼導入 Android Studio
- 六、 Android Studio 配置 RTMPDump 源碼 CMakeList.txt
- 七、 關閉 RTMP 加密功能
- 八、 GitHub 項目地址
安卓直播推流專欄博客總結
Android RTMP 直播推流技術專欄 :
0 . 資源和源碼地址 :
- 資源下載地址 : 資源下載地址 , 服務器搭建 , x264 , faac , RTMPDump , 源碼及交叉編譯庫 , 本專欄 Android 直播推流源碼 ;
- GitHub 源碼地址 : han1202012 / RTMP_Pusher
1. 搭建 RTMP 服務器 : 下面的博客中講解了如何在 VMWare 虛擬機中搭建 RTMP 直播推流服務器 ;
- 【Android RTMP】RTMP 直播推流服務器搭建 ( Ubuntu 18.04.4 虛擬機 )
2. 準備視頻編碼的 x264 編碼器開源庫 , 和 RTMP 數據包封裝開源庫 :
-
【Android RTMP】RTMPDumb 源碼導入 Android Studio ( 交叉編譯 | 配置 CMakeList.txt 構建腳本 )
-
【Android RTMP】Android Studio 集成 x264 開源庫 ( Ubuntu 交叉編譯 | Android Studio 導入函數庫 )
3. 講解 RTMP 數據包封裝格式 :
-
【Android RTMP】RTMP 數據格式 ( FLV 視頻格式分析 | 文件頭 Header 分析 | 標簽 Tag 分析 | 視頻標簽 Tag 數據分析 )
-
【Android RTMP】RTMP 數據格式 ( FLV 視頻格式分析 | AVC 序列頭格式解析 )
4. 圖像數據采集 : 從 Camera 攝像頭中采集 NV21 格式的圖像數據 , 并預覽該數據 ;
-
【Android RTMP】Android Camera 視頻數據采集預覽 ( 視頻采集相關概念 | 攝像頭預覽參數設置 | 攝像頭預覽數據回調接口 )
-
【Android RTMP】Android Camera 視頻數據采集預覽 ( NV21 圖像格式 | I420 圖像格式 | NV21 與 I420 格式對比 | NV21 轉 I420 算法 )
-
【Android RTMP】Android Camera 視頻數據采集預覽 ( 圖像傳感器方向設置 | Camera 使用流程 | 動態權限申請 )
5. NV21 格式的圖像數據編碼成 H.264 格式的視頻數據 :
-
【Android RTMP】x264 編碼器初始化及設置 ( 獲取 x264 編碼參數 | 編碼規格 | 碼率 | 幀率 | B幀個數 | 關鍵幀間隔 | 關鍵幀解碼數據 SPS PPS )
-
【Android RTMP】x264 圖像數據編碼 ( Camera 圖像數據采集 | NV21 圖像數據傳到 Native 處理 | JNI 傳輸字節數組 | 局部引用變量處理 | 線程互斥 )
-
【Android RTMP】x264 圖像數據編碼 ( NV21 格式中的 YUV 數據排列 | Y 灰度數據拷貝 | U 色彩值數據拷貝 | V 飽和度數據拷貝 | 圖像編碼操作 )
6. 將 H.264 格式的視頻數據封裝到 RTMP 數據包中 :
-
【Android RTMP】RTMPDump 封裝 RTMPPacket 數據包 ( 封裝 SPS / PPS 數據包 )
-
【Android RTMP】RTMPDump 封裝 RTMPPacket 數據包 ( 關鍵幀數據格式 | 非關鍵幀數據格式 | x264 編碼后的數據處理 | 封裝 H.264 視頻數據幀 )
-
【Android RTMP】RTMPDump 推流過程 ( 獨立線程推流 | 創建推流器 | 初始化操作 | 設置推流地址 | 啟用寫出 | 連接 RTMP 服務器 | 發送 RTMP 數據包 )
7. 階段總結 : 阿里云服務器中搭建 RTMP 服務器 , 并使用電腦軟件推流和觀看直播內容 ;
-
【Android RTMP】RTMP 直播推流 ( 阿里云服務器購買 | 遠程服務器控制 | 搭建 RTMP 服務器 | 服務器配置 | 推流軟件配置 | 直播軟件配置 | 推流直播效果展示 )
-
【Android RTMP】RTMP 直播推流階段總結 ( 服務器端搭建 | Android 手機端編碼推流 | 電腦端觀看直播 | 服務器狀態查看 )
8. 處理 Camera 圖像傳感器導致的 NV21 格式圖像旋轉問題 :
-
【Android RTMP】NV21 圖像旋轉處理 ( 問題描述 | 圖像順時針旋轉 90 度方案 | YUV 圖像旋轉細節 | 手機屏幕旋轉方向 )
-
【Android RTMP】NV21 圖像旋轉處理 ( 圖像旋轉算法 | 后置攝像頭順時針旋轉 90 度 | 前置攝像頭順時針旋轉 90 度 )
9. 下面這篇博客比較重要 , 里面有一個快速搭建 RTMP 服務器的腳本 , 強烈建議使用 ;
- 【Android RTMP】NV21 圖像旋轉處理 ( 快速搭建 RTMP 服務器 Shell 腳本 | 創建 RTMP 服務器鏡像 | 瀏覽器觀看直播 | 前置 / 后置攝像頭圖像旋轉效果展示 )
10. 編碼 AAC 音頻數據的開源庫 FAAC 交叉編譯與 Android Studio 環境搭建 :
-
【Android RTMP】音頻數據采集編碼 ( 音頻數據采集編碼 | AAC 高級音頻編碼 | FAAC 編碼器 | Ubuntu 交叉編譯 FAAC 編碼器 )
-
【Android RTMP】音頻數據采集編碼 ( FAAC 頭文件與靜態庫拷貝到 AS | CMakeList.txt 配置 FAAC | AudioRecord 音頻采樣 PCM 格式 )
11. 解析 AAC 音頻格式 :
- 【Android RTMP】音頻數據采集編碼 ( AAC 音頻格式解析 | FLV 音頻數據標簽解析 | AAC 音頻數據標簽頭 | 音頻解碼配置信息 )
12 . 將麥克風采集的 PCM 音頻采樣編碼成 AAC 格式音頻 , 并封裝到 RTMP 包中 , 推流到客戶端 :
-
【Android RTMP】音頻數據采集編碼 ( FAAC 音頻編碼參數設置 | FAAC 編碼器創建 | 獲取編碼器參數 | 設置 AAC 編碼規格 | 設置編碼器輸入輸出參數 )
-
【Android RTMP】音頻數據采集編碼 ( FAAC 編碼器編碼 AAC 音頻解碼信息 | 封裝 RTMP 音頻數據頭 | 設置 AAC 音頻數據類型 | 封裝 RTMP 數據包 )
-
【Android RTMP】音頻數據采集編碼 ( FAAC 編碼器編碼 AAC 音頻采樣數據 | 封裝 RTMP 音頻數據頭 | 設置 AAC 音頻數據類型 | 封裝 RTMP 數據包 )
一、 RTMP 協議
RTMP 協議 : RTMP 協議是基于 TCP 協議的實時消息傳輸協議 ( Real Time Messaging Protocol ) ;
① 協議層級 :
- 應用層協議 : RTMP 協議與 HTTP 協議都是 TCP/IP 四層網絡協議中的應用層協議 ;
- 傳輸層協議 : TCP 和 UDP 是傳輸層協議 ;
② 協議傳輸數據類型 : 該協議可以傳輸音頻 , 視頻 , 數據 , 是開放性的協議 ;
③ 協議端口 : RTMP 協議默認端口 1935 , HTTP 協議默認端口 80 ;
④ 協議應用場景 : 國內的斗魚 , 虎牙 , 等直播平臺都使用該協議 ;
⑤ 協議開發者 : RTMP 是 Adobe 公司開發的 , 感謝 Adobe 公司對公益事業的支持 ;
二、 RTMP 協議使用
RTMP 協議使用 :
① RTMP 協議報文 : 該協議有規定的報文格式 , 傳輸時先按照格式打包 , 使用時先解包 , 再使用 ;
② 自己開發 RTMP 協議 ( 不推薦 ) : 可以自己根據報文格式 , 自己封裝 RTMP 包數據 , 然后使用 TCP 協議進行傳輸 ;
③ 使用 RTMPDump 庫 : 該庫是使用 C 語言開發的處理 RTMP 數據的開源工具包 ;
三、 RTMPDump 源碼下載
RTMPDump 下載 :
① 下載地址 : RTMPDump 可以在 RTMPDump 主頁 查看該項目的情況 , 也可以在 RTMP下載界面 進行下載 ; 我整理了所有 RTMP 相關的資源 , 也可以在 CSDN 下載中下載 ;
② 源碼下載地址 : 這里推薦下載最后一個 rtmpdump-2.3.tgz ;
③ 使用方法 : 目前的開發方法是將上述源碼放在 AndroidStudio 的 cpp 目錄下 , 然后進行交叉編譯 , 在 NDK 中調用先關函數 ;
④ 關于 Android 庫的說明 : 其中有 rtmpdump-2.3-android.zip 中只有相關的庫 , 沒有源碼 , 不推薦使用 ;
四、 RTMPDump 源碼交叉編譯
1 . RTMPDump 交叉編譯函數庫 : 使用 make CROSS_COMPILE=arm-none-linux- INC=-I/my/cross/includes 命令 , 可以交叉編譯出 ARM 架構的函數庫 ( a 靜態庫 / so 動態庫 )
INC 參數 : 指的是傳遞給 gcc 編譯器的參數 ,
# 這是 You can cross-compile for other platforms using the CROSS_COMPILE variable:$ make CROSS_COMPILE=arm-none-linux- INC=-I/my/cross/includes五、 RTMPDump 源碼導入 Android Studio
1 . 將源碼導入 Android Studio 項目 : 這里不使用導入上上述函數庫的方式 , 而是直接將源碼導入 AS 項目中 ;
① 拷貝源碼 : RTMPDump 的源碼在 rtmpdump-2.3/librtmp 目錄中 , 將 rtmpdump-2.3/librtmp 目錄中的文件拷貝到 Android Studio 中即可;
② Android Studio 中直接添加源碼注意點 : 這里注意 , 不是所有的開源庫源碼都可以導入到 Android Studio 項目中的 , 開源庫源碼不能太大 , 如 FFMPEG , 在 Ubuntu 上編譯一次很長時間 , 如果將 FFMPEG 源碼放在 AS 工程中 , 估計編譯一次半小時起步了 , 因此之前的博客中 , 將 FFMPEG 交叉編譯成 靜態庫 , 然后導入到 AS 項目中 ;
③ 文件展示 : 下面截圖中是該目錄的文件 , 直接將 rtmpdump-2.3/librtmp 整個目錄拷貝到 Android Studio 項目中 ;
2 . 拷貝后的 Android Studio 工程 : rtmpdump-2.3/librtmp 拷貝到 src/main/cpp 目錄下 ;
六、 Android Studio 配置 RTMPDump 源碼 CMakeList.txt
1 . 配置 RTMPDump 源碼獨立構建腳本 : 導入的 RTMPDump 是一個完整的項目 , 因此這里為 src/main/cpp/librtmp/ 下的 RTMPDump 源碼單獨配置一個 CMakeList.txt 構建腳本 ;
cmake_minimum_required(VERSION 3.4.1)set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO")add_library( # 編譯的庫的名稱是 rtmprtmp# 編譯的 rtmp 庫是靜態庫STATIC# rtmp 庫的源文件amf.chashswf.clog.cparseurl.crtmp.c )2 . 配置 整體的 CMakeList.txt 構建腳本 :
cmake_minimum_required(VERSION 3.4.1)# 鏈接 src/main/cpp/librtmp 目錄下的構建腳本 add_subdirectory(librtmp)add_library( # 函數庫名稱native-lib# 動態庫類型SHARED# 源文件native-lib.cpp )find_library( # 日志庫log-liblog )target_link_libraries( # 鏈接動態庫native-lib# 編譯的 rtmp 靜態庫rtmp${log-lib} )七、 關閉 RTMP 加密功能
1 . 編譯時遇到 fatal error: ‘openssl/ssl.h’ file not found 處理方案 : 點擊查看源碼 , 發現沒有導入 openssl 庫 , 宏定義最終進入該分支 , 需要使用 openssl 庫 , 現在定義宏定義 , 使當前的宏定義不進入該分支 ;
2 . 關閉 RTMP 加密方法 : 在 rtmp.h 文件中有以下宏定義 , 如果沒有定義 NO_CRYPTO 和 CRYPTO 宏 , 就會定義 CRYPTO 宏 , 這里我們定義 NO_CRYPTO 宏 , 即設置不加密 , 就可以屏蔽 openssl 頭文件加載了 ;
#if !defined(NO_CRYPTO) && !defined(CRYPTO) #define CRYPTO #endif3 . 屏蔽整個 CRYPTO 宏定義分支 : 即不定義 CRYPTO 宏 , 不進入整個分支 , 在 CMakeList.txt 中定義
# 取消宏定義 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNO_CRYPTO")4 . 編譯選項設置 : 只要源文件中存在 cpp 文件 , 就必須使用 CMAKE_CXX_FLAGS , 如果源文件都是 c 文件 , 可以使用 CMAKE_C_FLAGS , 這里 RTMPDump 的源文件都是 C 文件 , 使用 CMAKE_C_FLAGS ;
八、 GitHub 項目地址
GitHub 地址 : han1202012 / RTMP_Pusher
總結
以上是生活随笔為你收集整理的【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android RTMP】RTMP 直
- 下一篇: 【Android RTMP】Androi