FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流

news2024/7/30 2:36:32

SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架,可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等,支持的音频编码包括AAC、OPUS等等,可谓功能强大的APP直播框架。
相比之下,另一款APP直播框架RTMP Streamer支持RTMP直播和RTSP直播,不支持SRT协议的直播。而本文讲述的SRT Streamer支持RTMP直播和SRT直播,不支持RTSP协议的直播。有关RTMP Streamer的说明参见之前的文章《使用RTMP Streamer开启APP直播推流》,下面介绍如何使用SRT Streamer开启手机的APP直播推流。

一、下载SRT Streamer

SRT Streamer采取全Kotlin编码,需要在Android Studio Jellyfish(小水母版本)上编译运行,并且依赖最新的JDK17,对运行环境与开发者的技能要求都比较高。博主花了好长时间才找到可用的SRT Streamer源码,如果大家需要这套源码,可在京东自营购买《FFmpeg开发实战:从零基础到短视频上线》一书,联系作者获取SRT Streamer源码。
博主找到的SRT Streamer源码采用Kotlin编写,非Java编写,需使用小水母版本的AS打开。所以需要先安装小水母版本的AS,也就是Android Studio Jellyfish,该版本AS的下载地址为 https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2023.3.1.18/android-studio-2023.3.1.18-windows.zip 。

二、加载SRT Streamer

下载的SRT Streamer源码是个完整的AS项目,启动小水母版本的Android Studio,依次选择菜单:File→Open,在弹出的文件对话框中选择解压后的SRT Streamer源码目录。Android Studio就开始自动下载相关组件,并执行gradle同步等操作。为了加快SRT Streamer项目的加载速度,可打开项目级别的build.gradle,在repositories节点内部补充以下配置:

// 以下四行添加阿里云的仓库地址,方便国内开发者下载相关插件
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven { url 'https://maven.aliyun.com/repository/public'}
// 以下添加华为的仓库地址
maven { url 'https://developer.huawei.com/repo/'}

增加以上配置的目的是引入国内的仓库地址,以便加快相关依赖包的下载速度。
等待SRT Streamer项目成功加载完毕,查看Android Studio左侧的导航图,可见SRT Streamer项目由下列五个模块组成:
core模块:这是SRT Streamer给音频流和视频流分别编码的模块。
demo-camera模块:这是SRT Streamer的摄像头直播演示模块,也是APP工程的主入口。
demo-screenrecorder模块:这是SRT Streamer的屏幕录像直播演示模块。
extension-rtmp模块:这是SRT Streamer处理RTMP协议通信的模块。
extension-srt模块:这是SRT Streamer处理SRT协议通信的模块。

三、启动SRT Streamer

Android Studio成功加载SRT Streamer之后,即可在手机上安装SRT Streamer的演示APP了。有关APP编译和安装的详细步骤参见《Android Studio开发实战:从零基础到App上线(第3版)》一书第2章的“2.1.1  App的运行环境”,这里不再赘述。
SRT Streamer的演示APP在手机上安装完毕,启动后的初始界面是下面这样的。

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

这里要修改以下四个SRT服务器配置:
1、Endpoint区域的Type字段:点击后下拉选择SRT device,表示采用SRT协议推流。
2、SRT Server区域的IP字段:填流媒体服务器的IP。
3、SRT Server区域的Port字段:填流媒体服务器对SRT协议的开放端口。比如SRS默认的SRT端口号为10080,ZLMediaKit默认的SRT端口号为9000。
4、SRT Server区域的Stream ID字段:填“#!::r=live/test,m=publish”。
可见SRT Streamer提供了丰富多样的直播形式,既可以通过手机摄像头直播,还能对手机的屏幕操作进行直播。具体的直播协议又包括RTMP和SRT两种,可以满足绝大多数场景的直播需求,而且SRT Streamer是个开源软件,提供了完整的APP直播录制全套代码,非常适合开发者学习和研究。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1916960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统架构设计师】九、软件工程(软件开发生命周期|McCabe度量法|系统转换|系统维护|净室软件工程|基于构件的软件工程)

目录 九、软件开发生命周期和工具 十、McCabe度量法 十一、系统转换 11.1 遗留系统 11.2 系统转换 11.3 系统维护 十二、净室软件工程 十三、基于构件的软件工程 13.1 构件特征 13.2 构件模型要素 13.3 CBSE过程 13.4 构件组装 相关推荐 历年真题练习 九、软件开…

Django项目创建的基本准备工作【4】

【 一 】软件开发模式 官话下面 人话 瀑布开发就是将什东西都定义好了在进行开发对吧 敏捷就是进行模块化一样 分批进行 规定一个时间段完成什么样的功能。 总结来说,瀑布开发强调在项目开始之前进行详细的计划和准备,并按照预定的顺序逐步进行&#x…

Elasticseach学习

概念 是一个开源的分布式搜索引擎,可以应用于搜索、日志监控等 倒排索引 正向索引:基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条 倒排索引:对文档内容分词,对词条创建索引,并记录…

前端面试题44(JavaScript几种排序的变种或高级应用)

1. 快速排序的变种 三轴快排 (Three-Way QuickSort):处理大量重复元素时更为高效,通过维护三个区域来避免重复元素的重复比较和交换。平衡快排 (Balanced QuickSort):通过随机选取或使用中位数作为枢轴,以减少最坏情况下的性能退…

重命名文件的方法有哪些?重命名文件的工具有哪些?

在日常的计算机使用过程中,重命名文件是一项常见但至关重要的任务。无论是为了更好地组织文件、修复命名错误,还是简化文件管理流程,掌握正确的重命名方法和工具都能显著提升效率。 本文将探讨多种重命名文件的方法,同时介绍几款高…

