javaweb流媒体播放_实时流(直播流)播放、上墙(⼤屏播
放)解决⽅案
场景描述
将实时流采集终端的视频数据实时推送到另外⼀个(多个)播放终端,完成远距离实时视频播放的功能。典型场景:
(1)远程查看监控摄像头。选择指定摄像头,将该摄像头采集到的实时数据推送到指定播放终端,供值班(监控中⼼)⼈员查看。包括实时视频上墙,推送到指定⼤屏幕上;
(2)直播系统。⽤户在PC上安装推流⼯具,抓取屏幕(麦克风)实时数据,推送给观看直播的观众。nginx部署前端项目
解决⽅案
要完成端到端的流推送,我们需要借助中间件来完成,常⽤到的有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
在百度地图中按区域查摄像头,选择摄像头,查看摄像头实时视频数据。流程为:请求视频->
Demo2
选择摄像头,将摄像头实时流推到⼤屏上。流程为:请求⼤屏上墙(携带⼤屏ID)->计算rtmp->推流开始->拉流开始。下图为⼤屏模拟管理器:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。