博客 / 詳情

返回

FFmpeg開發筆記(九十一)基於Kotlin的Android直播開源框架RootEncoder

​《FFmpeg開發實戰:從零基礎到短視頻上線》一書的“10.2.2  FFmpeg向網絡推流”介紹了輕量級流媒體服務器MediaMTX,通過該工具可以測試RTSP/RTMP等流媒體協議的推拉流。除了國產的推流工具librestreaming能夠向MediaMTX推送視頻流之外,還有開源的RootEncoder也支持Android手機從攝像頭實時採集視頻信號,並向後端的MediaMTX持續推送視頻數據。

一、RootEncoder簡介

RootEncoder是一個視頻流推送器,它的前身叫做rtmp-rtsp-stream-client-java,用於通過RTMP、RTSP和SRT等協議將音視頻推送到流媒體服務器,該庫的所有代碼均使用Java和Kotlin編寫。注意:在添加了SRT協議後,開源庫的名稱已從rtmp-rtsp-stream-client-java重命名為RootEncoder,以便和原來的開源庫區分開。
RootEncoder的源碼託管地址為 https://github.com/pedroSG94/RootEncoder (星星數2.8k),國內的鏡像地址為 https://gitee.com/mirrors_pedroSG94/rtmp-rtsp-stream-client-java ,最新版本是2025年10月發佈的RootEncoder 2.6.5,可見該框架的源碼更新十分及時,該版本的源碼下載鏈接為 https://github.com/pedroSG94/RootEncoder/archive/refs/tags/2.6.5.tar.gz 。
RootEncoder主要支持RTSP和RTMP兩種協議,還支持試用SRT和UDP兩種協議。對於視頻流,RootEncoder支持AV1、H264、H265等編碼標準;對於音頻流,RootEncoder支持G711、AAC、OPUS等編碼標準。Android版本的RootEncoder支持camera1和camera2的兩種API調用,且同時支持軟件編碼和硬件編碼,可謂功能強大。
RootEncoder提供了兩種APP集成方式:引用在線庫、直接導入源碼,分別説明如下:

二、引用RootEncoder在線庫

Android工程引用RootEncoder在線庫時,需要修改以下三個配置:
1、打開項目級別的build.gradle,或者settings.gradle,給repositories節點補充下面一行配置(注意有兩個repositories,兩個地方都要加),表示指定Maven倉庫:

maven { url 'https://jitpack.io' }

2、打開模塊級別的build.gradle,給dependencies節點補充下面幾行配置,表示引入2.6.5版本的RootEncoder庫:

implementation "com.github.pedroSG94.RootEncoder:library:2.6.5"
implementation "com.github.pedroSG94.RootEncoder:extra-sources:2.6.5"

3、打開App模塊的src/main/AndroidManifest.xml,給manifest節點補充下面三行權限配置,表示聲明網絡、錄音、相機等三個權限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />

三、直接導入RootEncoder源碼

由於RootEncoder基於Kotlin編碼,引入了最新的Android開發技術,因此需要使用較新的Android Studio才能成功導入運行。接下來以Android Studio Ladybug(小瓢蟲版本)為例,介紹如何通過Android Studio編譯運行RootEncoder的demo工程。

1、調整Gradle版本

打開RootEncoder/gradle/wrapper/gradle-wrapper.properties,把下面這行

distributionUrl=https://services.gradle.org/distributions/gradle-8.14.3-bin.zip

改成下面這行,也就是把Gradle8.14.3降級到8.14。

distributionUrl=https://services.gradle.org/distributions/gradle-8.14-bin.zip

2、修改AGP插件版本

使用Android Studio導入RootEncoder工程之後,Gradle會報錯“The project is using an incompatible version (AGP 8.13.0) of the Android Gradle plugin. Latest supported version is AGP 8.7.2”。這是因為RootEncoder工程用到的Gradle插件版本8.13.0太高了,需要降級降到8.7.2。於是打開RootEncoder/gradle/libs.versions.toml,把下面這行

agp = "8.13.0"

改為下面這行,也就是把agp版本號從8.13.0降到8.7.2。

agp = "8.7.2"

3、調整默認的JDK版本

在Android Studio主界面依次選擇菜單:File→Settings→Build,Execution,Deployment→Build Tools→Gradle,把Gradle JDK欄的版本調整為JDK17。
因為Android Studio Ladybug自帶的JDK版本為21,在編譯時會報錯:“Java compiler version 21 has deprecated support for compiling with source/target version 8.”。

四、運行RootEncoder的DEMO工程

完成以上幾處配置調整後,重新編譯App安裝到真機上,啓動後的初始界面如下圖所示:

點擊左上角的【Old API】按鈕,打開推流界面如下圖所示:

可見在推流之前,得先輸入流媒體服務器的推流地址。為此按照《FFmpeg開發實戰:從零基礎到短視頻上線》一書的“10.2.2  FFmpeg向網絡推流”説明,在電腦上啓動MediaMTX,並通過命令“ipconfig /all”找到電腦位於WiFi的局域網IP。
確保手機和電腦連接了同一個WiFi,再往RootEncoder的推流界面上方填寫MediaMTX的完整推流地址如“ rtmp://192.168..:1935/stream ”,接着點擊界面下方中央的直播按鈕,開始推流動作的界面如下圖所示。

再次點擊直播按鈕可停止推流,點擊左下角的錄製按鈕可錄製視頻,點擊右下角的切換按鈕可切換前後攝像頭。那麼點擊直播按鈕開始推流,RootEncoder就把攝像頭採集到的視頻數據向MediaMTX推流。
然後電腦打開VLC media player,依次選擇菜單:媒體→打開網絡串流,在彈窗的URL欄輸入對應的MediaMTX拉流地址“ rtmp://192.168..:1935/stream ”如下圖所示。

確認輸入無誤後,單擊右下角的播放按鈕,此時VLC media player就自動播放來自拉流地址的視頻畫面如下圖所示。

對比RootEncoder的推流預覽界面和VLC media player的拉流播放界面,可知手機攝像頭採集到的視頻信號正確傳送給了電腦。

更多詳細的FFmpeg開發知識參見《FFmpeg開發實戰:從零基礎到短視頻上線》一書。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.