Java 监控直播流rtsp协议转rtmp、hls、httpflv协议返回浏览器
目录
- 一:了解音视频流协议:
- 二:方案一 rtsp 转rtmp
-
- 1、下载nginx + nginx-rtmp-module
- 3、cmd 到nginx根目录启动nginx
- 8、查摄像头的rtsp协议格式
- 10、测试rtmp是否转换成功
- 12、为什么放弃了用rtmp
-
- 四:方案三rtsp 转httpflv(采用)
-
- 1、安装nginx-flv-module
- 4.1 采用java代码去执行ffmepg命令
- 6、前端使用flv.js播放:
-
需求背景:
在做之前的项目的时候有一个对接摄像头实时播放的需求,由于我们摄像头的购买量不是很多,海康威视不给我们提供流媒体云服务器,所以需要我们自己去 一个去满足我们能在浏览器看到监控画面。项目源代码在以前公司没有拷贝就不能复习,最近又在准备面试,所以写了这个博客来复盘和扩展一下,由于我现在没有Liunx,我就用Windows来演示,生产环境还是要使用Liunx,下面这些操作在Liunx也是一样的流程,大家自行百度。
一:了解音视频流协议:
协议 | HttpFlv | RTMP | HLS | Dash |
---|---|---|---|---|
全称 | FLASH VIDEO over HTTP | Real Time Message Protocol | HTTP Living Streaming | |
传输方式 | HTTP长连接 | TCP长连接 | HTTP短连接 | HTTP短连接 |
视频封装格式 | FLV | FLV TAG |
TS文件 | Mp4 3gp webm |
原理 | 同 RTMP ,使用HTTP协议(80端口) |
每个时刻的数据收到后立刻转发 |
集合一段时间的数据,生成TS切片文件(三片),并更新m3u8索引 |
|
延时 | 低 1~3秒 |
低 1~3秒 |
高 5~20秒(依切片情况) |
高 |
数据分段 | 连续流 | 连续流 | 切片文件 | 切片文件 |
Html5播放 | 可通过HTML5解封包播放 (flv.js) |
不支持 | 可通过HTML5解封包播放 (hls.js) |
如果dash文件列表是MP4, webm文件,可直接播放 |
其它 | 需要Flash技术支持,不支持多音频流、多视频流,不便于seek(即拖进度条) |
跨平台支持较差,需要Flash技术支持 |
播放时需要多次请求,对于网络质量要求高 |
二:方案一 rtsp 转rtmp
1、下载nginx + nginx-rtmp-module
nginx:下载地址: Index of /download/
nginx-rtmp-module:nginx 的扩展,安装后支持rtmp协议,下载地址: https://github.com/arut/nginx-rtmp-module
解压nginx-rtmp-module到nginx根目录下,并修改其文件夹名为nginx-rtmp-module(原名为nginx-rtmp-module-master)
2、nginx配置文件
到nginx根目录下的conf目录下复制一份nginx-win.conf 重命名 nginx-win-rtmp.conf
nginx-win-rtmp.conf:
#user nobody; # multiple workers works ! worker_processes 2; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 8192; # max value 32768, nginx recycling connections+registry optimization = # this.value * 20 = max concurrent connections currently tested with one worker # C1000K should be possible depending there is enough ram/cpu power # multi_accept on; } rtmp { server { listen 1935; chunk_size 4000; application live { live on; # 播放时进行回调,如果HttpRespone statusCode不等于200会断开 # on_play http://localhost:8081/auth; } application hls { live on; # 开启hls切片 hls on; # m3u8地址 hls_path html/hls; # 一个切片多少秒 hls_fragment 8s; # on_play http://localhost:8081/auth; # on_publish http://localhost:8081/auth; # on_done http://localhost:8081/auth; } } } http { #include /nginx/conf/naxsi_core.rules; include mime.types; default_type application/octet-stream; #log_format main '$remote_addr:$remote_p