阎璐尧 發表於 2025-12-14 11:51:00

FFmpeg开发笔记(九十四)基于Kotlin的国产开源推拉流框架anyRTC

<span data-cke-copybin-start="1"><span data-cke-copybin-start="1">​</span></span>anyRTC是一款基于Android的实时滤镜RTMP推流库,它使用MediaCodec的API进行视频和音频编码,并使用librtmp库执行rtmp流式传输。此外,anyRTC还提供了在摄像头捕捉阶段之后和编码阶段之前实时视频滤镜的功能。
<p><span id="cke_bm_1756S"> <span id="cke_bm_1756S">《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2.2 &nbsp;FFmpeg向网络推流”介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流。可是在此之前,得先有一个推流工具向MediaMTX推送视频流,这样末端的拉流程序才能从MediaMTX源源不断地拉取视频流。那么Android手机可使用anyRTC从摄像头实时采集视频信号,并向后端的MediaMTX持续推送视频数据。</span></span></p>
<p><span id="cke_bm_1756S">anyRTC的官网为https://www.anyrtc.io/,源码托管地址为https://github.com/anyrtcIO-Community/anyRTC-RTMP-OpenSource(星星数4.9k),国内的镜像地址为https://gitcode.com/gh_mirrors/any/anyRTC-RTMP-OpenSource,该框架的最后更新时间为2023年12月,可见它的更新十分及时。<br>
anyLive是anyRTC开源的推拉流项目,它采用跨平台架构设计(采用WebRTC(93)版本为基础框架),一套代码支持Android、iOS、Windows、Mac、Ubuntu等平台。anyRTC支持的流媒体协议包括rtmp、http/https、rtsp、hls、m3u8、mkv、mp3、mp4等,引用的第三方库包括libfaac 1.28、libfaad2 2.7、ffmpeg 4.3、libsrtp、libvpx等等。<br>
其中Android版本的anyRTC位于源码包的Prj-Android目录,Prj-Android工程基于Kotlin+Compose编码,最低支持到Android4.4,并采用Android 12.0编译,具有很高的学习和研究价值。并且通过小海豚版本的Android Studio Dolphin即可打开Prj-Android工程,可谓十分方便。<br>
这里以Android Studio Dolphin(小海豚版本)为例,介绍如何在App工程中导入并编译anyRTC,详细的操作步骤如下。</span></p>
<h1>一、修改案例工程的Gradle版本</h1>
<p>打开Prj-Android/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="11" 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-7.0.2-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-7.0.2-bin.zip</code></pre>
</div>
<p>改成下面这行,也就是把Gradle7.0.2升级级到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="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-7.2-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-7.2-bin.zip</code></pre>
</div>
<h1>二、修改模块级别的build.gradle</h1>
<p>打开Prj-Android/liveplayer/build.gradle,注释掉下面的ndkVersion这行:</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%22ndkVersion%20'20.0.5594570'%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">ndkVersion '20.0.5594570'</code></pre>
</div>
<p>因为实测发现编译Prj-Android项目采用android-ndk-r18b版本即可。</p>
<h1>三、导入编译好的so文件</h1>
<p>到这里下载压缩包https://storage.agrtc.cn:1000/share/0v2et4RX,解压后将lib文件夹放到Prj-Android/liveplayer/src/main/cpp目录下,再使用小海豚版本的Android Studio Dolphin打开Prj-Android项目。</p>
<h1>四、修改默认的拉流地址</h1>
<p>打开Prj-Android项目的app\src\main\java\io\anyrtc\liveplayer\PullActivity.kt,把下面这行代码</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%22go(PullActivity%3A%3Aclass.java%2C%20Pair(%5C%22url%5C%22%2CVIDEO_1))%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">go(PullActivity::class.java, Pair("url",VIDEO_1))</code></pre>
</div>
<p>改成下面这行,也就是把拉流地址改为用户输入的直播链接:</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%22go(PullActivity%3A%3Aclass.java%2C%20Pair(%5C%22url%5C%22%2Cbinding.etUrl.text.toString()))%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">go(PullActivity::class.java, Pair("url",binding.etUrl.text.toString()))</code></pre>
</div>
<p>以上几个步骤的修改之后,编译运行anyRTC的App工程,在真机上看到的anyRTC初始界面如下图所示。</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-20251123150026215-888611967.jpg"></span></span></span></span></p>
<p>可见anyRTC既支持向服务器推流,也支持从服务器拉流。那么准备两部安卓手机,一部用于推流,另一部用于拉流。用于推流的手机点击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="5" 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-20251123150045556-897574013.jpg"></span></span></span></span></p>
<p>在推流之前,得先输入流媒体服务器的推流地址。为此按照《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2.2 &nbsp;FFmpeg向网络推流”说明,在电脑上启动MediaMTX,并通过命令“ipconfig /all”找到电脑位于WiFi的局域网IP。<br>
确保手机和电脑连接了同一个WiFi,再往anyRTC的推流界面填上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-20251123150115064-1336953116.jpg"></span></span></span></span></p>
<p>点击左上角的翻转按钮可切换前后摄像头,点击麦克风按钮可开关声音,可见anyRTC正在把摄像头采集到的视频数据向MediaMTX推流。<br>
然后另一部手机点击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="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-20251123150145549-1714551024.jpg"></span></span></span></span></p>
<p>在拉流页面中输入对应的MediaMTX拉流地址“rtmp://192.168.*.*:1935/stream”,接着点击页面下方的【开始播放】按钮,此时anyRTC就自动播放来自拉流地址的视频画面如下图所示。</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-20251123150205222-377061468.jpg"></span></span></span></span></p>
<p>对比anyRTC的推流预览界面和拉流播放界面,可知一部手机摄像头采集到的视频信号正确传送给了另一部手机。</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>
<div><span>&nbsp;</span></div><br><br>
来源:https://www.cnblogs.com/aqi00/p/19260632
頁: [1]
查看完整版本: FFmpeg开发笔记(九十四)基于Kotlin的国产开源推拉流框架anyRTC