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开发实战:从零基础到短视频上线》一书。

本系列的FFmpeg进阶文章目录为《FFmpeg开发笔记全目录(FFmpeg开发实战详解,含直播系统的搭建过程)》

相关推荐
鹏多多1 小时前
flutter睡眠与冥想数据可视化神器:sleep_stage_chart插件全解析
android·前端·flutter
勇气要爆发2 小时前
【第五阶段-高级特性和架构】第三章:高级状态管理—GetX状态管理篇
android·架构
未来之窗软件服务4 小时前
服务器运维(十五)自建WEB服务C#PHP——东方仙盟炼气期
android·服务器运维·东方仙盟·东方仙盟sdk·自建web服务
Zender Han8 小时前
Flutter 新版 Google Sign-In 插件完整解析(含示例讲解)
android·flutter·ios·web
来来走走12 小时前
Android开发(Kotlin) LiveData的基本了解
android·开发语言·kotlin
柳鲲鹏12 小时前
OpenCV:文件视频防抖,python版
python·opencv·音视频
柳鲲鹏13 小时前
OpenCV:实时视频防抖,python版(改进连续帧处理)
音视频
。puppy13 小时前
MySQL 远程登录实验:通过 IP 地址跨机器连接实战指南
android·adb
dongdeaiziji13 小时前
深入理解 Kotlin 中的构造方法
android·kotlin