近期在處理一個將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