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