大華??礜VR錄像JAVA下載及WEB播放

近期在處理一個將NVR錄像機上的錄像下載到服務器并通過瀏覽器播放的需求 。梳理記錄下過程,做個備忘,同時遇到的一些細節問題解決,也供需要的同學參考 。
需求比較簡單,就是把指定時間段的錄像上傳到服務器保存,并且允許用戶通過web頁面web瀏覽器,進行播放,并且可以拖動控制播放進度 。效果如 。

大華??礜VR錄像JAVA下載及WEB播放

文章插圖
一、 視頻下載
視頻下載比較簡單,廠商都提供了針對JAVA集成SDK 的DEMO,照著抄一抄就可以 。JAVA調用C庫的SDK,一般使用JNA技術 。一些細節問題
1. 下載的文件名要唯一,避免相互覆蓋,可以用GUID隨機生成 。
2. 注意通道號正確,??档耐ǖ捞柌皇菑?開始,要根據設備信息取得 , 起始的數字通道號,多數是33 。數字通道D1其實對應的channel ID 應該是33.
3. JNA調用 發生在 原生的異常會導致整個進程終止,最好不要在主要的服務進程直接通過JNA集成第三方SDK 。
4. 生產部署別忘了復制SDK依賴的原生*.so庫
二、 轉換處理
下載后的視頻格式問題 。
通俗說的音視頻格式如 MP4,MP3等 , 其實并不嚴謹 。.mp4其實是指封裝格式,此封裝格式支持多種音視頻編碼格式 。mp4 封裝格式可以支持的視頻編碼格式如 h264,h265,  音頻格式如 PCM , aac等 。
目前主流web 瀏覽器,支持良好的視頻編碼格式是H264, 音頻格式是aac 。這也就是我們轉換的目標 。
而源錄像的編碼格式視頻格式多數可以在NVR中設置,目前主流的是H265.(相較于H264壓縮比更高 ,  解碼需要的計算資源也更高),音頻編碼是PCM 。
 ffmpeg 是一個開發中經常用到的音視頻處理程序,經過測試 , 其轉換H265編碼 至 H264編碼,還是相當耗時的,時效性基本在生產中無法接受 ,  轉換音頻編碼效率較高 。
因此此處建議的方案是, 將NVR的視頻編碼格式直接指定為H264,這樣視頻流編碼就不需要經過轉換了
以下通過 ffmpeg 將 a.dav 文件中的 視頻編碼保持編碼格式,音頻格式轉換為 aac編碼,同時使用 mp4容器封裝 。
ffmpeg -i a.dav  -c:v copy -c:a aac 264.mp4* ffmpeg 如需將h265 轉碼 h264 ,是需要一個編譯時額外額外開啟 libx264 支持的, 直接copy  則不需要 。
三、 偽流媒體服務
播放線上視頻的幾種方案, 1,下載后本地播放, 2,偽流媒體 3,流媒體 。以下為個人大致理解,未必準確
1. 需要下載這個文件完成后,才能夠播放 。
3. 如HLS協議等,切片較小 ??茨睦锵履睦?,下載的視頻片段都是完整可播放的,可以實時直播(邊產生,邊播放)
2. 看哪里從哪里開始下載 。服務器根據瀏覽端傳入的參數,將視頻文件定位到對應位置后的內容傳輸至瀏覽器解碼播放 。不能實時直播?(我猜 。。)
根據下載視頻保存 , 及在線觀看的需求,第二種方案比較適合 。但是是需要服務器支持的 。 這里使用了nginx 做文件服務器,編譯時,啟用mp4模塊
相關信息:http://nginx.org/en/docs/http/ngx_http_mp4_module.html
原理簡介:
大華??礜VR錄像JAVA下載及WEB播放

文章插圖
 四、 其他
至此,把下載好,轉換好的視頻文件,放在正確的nginx文件服務目錄下,瀏覽器中輸入文件url路徑,應該就能正常的回放視頻了 。
還有一些其他細節
1. 可能需要考慮硬件及網絡的擴容,視頻存儲需要較大的空間, 可能需要考慮存儲擴容, 網絡甚至,分布式文件系統等 。下載大量視頻的帶寬占用也不能忽視,可能需要擴容網絡帶寬 。
存儲及帶寬的占用,需要根據碼率需求及預設的場景進行估算 。(注意碼率及帶寬單位通常是bit 不是Byte)
2. 跨系統調試可能會用到Java 的遠程調試 。以下在8000端口開放了遠程調試,
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar  test.jar最后  !2022國慶快樂?。?
【大華??礜VR錄像JAVA下載及WEB播放】

    推薦閱讀