周擎琪 發表於 2025-12-6 11:23:00

FFmpeg开发笔记(九十一)基于Kotlin的Android直播开源框架RootEncoder

<span data-cke-copybin-start="1"><span data-cke-copybin-start="1">​</span></span><span id="cke_bm_2616S">《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2.2 &nbsp;FFmpeg向网络推流”介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流。除了国产的推流工具librestreaming能够向MediaMTX推送视频流之外,还有开源的RootEncoder也支持Android手机从摄像头实时采集视频信号,并向后端的MediaMTX持续推送视频数据。</span>
<h1>一、RootEncoder简介</h1>
<p>RootEncoder是一个视频流推送器,它的前身叫做rtmp-rtsp-stream-client-java,用于通过RTMP、RTSP和SRT等协议将音视频推送到流媒体服务器,该库的所有代码均使用Java和Kotlin编写。注意:在添加了SRT协议后,开源库的名称已从rtmp-rtsp-stream-client-java重命名为RootEncoder,以便和原来的开源库区分开。<br>
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。<br>
RootEncoder主要支持RTSP和RTMP两种协议,还支持试用SRT和UDP两种协议。对于视频流,RootEncoder支持AV1、H264、H265等编码标准;对于音频流,RootEncoder支持G711、AAC、OPUS等编码标准。Android版本的RootEncoder支持camera1和camera2的两种API调用,且同时支持软件编码和硬件编码,可谓功能强大。<br>
RootEncoder提供了两种APP集成方式:引用在线库、直接导入源码,分别说明如下:</p>
<h1>二、引用RootEncoder在线库</h1>
<p>Android工程引用RootEncoder在线库时,需要修改以下三个配置:<br>
1、打开项目级别的build.gradle,或者settings.gradle,给repositories节点补充下面一行配置(注意有两个repositories,两个地方都要加),表示指定Maven仓库:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="13" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22maven%20%7B%20url%20'https%3A%2F%2Fjitpack.io'%20%7D%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">maven { url 'https://jitpack.io' }</code></pre>
</div>
<p>2、打开模块级别的build.gradle,给dependencies节点补充下面几行配置,表示引入2.6.5版本的RootEncoder库:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="12" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22implementation%20%5C%22com.github.pedroSG94.RootEncoder%3Alibrary%3A2.6.5%5C%22%5Cnimplementation%20%5C%22com.github.pedroSG94.RootEncoder%3Aextra-sources%3A2.6.5%5C%22%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">implementation "com.github.pedroSG94.RootEncoder:library:2.6.5"
implementation "com.github.pedroSG94.RootEncoder:extra-sources:2.6.5"</code></pre>
</div>
<p>3、打开App模块的src/main/AndroidManifest.xml,给manifest节点补充下面三行权限配置,表示声明网络、录音、相机等三个权限:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="11" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22%3Cuses-permission%20android%3Aname%3D%5C%22android.permission.INTERNET%5C%22%20%2F%3E%5Cn%3Cuses-permission%20android%3Aname%3D%5C%22android.permission.RECORD_AUDIO%5C%22%20%2F%3E%5Cn%3Cuses-permission%20android%3Aname%3D%5C%22android.permission.CAMERA%5C%22%20%2F%3E%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">&lt;uses-permission android:name="android.permission.INTERNET" /&gt;
&lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&gt;
&lt;uses-permission android:name="android.permission.CAMERA" /&gt;</code></pre>
</div>
<h1>三、直接导入RootEncoder源码</h1>
<p>由于RootEncoder基于Kotlin编码,引入了最新的Android开发技术,因此需要使用较新的Android Studio才能成功导入运行。接下来以Android Studio Ladybug(小瓢虫版本)为例,介绍如何通过Android Studio编译运行RootEncoder的demo工程。</p>
<h2>1、调整Gradle版本</h2>
<p>打开RootEncoder/gradle/wrapper/gradle-wrapper.properties,把下面这行</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="10" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22distributionUrl%3Dhttps%5C%5C%3A%2F%2Fservices.gradle.org%2Fdistributions%2Fgradle-8.14.3-bin.zip%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip</code></pre>
</div>
<p>改成下面这行,也就是把Gradle8.14.3降级到8.14。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="9" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22distributionUrl%3Dhttps%5C%5C%3A%2F%2Fservices.gradle.org%2Fdistributions%2Fgradle-8.14-bin.zip%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip</code></pre>
</div>
<h2>2、修改AGP插件版本</h2>
<p>使用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,把下面这行</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="8" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22agp%20%3D%20%5C%228.13.0%5C%22%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">agp = "8.13.0"</code></pre>
</div>
<p>改为下面这行,也就是把agp版本号从8.13.0降到8.7.2。</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="7" data-cke-widget-wrapper="1">
<pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22agp%20%3D%20%5C%228.7.2%5C%22%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">agp = "8.7.2"</code></pre>
</div>
<h2>3、调整默认的JDK版本</h2>
<p>在Android Studio主界面依次选择菜单:File→Settings→Build,Execution,Deployment→Build Tools→Gradle,把Gradle JDK栏的版本调整为JDK17。<br>
因为Android Studio Ladybug自带的JDK版本为21,在编译时会报错:“Java compiler version 21 has deprecated support for compiling with source/target version 8.”。</p>
<h1>四、运行RootEncoder的DEMO工程</h1>
<p>完成以上几处配置调整后,重新编译App安装到真机上,启动后的初始界面如下图所示:</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="6" data-cke-widget-wrapper="1"><span class="cke_reset cke_widget_drag_handler_container"><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"><span class="cke_widget_edit_container" title="编辑图片"><img src="https://img2024.cnblogs.com/blog/729938/202511/729938-20251123132242540-290936392.jpg"></span></span></span></span></p>
<p>点击左上角的【Old API】按钮,打开推流界面如下图所示:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="5" data-cke-widget-wrapper="1">
<p class="img-center cke_widget_element" data-cke-widget-data="%7B%22hasCaption%22%3Afalse%2C%22src%22%3A%22https%3A%2F%2Fi-blog.csdnimg.cn%2Fdirect%2Fcf5bb76b89db422f9da7697656959ed4.jpeg%22%2C%22alt%22%3A%22%22%2C%22width%22%3A%22286%22%2C%22height%22%3A%22616%22%2C%22lock%22%3Atrue%2C%22align%22%3A%22center%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="image"><span class="cke_image_resizer_wrapper"><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​<img src="https://img2024.cnblogs.com/blog/729938/202511/729938-20251123132300986-1345921338.jpg"></span></span></p>
</div>
<p>可见在推流之前,得先输入流媒体服务器的推流地址。为此按照《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2.2 &nbsp;FFmpeg向网络推流”说明,在电脑上启动MediaMTX,并通过命令“ipconfig /all”找到电脑位于WiFi的局域网IP。<br>
确保手机和电脑连接了同一个WiFi,再往RootEncoder的推流界面上方填写MediaMTX的完整推流地址如“rtmp://192.168.*.*:1935/stream”,接着点击界面下方中央的直播按钮,开始推流动作的界面如下图所示。</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="4" data-cke-widget-wrapper="1"><span class="cke_reset cke_widget_drag_handler_container"><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"><span class="cke_widget_edit_container" title="编辑图片"><img src="https://img2024.cnblogs.com/blog/729938/202511/729938-20251123132336809-1212701196.jpg"></span></span></span></span></p>
<p>再次点击直播按钮可停止推流,点击左下角的录制按钮可录制视频,点击右下角的切换按钮可切换前后摄像头。那么点击直播按钮开始推流,RootEncoder就把摄像头采集到的视频数据向MediaMTX推流。<br>
然后电脑打开VLC media player,依次选择菜单:媒体→打开网络串流,在弹窗的URL栏输入对应的MediaMTX拉流地址“rtmp://192.168.*.*:1935/stream”如下图所示。</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="3" data-cke-widget-wrapper="1"><span class="cke_reset cke_widget_drag_handler_container"><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"><span class="cke_widget_edit_container" title="编辑图片"><img src="https://img2024.cnblogs.com/blog/729938/202511/729938-20251123132415104-385084664.png"></span></span></span></span></p>
<p>确认输入无误后,单击右下角的播放按钮,此时VLC media player就自动播放来自拉流地址的视频画面如下图所示。</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-display-name="图像" data-cke-filter="off" data-cke-widget-id="2" data-cke-widget-wrapper="1"><span class="cke_reset cke_widget_drag_handler_container"><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"><span class="cke_widget_edit_container" title="编辑图片"><img src="https://img2024.cnblogs.com/blog/729938/202511/729938-20251123132435262-2026238106.png"></span></span></span></span></p>
<p>对比RootEncoder的推流预览界面和VLC media player的拉流播放界面,可知手机摄像头采集到的视频信号正确传送给了电脑。</p>
<p>更多详细的FFmpeg开发知识参见<span class="cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_selected" data-cke-display-name="a" data-cke-filter="off" data-cke-widget-id="1" data-cke-widget-wrapper="1">《FFmpeg开发实战:从零基础到短视频上线》一书。</span></p><br><br>
来源:https://www.cnblogs.com/aqi00/p/19260400
頁: [1]
查看完整版本: FFmpeg开发笔记(九十一)基于Kotlin的Android直播开源框架RootEncoder