本项目维护于github:https://github.com/eguid/easyCVjava
一、介绍git
本项目基于javaCV1.4.x。github
其中实现了web
(1)实时视频截图服务(支持rtsp/rtmp/http-flv/hls/file等视频源),图片保存格式支持png/jpeg/jpg/gif等等,支持base64和图片保存两种方式,同时支持两种同时保存/返回。spring
(2)视频录像服务支持rtsp/rtmp/http-flv/hls/file等实时视频或文件录像,支持手动暂停和恢复录制,支持手动开始和结束录制,支持保存mp4/flv/mkv/avi等等录像视频,配合http/ftp服务能够实如今线点播。springboot
(3)web服务使用springboot,仅做为demo使用,并无实现持久化;截图的base64数据和历史记录保存在Map中,图片文件保存在指定路径;录像历史记录保存在map中,文件保存在硬盘。post
截图wbe服务使用8081端口,录像默认使用8082端口。性能
经过访问ip:port/test测试截图和录像,经过ip:post/查看截图录像历史列表(可查看截图,点播录像视频,须要配置http点播服务)测试
二、实现原理优化
(1)截图服务直接使用了javacpp-ffmpeg方式,解决了javaCV的FFmpegGrabber在检索实时视频信息时致使的阻塞问题,同时优化了ByteOutputStream和Base64的转换性能。
(2)录像服务直接使用了javaCV方式,经过实现的固定大小的线程池来提高资源复用率,转封装状况下解决了FFmpegRecorder下推流至rtmp的pts为空的bug。
线程池实现:经过录制器绑定线程方式,在manager层实现了录制器对象池来实现线程复用,录制器做为线程控制器来控制工做线程的开始、暂停、恢复,结束录像的操做。
管理器--->固定大小对象池--->录制器--->工做线程