android 实时流媒体 实时流媒体播放

news2024/11/24 10:28:50

场景描述

将实时流采集终端的视频数据实时推送到另外一个(多个)播放终端,完成远距离实时视频播放的功能。典型场景:

(1)远程查看监控摄像头。选择指定摄像头,将该摄像头采集到的实时数据推送到指定播放终端,供值班(监控中心)人员查看。包括实时视频上墙,推送到指定大屏幕上;

(2)直播系统。用户在PC上安装推流工具,抓取屏幕(麦克风)实时数据,推送给观看直播的观众。

本文福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

解决方案

要完成端到端的流推送,我们需要借助中间件来完成,常用到的有Nginx Rtmp模块,用来中转视频数据。实时流采集终端根据给定的地址将数据推送到Nginx流媒体服务器,播放终端根据给定的地址从Nginx流媒体服务器上拉取数据,呈现给用户。

实时流播放结构图

如果多个用户需要播放同一个实时流数据,那么理想情况下,推流端的数据应该可以复用,也就是说,推流端只需要推一路流,供多个播放终端使用。此时推流端和播放端是一对N的关系。

多个用户播放同一个实时流数据

如果播放用户很多,推流端和播放端数量大,只靠一台流媒体服务器转发数据肯定不行。这时候需要多台流媒体服务器协同工作,当有多个流媒体服务器时,就会出现一个问题:当用户请求实时流,该如何为它分配流媒体服务器呢?此时,就会引入另外一个概念:负载均衡。当有多台流媒体服务器时,我们需要通过某种策略去计算,得出最适合的流媒体服务器,比如找出当前负载量最小的服务器,给用户使用。

多个流媒体服务器

如上图,存在多个流媒体服务器时,负载均衡需要根据指定的策略计算出最佳的服务器地址,然后推流端和播放端根据地址分别推流拉流。图中由计算得出,使用流媒体服务器1。

实现技术

用到的技术、工具:

(1)CentOS 6.5 + Tomacat 8.0 + Mysql + Spring,java web后台,接收用户请求、负载计算、流状态同步、发送推流指令等等;

(2)ffmpeg,推流工具,供C++调用;

(3)RabbitMQ,web后台与推流端传递消息;

(4)Nginx 1.12.0 + rtmp module,具体可以查看官方第三方module list, 流媒体转发;

(5)VLC C#开发工具,用来拉流,网上有公开API调用方法,用来做客户端demo,后面的截图都是基于该demo;

(6)jwplayer,实际中web前端实时流播放控件。

详细实现

(1)关于Nginx+rtmp模块实现实时流转发的内容这里就不再写了,网上很多教程,也非常简单,不需要手写任何代码;

(2)Java web后台采用SpringMVC + Mybatis,只需要实现一些http接口即可;

这里详细说一下负载计算这块的逻辑,该模块与web后台分开,可以单独部署。

该模块属于java 后台的一部分,当然也可以分开部署,它与web后台是通过数据库中的请求表同步数据。接下来是负载均衡中生成rtmp的逻辑,rtmp也就是本文开头提到的推流\拉流地址了。

推流端和拉流端可以通过给定的rtmp进行推拉流,Nginx流媒体服务器(具体应该是rtmp模块)在收到推流开始(publish_start)、推流结束(publish_done)、拉流开始(play_start)以及拉流结束(play_done)时,都会按照配置文件中的配置进行http回调,该回调地址配置成java 负载均衡后台。我们需要在该回调中更新流媒体服务器的状态,比如流媒体服务器的当前负载数,用于下次负载计算。

有时候http回调会失败,这就会导致负载均衡模块中保存的流媒体服务器的状态有误差,所以我们需要主动同步流媒体服务器的负载状态:

负载计算的另一个非常重要的标准就是检查流媒体服务器是否在线,如果不在线,那么这台流媒体服务器就不在我们考虑的范围之内。主动检查流媒体服务器状态:

Demo演示

由于各种原因,这里只能挂一些demo的图片:

Demo1

在百度地图中按区域查找摄像头,选择摄像头,查看摄像头实时视频数据。流程为:请求视频->负载计算rtmp->推流开始->拉流开始。