传言称 iPhone 16 Pro 将支持 40W 快速充电和 20W MagSafe

目前,iPhone 15 和 iPhone 15 Pro 机型使用合适的 USB-C 电源适配器可实现高达 27W 的峰值充电速度,而 Apple 和授权第三方的官方 MagSafe 充电器可以高达 15W 的功率为 iPhone 15 机型进行无线充电。所有四款 iPhone 15 机型均可使用 20W 或更高功率的电…

ArduPilot开源飞控之AP_Mount_Siyi

ArduPilot开源飞控之AP_Mount_Siyi 1. 源由2. 框架设计2.1 类和继承2.2 公共方法2.3 保护方法2.4 私有成员和方法2.5 解析状态2.6 重要成员变量 3. 重要方法3.1 AP_Mount_Siyi::init3.2 AP_Mount_Siyi::update3.3 AP_Mount_Siyi::read_incoming_packets3.4 AP_Mount_Siyi::proc…

linux登入提示信息

目录 1.Linux 登录提示信息在操作系统中扮演着重要的角色 安全性提醒 欢迎信息 系统状态通知 政策和使用条款 技术支持信息 更新和变更通知 2.配置文件介绍 3.编辑配置文件 4.效果展示 修改前 修改后 目录 1.Linux 登录提示信息在操作系统中扮演着重要的角色 安…

vue 数据类型

文章目录 ref 创建:基本类型的响应式数据reactive 创建:对象类型的响应式数据ref 创建:对象类型的响应式数据ref 对比 reactive将一个响应式对象中的每一个属性,转换为ref对象(toRefs 与 toRef)computed (根据计算进行修改) ref 创…

Go语言---并发编程以及资源竞争(goroutine、runtime)

并发和并行 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的&a…

华为HCIP Datacom H12-821 卷34

1.单选题 防火墙默认已经创建了一些安全区域,以下哪一个安全区域不是防火墙上默认存在的? A、Trust B、DMZ C、Internet D、Local 正确答案: C 解析: 防火墙默认情况下为我们提供了三个安全区域,分别是 Trust、DMZ和Untrust 2.判断题 …

8. Python3 pandas数据分析处理库

11.1 pandas的数据结构 pandas的数据结构如下图所示: pandas的几种数据结构有内在联系,可以吧DataFrame看作Series的容器,把Panel看作DataFrame的容器。可以像操作字典那样在这些数据结构中插入或者移除数据对象。在介绍这些数据结构之前&am…

力扣-dfs

何为深度优先搜索算法? 深度优先搜索算法,即DFS。就是找一个点,往下搜索,搜索到尽头再折回,走下一个路口。 695.岛屿的最大面积 695. 岛屿的最大面积 题目 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相…

【Git基本操作】添加文件 | 修改文件 | 及其各场景下.git目录树的变化

目录 1. 添加文件&add操作和commit操作 2. .git树状目录的变化 3. git其他操作 4. 修改文件 4.1 git status 4.2 git diff 1. 添加文件&add操作和commit操作 add操作:将工作区中所有文件的修改内容 添加进版本库的暂存区中。commit操作:…

TortoiseSVN-VisualSVNServer-软件代码文本资源版本控制管理-版本比较及差异文件

文章目录 1.VisualSVNServer安装2.TortoiseSVN安装2.1.检出2.2.提交资源2.3.更新资源2.4.返回版本2.5.比较软件可更改2.6.在此创建版本库3.TortoiseSVN版本差异文件1.VisualSVNServer安装 从官网下载,或者csdn下载链接: https://download.csdn.net/download/m0_67316550/8952…

Python酷库之旅-第三方库Pandas(015)

目录 一、用法精讲 37、pandas.read_sql函数 37-1、语法 37-2、参数 37-3、功能 37-4、返回值 37-5、说明 37-6、用法 37-6-1、数据准备 37-6-2、代码示例 37-6-3、结果输出 38、pandas.DataFrame.to_sql函数 38-1、语法 38-2、参数 38-3、功能 38-4、返回值 …

Python酷库之旅-第三方库Pandas(016)

目录 一、用法精讲 39、pandas.DataFrame.to_stata函数 39-1、语法 39-2、参数 39-3、功能 39-4、返回值 39-5、说明 39-6、用法 39-6-1、数据准备 39-6-2、代码示例 39-6-3、结果输出 40、pandas.read_stata函数 40-1、语法 40-2、参数 40-3、功能 40-4、返回…

Gmail邮件提醒通知如何设置?有哪些方法?

Gmail邮件提醒通知功能怎么样?通知邮件怎么有效发送? Gmail作为全球广泛使用的电子邮件服务,提供了多种邮件提醒通知功能,帮助用户不错过重要信息。AokSend将详细介绍如何设置Gmail邮件提醒通知,确保您不会错过任何重…

Mysql查询近半年每个月有多少天

Mysql 查询近6个月每个月有多少天: SELECT DATE_FORMAT(DATE_ADD(NOW(),INTERVAL-(CAST( help_topic_id AS SIGNED INTEGER )) MONTH ), %Y-%m) as months,DAY(LAST_DAY(CONCAT(DATE_FORMAT(DATE_ADD(NOW(),INTERVAL-(CAST( help_topic_id AS SIGNED INTEGER )) MO…

JavaScript中的Symbol类型是什么以及它的作用

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介JavaScript中的Symbol类型是什么以及它的作用1. 符号(Symbol)的创建2. 符号的特性3. 符号的作用3.1 属性名的唯一性3.2 防止属性被意外访问或修改3.3 使用内置的符号3.4 符号与属性遍历 4. 总结 ⭐ 写在最后…