使用Java实现视频直播解决方案

1.概述

本博客使用JavaCV开发的rtsp流转rtmp流并进行推流,并使用nginx实现流媒体直播方案

1.1 网络摄像头协议(一般网络摄像头支持协议有GB/T28181和RTSP协议)

1).GB/T28181 国标
GB/T28181-2011是由公安部科技信息化局提出,国家标准。该标准规定了城市监控报警联网系统中信息传输、交换、
控制的互联结构。该标准适用于安全防范监控报警联网系统的方案设计、系统检测、验收以及与之相关的设备研发、生
产,其他信息系统可参考采用。
2).RTSP协议
实时流协议RTSP实时流协议。由谷歌公司开发,RTSP协议一般与RTP/RTCP和RSVP等底层协议一起协同工作,提供
基于Internet的整套的流服务。

1.2.流媒体概述

流媒体以流的方式在网络中传输音频、视频和多媒体文件的形式。
流式传输方式是将视频和音频等多媒体文件经过特殊的压缩方式分成一个个压缩包,
由服务器向用户计算机连续、实时传送。在采用流式传输方式的系统中,用户不必像非流式播放那样等到整个文件全部
下载完毕后才能看到当中的内容,而是只需要经过几秒钟或几十秒的启动延时即可在用户计算机上利用相应的播放器对
压缩的视频或音频等流式媒体文件进行播放,剩余的部分将继续进行下载,直至播放完毕。

1.3直播协议简介

首先,在搭建服务之前先了解下目前主流的几个直播协议:

1)、RTMP:

 实时消息传输协议,是 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的开放协议。协
 议基于 TCP,是一个协议族,包括 RTMP 基本协议及 RTMPT/RTMPS/RTMPE 等多种变种。RTMP 是一种设计用来
 进行实时数据通信的网络协议,主要用来在 Flash/AIR 平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和
 数据通信。这种方式的实时性比较强,基本能保证延迟在1-2s内,是现在国内直播主要采用的方式之一!因为延时问
 题,采用RTMP实现
 
 缺点: 不过使用这种协议,就必须安装flash,而H5、IOS、Android并不能原生支持flash,因此这种协议能流行多
 久,就不得而知了,毕竟移动端才是现在的主流。

2)、HLS:

 hls是Apple推出的直播协议,是通过视频流切片成文件片段来直播的。客户端首先会请求一个m3u8文件,里面会有不
 同码率的流,或者直接是ts文件列表,通过给出的ts文件地址去依次播放。在直播的时候,客户端会不断请求m3u8文
 件,检查ts列表是否有新的ts切片。这种方式的实时性较差,不过优势是H5、IOS、Android都原生支持。

3)、HTTP-FLV:

  HTTP-FLV就是对RTMP协议的封装,相比于RTMP,它是一个开放的协议。因此他具备了RTMP的实时性和RTMP不
  具备的开发性,而且随着flv.js出现(感谢B站),使得浏览器在不依赖flash的情况下,播放flv视频,从而兼容了移动
  端,所以现在很多直播平台,尤其是手机直播平台,都会选择它

2.方案一:采用RTMP实现

 使用JavaCV开发的rtsp流转rtmp流并进行推流到nginx,采用,前端使用EasyPlayer.js实现

2.1 将rtsp流转rtmp流并进行推流的流媒体服务demo

github地址

2.2使用nginx-rtmp-module接收java程序的推流

安装nginx,在dockerhup搜索nginx-rtmp,找到对应版本
下载docker镜像
docker pull tiangolo/nginx-rtmp
启动服务
docker run -di --name nginx-rtmp -p 1935:1935 tiangolo/nginx-rtmp

2.3 前端实现

前端采用EasyPlayer播放器,功能强大

github地址

3.4 总结

缺点:使用RTMP协议,改协议采用的adobe Systems 公司的 Flash 播放器,因此浏览器要安装flash插件
优点:延时可控制在三秒左右

3.方案二:采用HTTP-FLV实现

使用JavaCV开发的rtsp流转rtmp流并进行推流到nginx,采用nginx-http-flv将RTMP流装换成HTTP-FLV格式,采用B站flv.js前端实现

3.1 将rtsp流转rtmp流并进行推流的流媒体服务(与方案一一致)

3.2使用nginx-http-flv接收java程序的推流

安装nginx,在dockerhup搜索nginx-http-flv,找到对应版本
下载docker镜像
docker pull mugennsou/nginx-http-flv
启动服务
docker run -di --name nginx-flv -p 1935:1935 -p 80:80 mugennsou/nginx-http-flv

3.3 前端实现

前端采用B站大佬写的,flv.js

github地址

3.4 总结

缺点:使用HTTP-FLV协议,延时问题严重,单页面多画面会卡顿!需要持续优化
优点:浏览器无需安装任何插件即可使用

总结

方案一实现较为简单,无需考虑延时问题,方案二需要解决各种延时问题
Logo

欢迎加入西安开发者社区!我们致力于为西安地区的开发者提供学习、合作和成长的机会。参与我们的活动,与专家分享最新技术趋势,解决挑战,探索创新。加入我们,共同打造技术社区!

更多推荐