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

《FFmpeg开发实战:从零基础到短视频上线》一书的"10.2 FFmpeg推流和拉流"提到直播行业存在RTSP和RTMP两种常见的流媒体协议。除此以外,还有于2017年推出的SRT协议,相比常见的RTMP协议,SRT协议具有更低的延迟,并且消除了卡帧、抖动等花屏现象。

因为SRT是个较新的直播协议,所以手机端支持SRT的开源框架比较稀有,比如本文介绍的StreamPack就是屈指可数的SRT开源推流APP。

一、StreamPack简介

StreamPack是一款适用于Android的开源直播流媒体库,既适合要求严格的视频推流厂商,也适合进阶Android的视频开发者。

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。

StreamPack主要支持RTMP和SRT两种协议,视频编码支持HEVC/H.265、AVC/H.264、VP9或AV1等多种标准,音频编码支持AAC(LC、HE、HEv2)或Opus等多种标准。StreamPack的推留来源既可以是摄像头,也可以是屏幕录制器,还可以来自TS、FLV、MP4、WebM和分片MP4等格式的媒体文件。

StreamPack提供了两种APP集成方式:引用在线库、直接导入源码,分别说明如下:

二、引用StreamPack在线库

Android工程引用StreamPack在线库时,需要修改以下三个配置:

1、打开项目级别的build.gradle,或者settings.gradle,给repositories节点补充下面一行配置(注意有两个repositories,两个地方都要加),表示指定Maven仓库:

复制代码
maven { url 'https://jitpack.io' }

2、打开模块级别的build.gradle,给dependencies节点补充下面几行配置,表示引入3.0.0版本的StreamPack库:

复制代码
// 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'

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" />

三、直接导入StreamPack源码

由于StreamPack基于Kotlin编码,引入了最新的Android开发技术,因此需要使用较新的Android Studio才能成功导入运行。接下来以Android Studio Ladybug(小瓢虫版本)为例,介绍如何通过Android Studio编译运行StreamPack的demo工程。

1、调整Gradle版本

打开StreamPack/gradle/wrapper/gradle-wrapper.properties,把下面这行

复制代码
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip

改成下面这行,也就是把Gradle8.11.1升级级到8.14。

复制代码
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip

2、修改AGP插件版本

使用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,把下面这行

复制代码
agp = "8.9.2"

改为下面这行,也就是把agp版本号从8.9.2降到8.7.2。

复制代码
agp = "8.7.2"

四、运行StreamPack的DEMO工程

完成以上几处配置调整后,重新编译App安装到真机上,启动后的初始界面如下图所示:

注意首次使用StreamPack需要先配置SRT服务器信息,点击界面左上角的三点设置按钮,打开服务器设置页面如下所示。

这里要修改以下四个SRT服务器配置:

1、Endpoint区域的Type字段:点击后下拉选择"Stream to a remote SRT device",表示采用SRT协议推流。

2、SRT Server区域的IP字段:填流媒体服务器的IP。

3、SRT Server区域的Port字段:填流媒体服务器对SRT协议的开放端口。比如MediaMTX默认的SRT端口号为8890。

4、SRT Server区域的Stream ID字段:填"publish:live"。

由于视频推流服务服务端配合,因此按照《FFmpeg开发实战:从零基础到短视频上线》一书的"10.2.2 FFmpeg向网络推流"说明,在电脑上启动MediaMTX,并通过命令"ipconfig /all"找到电脑位于WiFi的局域网IP,接着把StreamPack的流媒体服务器IP改为电脑位于WiFi的局域网IP。

确保手机和电脑连接了同一个WiFi,再点击StreamPack界面下方的START LIVE按钮,StreamPack就把摄像头采集到的视频数据向MediaMTX推流,开始推流的预览界面如下图所示。

然后电脑打开VLC media player,依次选择菜单:媒体→打开网络串流,在弹窗的URL栏输入对应的MediaMTX拉流地址"srt://192.168.*.*:8890?streamid=read:live"如下图所示。

确认输入无误后,单击右下角的播放按钮,此时VLC media player就自动播放来自拉流地址的视频画面如下图所示。

对比StreamPack的推流预览界面和VLC media player的拉流播放界面,可知手机摄像头采集到的视频信号正确传送给了电脑。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

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

相关推荐
xiangpanf5 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx8 小时前
安卓线程相关
android
消失的旧时光-19439 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon10 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon10 小时前
VSYNC 信号完整流程2
android
dalancon10 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
yy我不解释11 小时前
关于comfyui的mmaudio音频生成插件时时间不一致问题(三)
开发语言·python·ai作画·音视频·comfyui
用户693717500138411 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android11 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才12 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android