三撇虎 發表於 2025-12-7 11:29:00

FFmpeg开发笔记(九十二)基于Kotlin的开源Android推流器StreamPack

<span data-cke-copybin-start="1"><span data-cke-copybin-start="1">​</span></span><span id="cke_bm_2912S">《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2 &nbsp;FFmpeg推流和拉流”提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有于2017年推出的SRT协议,相比常见的RTMP协议,SRT协议具有更低的延迟,并且消除了卡帧、抖动等花屏现象。</span>
<p><span id="cke_bm_2912S"> 因为SRT是个较新的直播协议,所以手机端支持SRT的开源框架比较稀有,比如本文介绍的StreamPack就是屈指可数的SRT开源推流APP。</span></p>
<h1>一、StreamPack简介</h1>
<p>StreamPack是一款适用于Android的开源直播流媒体库,既适合要求严格的视频推流厂商,也适合进阶Android的视频开发者。<br>
StreamPack的源码托管地址为https://github.com/ThibaultBee/StreamPack(星星数0.3k),国内的镜像地址为https://gitee.com/zonda89/StreamPack,最新版本是2025年9月发布的StreamPack 3.0.0,可见该框架的源码更新十分及时,该版本的源码下载链接为https://github.com/ThibaultBee/StreamPack/archive/refs/tags/3.0.0.tar.gz。<br>
StreamPack主要支持RTMP和SRT两种协议,视频编码支持HEVC/H.265、AVC/H.264、VP9或AV1等多种标准,音频编码支持AAC(LC、HE、HEv2)或Opus等多种标准。StreamPack的推留来源既可以是摄像头,也可以是屏幕录制器,还可以来自TS、FLV、MP4、WebM和分片MP4等格式的媒体文件。<br>
StreamPack提供了两种APP集成方式:引用在线库、直接导入源码,分别说明如下:</p>
<h1>二、引用StreamPack在线库</h1>
<p>Android工程引用StreamPack在线库时,需要修改以下三个配置:<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节点补充下面几行配置,表示引入3.0.0版本的StreamPack库:</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%22%2F%2F%20StreamPack%E6%A0%B8%E5%BF%83%5Cnimplementation%20'io.github.thibaultbee.streampack%3Astreampack-core%3A3.0.0'%5Cn%2F%2F%20StreamPack%E7%95%8C%E9%9D%A2%EF%BC%8C%E4%B8%BB%E8%A6%81%E7%94%A8%E4%BA%8E%E6%8E%A8%E6%B5%81%E9%A2%84%E8%A7%88%5Cnimplementation%20'io.github.thibaultbee.streampack%3Astreampack-ui%3A3.0.0'%5Cn%2F%2F%20StreamPack%E6%9C%8D%E5%8A%A1%EF%BC%8C%E4%B8%BB%E8%A6%81%E7%94%A8%E4%BA%8E%E5%B1%8F%E5%B9%95%E5%BD%95%E5%88%B6%5Cnimplementation%20'io.github.thibaultbee.streampack%3Astreampack-services%3A3.0.0'%5Cn%2F%2F%20StreamPack%E7%9A%84RTMP%E5%8D%8F%E8%AE%AE%E6%94%AF%E6%8C%81%5Cnimplementation%20'io.github.thibaultbee.streampack%3Astreampack-rtmp%3A3.0.0'%5Cn%2F%2F%20StreamPack%E7%9A%84SRT%E5%8D%8F%E8%AE%AE%E6%94%AF%E6%8C%81%5Cnimplementation%20'io.github.thibaultbee.streampack%3Astreampack-srt%3A3.0.0'%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs">// StreamPack核心
implementation 'io.github.thibaultbee.streampack:streampack-core:3.0.0'
// StreamPack界面,主要用于推流预览
implementation 'io.github.thibaultbee.streampack:streampack-ui:3.0.0'
// StreamPack服务,主要用于屏幕录制
implementation 'io.github.thibaultbee.streampack:streampack-services:3.0.0'
// StreamPack的RTMP协议支持
implementation 'io.github.thibaultbee.streampack:streampack-rtmp:3.0.0'
// StreamPack的SRT协议支持
implementation 'io.github.thibaultbee.streampack:streampack-srt:3.0.0'</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>三、直接导入StreamPack源码</h1>
<p>由于StreamPack基于Kotlin编码,引入了最新的Android开发技术,因此需要使用较新的Android Studio才能成功导入运行。接下来以Android Studio Ladybug(小瓢虫版本)为例,介绍如何通过Android Studio编译运行StreamPack的demo工程。</p>
<h2>1、调整Gradle版本</h2>
<p>打开StreamPack/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.11.1-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.11.1-bin.zip</code></pre>
</div>
<p>改成下面这行,也就是把Gradle8.11.1升级级到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导入StreamPack工程之后,Gradle会报错“The project is using an incompatible version (AGP 8.9.2) of the Android Gradle plugin. Latest supported version is AGP 8.7.2”。这是因为StreamPack工程用到的Gradle插件版本8.9.2太高了,需要降级降到8.7.2。于是打开StreamPack/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.9.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.9.2"</code></pre>
</div>
<p>改为下面这行,也就是把agp版本号从8.9.2降到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>
<h1>四、运行StreamPack的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-20251123132626685-726605177.jpg"></span></span></span></span></p>
<p>注意首次使用StreamPack需要先配置SRT服务器信息,点击界面左上角的三点设置按钮,打开服务器设置页面如下所示。</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-20251123132649418-94482555.jpg"></span></span></span></span></p>
<p>这里要修改以下四个SRT服务器配置:<br>
1、Endpoint区域的Type字段:点击后下拉选择“Stream to a remote SRT device”,表示采用SRT协议推流。<br>
2、SRT Server区域的IP字段:填流媒体服务器的IP。<br>
3、SRT Server区域的Port字段:填流媒体服务器对SRT协议的开放端口。比如MediaMTX默认的SRT端口号为8890。<br>
4、SRT Server区域的Stream ID字段:填“publish:live”。<br>
由于视频推流服务服务端配合,因此按照《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2.2 &nbsp;FFmpeg向网络推流”说明,在电脑上启动MediaMTX,并通过命令“ipconfig /all”找到电脑位于WiFi的局域网IP,接着把StreamPack的流媒体服务器IP改为电脑位于WiFi的局域网IP。<br>
确保手机和电脑连接了同一个WiFi,再点击StreamPack界面下方的START LIVE按钮,StreamPack就把摄像头采集到的视频数据向MediaMTX推流,开始推流的预览界面如下图所示。</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-20251123132717019-1522818928.jpg"></span></span></span></span></p>
<p>然后电脑打开VLC media player,依次选择菜单:媒体→打开网络串流,在弹窗的URL栏输入对应的MediaMTX拉流地址“srt://192.168.*.*:8890?streamid=read:live”如下图所示。</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-20251123132743212-1077314675.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-20251123132807221-1454724681.png"></span></span></span></span></p>
<p>对比StreamPack的推流预览界面和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>

<span data-cke-copybin-start="1">
<span data-cke-copybin-end="1">​</span></span><br><br>
来源:https://www.cnblogs.com/aqi00/p/19260415
頁: [1]
查看完整版本: FFmpeg开发笔记(九十二)基于Kotlin的开源Android推流器StreamPack