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

一、 視頻下載
視頻下載比較簡單,廠商都提供了針對JAVA集成SDK 的DEMO, 照著抄一抄就可以, JAVA呼叫C庫的SDK,一般使用JNA技術,一些細節問題
1. 下載的檔案名要唯一,避免相互覆寫,可以用GUID隨機生成,
2. 注意通道號正確,海康的通道號不是從0開始, 要根據設備資訊取得,起始的數字通道號,多數是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
原理簡介:
四、 其他
至此,把下載好,轉換好的視頻檔案,放在正確的nginx檔案服務目錄下,瀏覽器中輸入檔案url路徑,應該就能正常的回放視頻了,
還有一些其他細節
1. 可能需要考慮硬體及網路的擴容, 視頻存盤需要較大的空間, 可能需要考慮存盤擴容, 網路甚至,分布式檔案系統等,下載大量視頻的帶寬占用也不能忽視, 可能需要擴容網路帶寬,
存盤及帶寬的占用,需要根據碼率需求及預設的場景進行估算,(注意碼率及帶寬單位通常是bit 不是Byte)
2. 跨系統除錯可能會用到Java 的遠程除錯,以下在8000埠開放了遠程除錯,
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar test.jar
最后 !2022國慶快樂 !
本文來自博客園,作者:鍋叔
轉載請注明原文鏈接:https://www.cnblogs.com/uncleguo/p/16741261.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/510660.html
標籤:Java
