实时文章采集(实时流采集终端的视频数据实时推送到另外一个(多个))

优采云 发布时间: 2021-12-05 15:14

  实时文章采集(实时流采集终端的视频数据实时推送到另外一个(多个))

  场景描述

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

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

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

  解决方案

  完成端到端的流推送,需要借助中间件来完成,常用的NginxRtmp模块用于传输视频数据。实时流媒体采集端根据给定地址推送数据到Nginx流媒体服务器,播放端根据给定地址从Nginx流媒体服务器拉取数据呈现给用户.

  

  实时流*敏*感*词*

  如果多个用户需要播放同一个实时流数据,那么理想情况下,流端的数据应该是复用的,即流端只需要为多个播放终端推送一个流。此时,流端和播放端处于pair-N关系。

  

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

  如果广播用户很多,推送和广播端的数量很多,仅仅依靠流媒体服务器转发数据肯定是不够的。这时候就需要多台流媒体服务器协同工作。当有多个流媒体服务器时,就会出现一个问题:当用户请求实时流媒体时,如何为其分配一个流媒体服务器?这时候会引入另一个概念:负载均衡。当有多个流媒体服务器时,我们需要通过一定的策略来计算出最合适的流媒体服务器,比如找到当前负载最小的服务器,交给用户。

  

  多个流媒体服务器

  如上图所示,当有多个流媒体服务器时,负载均衡需要根据指定的策略计算出最佳服务器地址,然后推送端和播放端根据地址分别推拉流。该数字是使用流媒体服务器1计算得到的。

  实现技术

  使用的技术和工具:

  (1)CentOS6.5+Tomacat8.0+Mysql+Spring,javaweb后台,接收用户请求,负载计算,流状态同步,发送推流指令等;

  (2)ffmpeg,C++调用的流媒体工具;

  (3)RabbitMQ,web后台和推送端传递消息;

  (4)Nginx1.12.0+rtmpmodule,详情可查看官方第三方模块列表、流媒体转发;

  (5)VLCC#开发工具,用来拉流,网上有公开的API调用方法,用来做客户端demo,以下截图基于这个demo;

  (6)jwplayer,真正的web前端实时流控。

  详细实施

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

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

  这里详细描述了负载计算的逻辑。该模块与Web后端分离,可以单独部署。

  

  这个模块是java后端的一部分,当然也可以单独部署。它通过数据库中的请求表与 Web 后端同步数据。接下来是负载均衡中生成rtmp的逻辑,rtmp就是本文开头提到的push/pull地址。

  

  push 和 pull 端可以通过给定的 rtmp 进行推拉。Nginx流媒体服务器(具体为rtmp模块)接收推送开始(publish_start)、推送结束(publish_done)、拉取开始(play_start)。) 并且当流结束(play_done)时,会根据配置文件中的配置进行http回调,回调地址配置为java负载均衡后台。我们需要在这个回调中更新流媒体服务器的状态,比如当前流媒体服务器的负载数,以便下次负载计算。

  

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

  

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

  

  演示演示

  由于种种原因,这里只能挂一些演示图片:

  演示1

  在百度地图中按区域搜索*敏*感*词*,选择*敏*感*词*,查看*敏*感*词*实时视频数据。流程是:请求视频->

  

  演示2

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

  

  大屏准备好后,开始播放,管理员状态更新:

  

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

  

  程序概要

  (1)push端和pull端有1->N的关系,对于每个push流,可以同时有多个pull端,即push流可以复用。当多个用户请求时同一个资源(比如同一个camera),只需要推一个流,此时每个用户的拉流地址rtmp是一样的。

  (2)需要一个流媒体服务器作为push和pull之间的桥梁,负责实时流的转发。这里使用的是Nginx+rtmpmodule,网上有详细教程。

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

  (4)Nginx+rtmp模块的配置文件中,有一项是配置'状态回调'的地址。当流媒体服务器的状态发生变化时,会通过这个通知java后端打回来。

  不提供源码,有问题的朋友可以留言或私信。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线