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开发实战详解,含直播系统的搭建过程)》

相关推荐
Together_CZ3 小时前
Cambrian-S: Towards Spatial Supersensing in Video——迈向视频中的空间超感知
人工智能·机器学习·音视频·spatial·cambrian-s·迈向视频中的空间超感知·supersensing
Android系统攻城狮3 小时前
Android16音频之设置音频属性AudioTrack.Builder().setAudioAttributes:用法实例(一百一十九)
音视频·android16·音频进阶
空影星3 小时前
轻量日记神器RedNotebook,高效记录每一天
python·数据挖掘·数据分析·音视频
Black蜡笔小新3 小时前
视频汇聚平台EasyCVR赋能石油管道计量站精准监控与安全管理
安全·音视频
Aileen_0v04 小时前
【Gemini3.0的国内use教程】
android·人工智能·算法·开源·mariadb
nuoxin1144 小时前
GSV1011-富利威-HDMI芯片选型
arm开发·驱动开发·fpga开发·ffmpeg·射频工程
浩浩的代码花园4 小时前
自研端侧推理模型实测效果展示
android·深度学习·计算机视觉·端智能
踢球的打工仔11 小时前
PHP面向对象(7)
android·开发语言·php
安卓理事人11 小时前
安卓socket
android