本項目維護於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層實現了錄製器對象池來實現線程複用,錄製器做爲線程控制器來控制工做線程的開始、暫停、恢復,結束錄像的操做。
管理器--->固定大小對象池--->錄製器--->工做線程