Demo2

选择摄像头,将摄像头实时流推到大屏上。流程为:请求大屏上墙(携带大屏ID)->计算rtmp->推流开始->拉流开始。下图为大屏模拟管理器:

当大屏就绪后,开始播放,管理器状态更新:

大屏模拟器界面,支持断线恢复。关闭终端后,再次打开,流推送不会中断:

方案总结

(1)推流端和拉流端是1->N的关系,对于每一路推流,可以同时存在多个拉流端,即推流可以复用。当多个用户请求同一资源(如同一摄像头)时,只需要推一路流即可,这时候每个用户的拉流地址rtmp相同。

(2)推流和拉流之间需要流媒体服务器作为桥梁,负责实时流的转发工作。这里使用的时Nginx+rtmp module,网上有详细教程。

(3)流媒体服务器的选择需要经过负载均衡计算得出,负载计算的策略包含:流媒体服务器是否在线、负载数(当前播放链路)是否达到服务器的上限、请求的资源是否已被推流(即可以复用,这种情况下,直接返回之前的rtmp即可,不需要重新分配服务器)。

(4)Nginx+rtmp模块的配置文件中,有一项是配置‘状态回调’的地址,当流媒体服务器的状态发生变化时,会通过该回调告知后台。

本文福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

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

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

相关文章

学习华为企业无线网络,有这篇文章就够了(二)

学习华为企业无线网络,有这篇文章就够了(一)https://xmws-it.blog.csdn.net/article/details/135385614 WLAN的基础配置命令 - 配置AP上线 (1) •命令:optioncode [ sub-optionsub-code ] { asciiascii-string | hex hex-string |…

ChatGPT新出Team号 年付费

之前一直传的团队版ChatGPT终于来了,这个对拼单的比较合算。每人每月25美元,只能按年支付。 团队版比普通版多的权益有: ◈更多的GPT-4消息上限,三小时100次。 ◈可以创建与团队内部共享的GPTs。 ◈用于工作空间管理的管理员控…

数字化转型助力保险业腾飞,国产化安全产品护航高质量发展

近几年,全球贸易和经济受到了巨大冲击,众多贸易企业经营环境面临困难,某保险公司为国内企业提供强有力的保险保障,大大减轻了企业在国际贸易中风险,为国家经济恢复起到关键的作用。2022年,该保险公司承保金…

大数据 - Doris系列《三》- 数据表设计之表的基本概念

目录 🐶3.1 字段类型 🐶3.2 表的基本概念 3.2.1 Row & Column 3.2.2 分区与分桶 🥙3.2.2.1 Partition 1. Range 分区 2. List 分区 进阶:复合分区与单分区的选择 3.2.3 PROPERTIES 🥙3.2.3.1 分片副本数 &#x1f…

聚丙烯PP它的化学特性是什么? UV胶水能够粘接聚丙烯PP吗?

聚丙烯(Polypropylene,简称PP)是一种热塑性聚合物,属于聚烯烃类塑料之一。以下是聚丙烯的一些化学特性: 1. 分子结构: 聚丙烯是由丙烯单体(propylene)聚合而成的。其分子结构主要由…

235个国家-数字经济发展相关23个指标(2000-2022年)

本文涉及235个国家的数字经济发展的23个相关指标数据,为我们提供了一个全面的视角,用以分析和比较全球范围内数字经济的发展状况。这些国家,年份,移动网络覆盖率,固定电话普及率,固定宽带普及率等指标。这些…

【Web】CTFSHOW PHP命令执行刷题记录(全)

目录 web29 web30 web31 web32 web33 web34 web35 web36 web37-39 web40 web41 (y4✌脚本) web42 -44 web45 web46 -49 web50 web51 web52 web53 web54 web55-56 web57 web58 web59 web60 web61 web62 web63-65 web66-67 w…

十个月,双非从零到大厂实习,我经历了什么?

个人背景 「双非大三」计科专业在读,某短视频「一线大厂」数据开发 22年10月份接触大数据,次年4月开始收割小厂实习offer,七月进入小厂实习,八月通过大厂面试 我只是万千普通人中的幸运儿,希望我的经历可以给一些人…

