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