前言
書接上文,上期教程咱們實現了利用FFmpeg將rtsp轉碼爲rtmp,nginx分發,在頁面上播放視頻。可是rtmp也有仍是具備缺陷的,比方說:前端
- rtmp視屏流基於flash才能播放,因此你的電腦必須安裝flash,可是當前各大瀏覽器都準備再也不支持flash
- rtmp視頻流播放仍是具備2-3秒的延遲實現,這對實時告警系統仍是不太理想。
那麼這期教程就搭建一個完整的視頻系統,順便優化一下這兩個問題。node
項目地址
github.com/JackFlyL/no…linux
項目需求
- 多平臺IPC實時播放視頻
- 歷史錄像播放
- 雲臺控制
- 輪詢轉碼任務防止視頻斷連
- node.js實現接口交互
技術架構
上期已經說過怎麼經過腳本建立FFmpeg轉碼命令,這套方案仍是一樣的套路,但不是轉rtmp 經過nginx分發了。轉碼後經過node建立websocket鏈接,客戶端鏈接,動態展現視頻。
技能棧
前端:nginx
- jsmpeg.js (鏈接wbesocket,繪製視頻圖像)
服務端(node):git
- express(靜態服務,接口處理)
- body-parser(處理接口接收數據)
- node-rtsp-stream-jsmpeg (下發FFmpeg指令,建立websocke服務端)
- child_process(啓動shell腳本指令)
其餘:github
- FFmpeg(視頻流轉碼)
- pm2(node進程守護)
- 雲臺控制程序(經過視頻廠家提供的sdk二次開發,經過ajax調用)
服務端
- 定時查殺FFmpeg進程,websocket後重啓防止視頻斷開鏈接
客戶端
使用jsmpeg.js 指定websocket地址和dom就能夠愉快的播放啦!
pm2進程守護
- linux安裝node和npm
- npm install pm2 -g
- pm2 start xx.js (啓動)
- pm2 stop xx.js (中止)
- pm2 list (服務列表)
- pm2 log (日誌輸出)
- pm2 monit (服務監控)
這大概就是經常使用的幾個命令,很是簡單好用的pm2 詳細的能夠去官網看看
看一下效果
總結
到此爲止,咱們就用node全棧實現了一個簡單工的是視頻平臺,優勢:
- 同時預覽來自海康,大華等能生產rtsp流的IPC視頻和錄像。
- 不須要安裝任何插件
- 不依賴flash播放視頻
- 視頻延時縮小到1s內
固然也有一些已知問題:
- 主碼流轉碼時性能消耗巨大(每一個邏輯cpu佔用率達到120左右,因此儘可能使用子碼流轉碼,性能消耗大概是20)
- 歷史視頻流轉碼只支持海康(部分nvr不支持歷史rtsp錄像輸出)
- 前端jsmpeg 鏈接websocket 頻繁切換會致使內存溢出,刷新後正常顯示
- 視頻沒有聲音
最後,若是項目需求 對錄像以及聲音沒有要求的話這套方案仍是很是不錯的,它具有很是良好的兼容性,移動端pc端基本都沒什麼限制,其次延遲也比較理想,畢竟通過轉碼處理,確定比不上源視頻,可是目前他的延遲時間應該算的上是理想的了。