vulhub中的Nginx 文件名逻辑漏洞(CVE-2013-4547)

目录 Nginx 文件名逻辑漏洞(CVE-2013-4547) 1.cd到CVE-2013-4547 2.执行docker-compose up -d 3.查看靶场是否开启成功 4.访问浏览器 5.上传含有一句话木马的图片 6.burp抓包 7.在shell.gif加空格 8.放包 9.访问路径 10.继续抓包 11.在aa后面…

基于Java开发的工作流审批系统,自定义工作流,表单绑定

前言 activiti工作流,企业erp、oa、hr、crm等审批系统轻松落地,请假审批demo从流程绘制到审批结束实例。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,快速开发平台,可插拔工作流服务。 二、项目介绍 本项目…

5、C语言:结构

结构 结构的基本知识结构与函数传递结构 结构数组、指向结构的指针自引用结构(二叉树)表查找类型定义(typedef)联合位字段 结构也是一种数据类型。类似于int、char、double、float等。 结构是一个或多个变量的集合,这些…

SG-8101CGA 系列 (晶体振荡器 可编程 可用 +125°C )

SG-8101CGA是可编程晶体振荡器,具有CMOS输出,适用于汽车,同时,该系列还提供相同的频率和其他参数的轻松编程能力,符合AEC-Q100标准,具有出色的电磁兼容性和稳定性,可以在各种环境下使用。外部尺…

判断质数-- 试除法判定质数(终于有人给我说明白了)

目录 判断质数思路:代码 原题链接 判断质数 给定 n个正整数 ai,判定每个数是否是质数。 输入格式 第一行包含整数 n 。 接下来 n 行,每行包含一个正整数 ai 。 输出格式 共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数&…

社交距离 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 疫情期间,需要大家保证一定的社交距离,公司组织开交流会议,座位有一排共N个座位,编号分别为[0…N-1],要求员工一个接着一个进入会议室,并且可以在任何时候离开会议室。 满足:每当一个员工进入时,…

虚拟主机 如何上传大于100M的文件 php网站程序

问题 虚拟主机上传文件大小限制100m, 有时会遇到非常大的文件上传,上传过程中耗时非常久, 可能服务器的限制设置了上传文件尺寸,返回“413 request entity too large” 整体逻辑 前端:上传文件时,进行文…

vue前端开发自学,组件的嵌套关系demo

vue前端开发自学,组件的嵌套关系demo!今天开始分享的,前端开发经常用到的,组件的嵌套关系案例代码。下面先给大家看看,代码执行效果。 如图,这个是代码执行后,的效果布局! 下面给大家贴出来源码。方便大家…

C++_vector类

目录 一、vector的模拟实现 1、vector的组成结构 2、vector尾插数据 2.1 析构函数 3、迭代器实现 4、resize 5、删除数据 5.1 迭代器失效 6、指定位置插入数据 6.1 迭代器失效 7、迭代器构造和resize构造 8、深浅拷贝 结语: 前言: vect…

Vue3:使用解构赋值来读取对象里的键-值对(值也是对象)

一、前言 在Vue3中,想要读取一个对象的“键—值”对(值也是一个对象),数据格式如下: {1:{courseName: 课程1, study: 951526, visit: 3785553},2:{courseName: 课程2, study: 181630, visit: 380830}&…

Open CV 图像处理基础:(五)Java 使用 Open CV 的绘图函数

Java 使用 Open CV 的绘图函数 使用 Open CV 在 Java 中对图片使用绘图函数,分别绘制矩形、斜线、圆形、椭圆形以及添加文本 Java 使用 Open CV 的绘图函数 Java 使用 Open CV 的绘图函数函数绘制矩形绘制线绘制圆形绘制椭圆添加文本 代码示例 函数 绘制矩形 Im…

创新工具:2024年开发者必备的一款表格控件

前言 在现代工作环境中,信息的处理和管理是至关重要的。表格是一种常见的数据呈现和整理工具,被广泛应用于各行各业。然而,随着技术的不断发展,市场对表格控件的需求也越来越高。随着工作效率的重要性日益凸显,一款高…