本id最近又有个头疼的功能某个产业园有100多个监控设备。想要同时投放的商务楼的大屏上。一下是客户提供的资料:
1.摄像头100多,
2.大屏做个类似自动轮播,每次18个画面,
3.监控协议是rtsp推流。
4.监控H265编码
本id是第一次做这个实时播放,晚上找里很多资料,发现不少问题如下:
1.rtsp协议需要转化http
2.每次轮动18画面,浏览器只支持6路视频,需要nginx做个中转,最少3个端口.
3.2K像素转码延时问题。
4.H265编码问题
要解决上面问题,排除网上那些websoket,vcl播放器,某些视频插件之类的,我已经不想吐槽了,
websoket那些本质还是做rtsp协议转码成前端支持的协议,vcl更不用说了只支持ie浏览器早都闭了。一些视频插件还是收费的,不过用p股想也知道本质还是走的接流,转码推流。
透过现象看本质,转码是唯一的出路。呵呵~
总体流程
1.首先引入javacv
2.H265编码找客户商量改成H264。不同意就算了,自己转
3.FFmpegFrameGrabber拉取rtsp协议视频流
4.如果是H265,再用FFmpegFrameRecorder转成http协议的flv视频和H264编码
5.不要问为什么不m8u3切片之类的,用了就知道取舍
6.服务器内存32G,cpu8核心
按照这个思路,恭喜你半成品完成了,请看cpu
最后就是性能调优。前面已经说过了,H265编码改成H264编码就不用转码,直接拉流推流,cpu无需考虑了。否则按一下步骤
1.只抓关键帧FFmpegFrameRecorder.setVideoOption(“skip_frame”, “nokey”);
2.像素调低一点recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
3.放大招,用辅路拉流,众所周知摄像头分为主码流,辅码流。
附上代码资源需要的下载