【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 )
文章目錄
- 安卓直播推流專(zhuān)欄博客總結(jié)
- 一、 x264 簡(jiǎn)介
- 二、 x264 交叉編譯
- 三、 Android Studio 導(dǎo)入函數(shù)庫(kù)
- 四、 交叉編譯版本
- 五、 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ù)器 , 并使用電腦軟件推流和觀(guān)看直播內(nèi)容 ;
-
【Android RTMP】RTMP 直播推流 ( 阿里云服務(wù)器購(gòu)買(mǎi) | 遠(yuǎn)程服務(wù)器控制 | 搭建 RTMP 服務(wù)器 | 服務(wù)器配置 | 推流軟件配置 | 直播軟件配置 | 推流直播效果展示 )
-
【Android RTMP】RTMP 直播推流階段總結(jié) ( 服務(wù)器端搭建 | Android 手機(jī)端編碼推流 | 電腦端觀(guān)看直播 | 服務(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ù)器鏡像 | 瀏覽器觀(guān)看直播 | 前置 / 后置攝像頭圖像旋轉(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ù)包 )
上一篇博客 【Android RTMP】RTMPDumb 源碼導(dǎo)入 Android Studio 工程 ( 交叉編譯 | 配置 CMakeList.txt 構(gòu)建腳本 ) 中 , 集成了 RTMPDump , 用于 RTMP 數(shù)據(jù)編解碼及傳輸 , 本篇博客中主要講解將圖像編碼為視頻的開(kāi)源庫(kù) x264 , 集成到 Android 項(xiàng)目中 ;
RTMPDump 和 x264 庫(kù)都可以集成到 FFMPEG 中 , FFMPEG 中也提供類(lèi)似功能 , 但是其執(zhí)行效率性能要低于 RTMPDump 和 x264 開(kāi)源庫(kù) ;
一、 x264 簡(jiǎn)介
x264 簡(jiǎn)介 :
① H.264 標(biāo)準(zhǔn) : H.264 是視頻編碼標(biāo)準(zhǔn) , 由 ITU 和 MPEG 制訂 ;
② x264 開(kāi)源庫(kù) : x264 是 H.264 格式的視頻編解碼庫(kù) , 由 C 語(yǔ)言實(shí)現(xiàn) ;
③ 官方頁(yè)面 : 訪(fǎng)問(wèn) x264 官網(wǎng)頁(yè)面 , 該開(kāi)源庫(kù)是由 VLC 同一個(gè)團(tuán)隊(duì)維護(hù)的 ;
④ 直接下載 : 上述官網(wǎng)頁(yè)面建議不好訪(fǎng)問(wèn) , 可以 點(diǎn)擊此處直接下載 , 也可以在博客資源中下載 ;
⑤ Android 使用方式 : x264 庫(kù)很大 , 必須交叉編譯成 ARM 架構(gòu)的函數(shù)庫(kù) ( 動(dòng)態(tài)庫(kù) / 靜態(tài)庫(kù) ) 導(dǎo)入到 Android Studio 中才能使用 ;
不像 RTMPDump 只有 555 個(gè) C 代碼 , 可以直接放在 Android Studio 工程中進(jìn)行編譯 ;
二、 x264 交叉編譯
參考博客 : 有些配置 , 參考之前寫(xiě)的 NDK 交叉編譯相關(guān)的博客 ;
【Android NDK 開(kāi)發(fā)】NDK 交叉編譯 ( Ubuntu 中交叉編譯動(dòng)態(tài)庫(kù) | Android Studio 中配置使用第三方動(dòng)態(tài)庫(kù) )
【Android NDK 開(kāi)發(fā)】Ubuntu 函數(shù)庫(kù)交叉編譯 ( Android 動(dòng)態(tài)庫(kù)交叉編譯 | Android 靜態(tài)庫(kù)交叉編譯 )
【Android FFMPEG 開(kāi)發(fā)】FFMPEG 交叉編譯配置 ( 下載 | 配置腳本 | 輸出路徑 | 函數(shù)庫(kù)配置 | 程序配置 | 組件配置 | 編碼解碼配置 | 交叉編譯配置 | 最終腳本 )
1 . 準(zhǔn)備編譯環(huán)境 : 按照 交叉編譯環(huán)境 操作 , 先把 NDK 環(huán)境搭建好 ;
2 . 拷貝源碼到 Ubuntu : 將 last_x264.tar.bz2 拷貝到 Ubuntu 中的 /root/rtmp/ 目錄下 ;
3 . 解壓源碼 :
tar xvf last_x264.tar.bz24 . 配置 Makefile 文件 ( 僅做參考 ) : 與 FFMPEG 編譯內(nèi)容類(lèi)似 , 不一一配置了 , 直接執(zhí)行 shell 腳本自動(dòng)配置 ;
--prefix : 指定代碼安裝目錄 ;
--cross-prefix : 指定交叉編譯頭 ;
--sysroot : 配置頭文件與庫(kù)文件查找目錄 ;
5 . 交叉編譯 Shell 腳本內(nèi)容 : 根據(jù)之前的 FFMPEG 編譯 Shell 腳本修改一下即可 , 只是 ./configure 生成 Makefile 的選項(xiàng)不同 , 其它都相同 ; 在 x264 源碼目錄 x264-master 下 , 創(chuàng)建 build.sh , 并拷貝上述內(nèi)容 ;
#!/bin/bash# NDK 根目錄 NDK_ROOT=/root/NDK/android-ndk-r17c# TOOLCHAIN 變量指向 gcc g++ 等交叉編譯工具所在的目錄 TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64# gcc 編譯器參數(shù) FLAGS="-isysroot $NDK_ROOT/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -isystem $NDK_ROOT/sources/android/support/include -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -O0 -fPIC"# 編譯結(jié)果輸出路徑 PREFIX=./android/armeabi-v7a./configure \ --prefix=$PREFIX \ --disable-cli \ --enable-static \ --enable-pic \ --host=arm-linux \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --sysroot=$NDK_ROOT/platforms/android-21/arch-arm \ --extra-cflags="$FLAGS"# 清除之前的編譯內(nèi)容 make clean# 開(kāi)啟新的 FFMPEG 編譯安裝過(guò)程 make install6 . 修改腳本權(quán)限 : chmod -R 777 build.sh 命令 , 修改 build.sh 腳本權(quán)限 ;
root@octopus:~/rtmp/x264-master# ls AUTHORS build.sh config.guess configure doc example.c filters Makefile tools x264.c x264dll.c x264res.rc autocomplete.c common config.sub COPYING encoder extras input output version.sh x264cli.h x264.h root@octopus:~/rtmp/x264-master# chmod -R 777 build.sh7 . 執(zhí)行編譯腳本 : 執(zhí)行 ./build.sh 編譯腳本 , 編譯后 , 生成的結(jié)果如下 ;
三、 Android Studio 導(dǎo)入函數(shù)庫(kù)
1 . 拷貝文件 : 拷貝上面編譯好的頭文件與函數(shù)庫(kù)到 Android Studio 工程中 , 沒(méi)有目錄的創(chuàng)建目錄 ;
2 . 編輯 build.gradle 構(gòu)建腳本 : 只在生成的代碼基礎(chǔ)上 , 添加了 abiFilters ‘a(chǎn)rmeabi-v7a’ 內(nèi)容 ;
apply plugin: 'com.android.application'android {compileSdkVersion 29buildToolsVersion "29.0.2"defaultConfig {applicationId "kim.hsl.rtmp"minSdkVersion 21targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"externalNativeBuild {cmake {cppFlags ""abiFilters 'armeabi-v7a'}}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}externalNativeBuild {cmake {path "src/main/cpp/CMakeLists.txt"version "3.10.2"}} }dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.1'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }3 . 編輯 CMakeList.txt 構(gòu)建腳本 : 這是 src/main/cpp 下的 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 )# 設(shè)置頭文件搜索路徑 include_directories(include)# 通過(guò)設(shè)置編譯選項(xiàng), 設(shè)置函數(shù)庫(kù)的搜索路徑 # 此處的 ANDROID_ABI 是在 # build.gradle android->defaultConfig->externalNativeBuild->cmake # 下的 abiFilters 中設(shè)置 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")target_link_libraries( # 鏈接動(dòng)態(tài)庫(kù)native-lib# 編譯的 rtmp 靜態(tài)庫(kù)rtmp${log-lib} )四、 交叉編譯版本
1 . 交叉編譯 Android 庫(kù)版本 : 在 Ubuntu 中進(jìn)行交叉編譯時(shí) , 使用的是 android-21 版本的函數(shù)庫(kù)與頭文件 ,
# 截取的兩個(gè)配置片段 FLAGS="...-D__ANDROID_API__=21..." ./configure \ ... --sysroot=$NDK_ROOT/platforms/android-21/arch-arm \ ...2 . Android APP 中的最低版本 : Android 項(xiàng)目中的 build.gradle 中配置對(duì)應(yīng)的最低兼容版本 , 也要是 21 版本 ;
apply plugin: 'com.android.application'android {compileSdkVersion 29buildToolsVersion "29.0.2"defaultConfig {applicationId "kim.hsl.rtmp"// 核心 ---------------------------------minSdkVersion 21// 核心 ---------------------------------targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"externalNativeBuild {cmake {cppFlags ""abiFilters 'armeabi-v7a'}}}... }...Ubuntu 中的交叉編譯版本 , 與 Android 應(yīng)用的最低兼容版本 , 一定要保持一致 ;
五、 GitHub 項(xiàng)目地址
GitHub 地址 : han1202012 / RTMP_Pusher
總結(jié)
以上是生活随笔為你收集整理的【Android RTMP】Android Studio 集成 x264 开源库 ( Ubuntu 交叉编译 | Android Studio 导入函数库 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Android RTMP】RTMPDu
- 下一篇: 【Android RTMP】RTMP 数