javacv實現實時影片截圖和錄像服務easyCV

  • 2019 年 11 月 1 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/eguid_1/article/details/83345489

本項目維護於github:https://github.com/eguid/easyCV

2019年4月更新:

1、新增兩個springboot+postgre的演示demo

2、去除了corelib錄像API中不合理的持久層介面

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層實現了錄製器對象池來實現執行緒復用,錄製器作為執行緒控制器來控制工作執行緒的開始、暫停、恢復,結束錄像的操作。

管理器—>固定大小對象池—>錄製器—>工作執行緒