[TOC]
一、為什么重構?
- 原調用方法過于復雜,使用者需要花時間閱讀代碼、關注插件內部實現,所以需要重構,讓使用者無需關心內部邏輯,輕松實現我們所支持的視頻相關業務。
二、設計構思
將 <u>videoPlayer.js</u>(與C++服務進行交互的方法庫) 和 <u>DHPlayer.vue</u>打成一個DHPlayer.js,非Vue環境下也可使用。兩種引用方式如下:
原生h5下——引入后可直接使用VideoPlayer對象:(Vue下也可如此引用,全局vue對象會自動注冊DHPlayer組件)
<script src="/static/DHPlayer.js"></script>
Vue下:
import DHPlayer from 'static/DHPlayer.js'
Vue.use(DHPlayer)
-
videoPlayer.js
基本功能:
1、窗口初始化:websocket嘗試連接服務,包含成功回調與失敗回調
- 連接規則:目前是對localhost:8000-8004端口進行遍歷連接,如果全都不通就請求打開DHPlayer服務,無論點擊打開還是取消(<font color="red">web無法捕獲</font>),在此過程中都會進行重連,直到連通或1分鐘以后自動刪除重連定時器。
- 成功回調:觸發成功回調,并創建窗口(根據是否需要創建窗口參數,默認需要創建)
- 失敗回調:連續1分鐘無法連接,觸發失敗回調。
- 注:如果創建多個視頻窗口,將會在同一個websocket連接中進行通信,該websocket連接將會作為全局對象綁定到windows上。
2、創建/銷毀窗口、窗口顯示/隱藏、窗口滾動
> 這些基本功能都會獨立的方法,可直接使用,但是一般使用場景(如下)都在內部進行封裝。
- 監聽頁面刷新、銷毀事件,通知服務銷毀窗口。
- 監聽頁面顯隱事件(切換瀏覽器頁簽、最小化瀏覽器等會觸發該事件),通知服務顯隱窗口。
- 監聽瀏覽器窗口的放大縮小、滾動事件,會重新獲取傳入掛載窗口dom節點的位置,通知服務調整窗口位置。
3、錄像回放、實時預覽
- 可通過在初始化的時候傳定義好的type類型,內部根據type來調用發送對應的消息。
4、每個功能都會提供對應的回調方法
傳參params:
為了使用的方便,決定在初始化的時候可以直接傳入所有的參數,使用方法如下:
var oVideoControl = new VideoPlayer({
videoId: 'DHVideoPlayer',
createWindow: true,
connectSuccess: function () {
console.log('ws初始化成功')
},
connectClose: function () {
oVideoControl = null
},
creatSuccess(e) {
console.log(e) //窗口創建成功
}
})
傳參API
參數名 | 類型 | 必傳 | 作用 | 默認值 | |
---|---|---|---|---|---|
videoId | String | 是 | 用戶定義的 video 容器的 id 屬性值 | 無 | |
createWindow | Boolean | 否 | 是否需要初始化創建窗口 | true | |
windowType | Number | 是 | 窗口類型:0-普通預覽,1-普通回放(含分屏、不含時間軸),2-預覽(不含分屏),3-錄像回放(不含分屏、含時間軸) | ||
mount | Boolean | 否 | 掛載方式(true:掛載為瀏覽器子窗口;false:獨立窗口) | true | |
chooseWindow | Number | 否 | 服務支持的選擇窗口功能,不知道什么應用場景,先加上 | ||
num | Number | 否 | 子窗口數量,可選值:1、4、9、16 | 1 | |
showBar | Boolean | 否 | 是否顯示下方控制欄。 true: 顯示, false:隱藏 | true | |
shieldClass | Array | 否 | 遮擋的元素類名數組 | ||
windowParams | Array | 是 | 窗口的對象數組 | [] | |
> path | String | 是 | 視頻url | ||
> snum | Number | 是 | 子窗口編號(從0開始) | ||
> type | Number | 是 | 1-實時視頻,2-錄像回放 | ||
> startTime | Number | 是 | 當前播放的錄像開始時間的時間戳 | ||
> endTime | Number | 是 | 當前播放的錄像結束 | ||
> redirect | Boolean | 是 | 是否重定向 | ||
> records | Array | 是 | 傳值具體需參考大華播放控件開發手冊 | ||
> 其他傳值 | -- | -- | 傳值具體需參考大華播放控件開發手冊 | ||
callback | -------- | -- | 回調方法對象(e: 統一返回ws響應消息體;若沒有觸發回調,可能是插件不支持該功能) | ||
connectSuccess | function(e) | 否 | websocket初始化連接成功回調 | ||
connectError | function(e) | 否 | websocket初始化連接失敗后的回調 | ||
creatSuccess | function(e) | 否 | 創建窗口成功回調 | ||
creatError | function(e) | 否 | 創建窗口失敗回調 | ||
destroySuccess | function(e) | 否 | 銷毀成功回調 | ||
destroyError | function(e) | 否 | 銷毀失敗回調 | ||
playbackSuccess | function(e) | 否 | 錄像回放成功 | ||
playbackError | function(e) | 否 | 錄像回放失敗(返回值沒有 snum,所以不知道哪個失敗,需要c++服務加上) | ||
realTimeSuccess | function(e) | 否 | 實時預覽成功 | ||
realTimeError | function(e) | 否 | 實時預覽失敗(返回值沒有 snum,多窗口所以不知道哪個失敗,需要c++服務加上) | ||
chooseWindowSuccess | function(e) | 否 | 選擇窗口成功 | ||
chooseWindowError | function(e) | 否 | 選擇窗口失敗 | ||
showWindowSuccess | function(e) | 否 | 顯示窗口成功 | ||
showWindowError | function(e) | 否 | 顯示窗口失敗 | ||
hideWindowSuccess | function(e) | 否 | 隱藏窗口成功 | ||
hideWindowError | function(e) | 否 | 隱藏窗口失敗 |
VideoPlayer對象內置屬性
參數名 | 類型(option: 具體參照大華播放控件開發手冊) | 作用 | |
---|---|---|---|
windowState | string | 視頻大窗口狀態(wsPending-websocket正在連接,wsFail-websocket連接失敗, wsSuccess-websocket連接成功, createPending-正在創建窗口, createFail-窗口創建失敗, createSuccess-窗口創建成功) | |
getWindowState | Function(callback) | 獲取所有小窗口的狀態,callback返回ws返回值 | |
getVersion | Function(callback) | 獲取DHPlayer服務版本,callback返回ws返回值 | |
create | Function(option, callback) | 創建視頻窗口 | |
chooseWindow | Function(option, callback) | 選擇視頻窗口 | |
realmonitor | Function(option, callback) | 播放實時視頻 | |
playback | Function(option, callback) | 播放錄像回放 | |
resizePage | Function(option, callback) | 重置窗口位置、大小 | |
showControlBar | Function(show) | 顯示下方控制欄, show: true-顯示,false-隱藏 | |
hide | Function(callback) | 隱藏窗口 | |
show | Function(callback) | 顯示窗口 | |
WindowShield | Function(option: {shieldClass: ['視頻被遮擋的dom節點class']}, callback) | 視頻被遮擋處理 | |
destroy | Function(callback) | 銷毀窗口 |
-
DHPlayer.vue
基于
videoPlayer.js
封裝的的VUE組件,包含 <u>DOM節點</u> 和 <u>基礎方法</u>(目前包含初始化窗口后播放視頻),以及獲取token、對視頻路徑進行token拼接等業務處理。
包含業務
- 判斷本地視頻插件是否安裝(websocket連接1分鐘后還未連接成功,提示安裝插件)
- 比較本地插件與線上的版本,如果本地插件版本低于線上插件,提示更新(在websocket連接成功后拿到版本號,再調brm的獲取插件信息的接口獲取版本號進行比較)【該提示基于ICC框架實現,下載地址為服務器上固定路徑,UI基于ant-design-vue,第三方可自行進行修改。】
- websocket連接成功以后,創建窗口,子窗口數量根據通道個數或者rtsp地址數量進行計算,1(length = 1)、4(1 < length <= 4)、9(4 < length <= 9)、 16(9 < length <= 16)
- 窗口創建成功以后,
- 如果有rtsp路徑傳入(pathList),根據type去調用對應的錄像回放/實時預覽方法加載視頻;
- 如果沒有路徑,需要傳入videoPlayList/realTimeList,根據type并通過傳入的streamType(不傳按照路數判斷,超過4路自動默認輔碼流,不超過默認是主碼流)、channelId 獲取對應的視頻流地址,如果流地址端口為9090端口時,需要重定向(redirect=true),不需要加 token,其他端口均不需要重定向,從獲取rtsp接口中拿到token并拼上。然后再根據type去調用對應的方法加載視頻。
調用方法
<template>
<DHPlayer :type="1" :windowType="0" :realTimeList="realTimeList"/>
</template>
<script>
import DHPlayer from 'DHPlayer'
export default {
data() {
return {
realTimeList: [
{streamType: 1, channelId: '111$120'},
{streamType: 2, channelId: '111$121'}
]
}
}
}
</script>
傳參
參數名 | 類型 | 必傳 | 作用 | 默認值 |
---|---|---|---|---|
videoId | String | 是 | dom節點ID | |
type | Number | 是 | 1-實時視頻,2-錄像回放 | |
num | Number | 否 | 子窗口個數 | 1 |
connectTime | Number | 否 | 嘗試連接事件,默認60s,一定時間連接斷開,并彈出下載插件提示 | 60 |
outContent | Object | 否 | 當前窗口所處可視窗口的位置,比如iframe外部距離瀏覽器的位置 | {} |
videoPlayList | Array | 否 | 包含多個錄像回放對象 | [] |
> ssId | String | 是 | SS服務ID | |
> endTime | String | 是 | 結束時間(時間戳:單位秒) | |
> startTime | String | 是 | 開始時間(時間戳:單位秒) | |
> fileName | String | 是 | 錄像文件信息 | |
> diskId | String | 是 | 磁盤ID | |
> recordSource | Number | 是 | 錄像來源:1=全部,2=設備,3=中心 | |
> recordType | Number | 否 | 錄像類型:0=全部,1=手動錄像,2=報警錄像,3=動態監測,4=視頻丟失,5=視頻遮擋,6=定時錄像,7=全天候錄像,8=文件錄像轉換 | |
> channelId | String | 是 | 通道編碼 | |
> playbackMode | Number | 是 | 回放模式:0=普通回放,1=實時回放 | |
> streamId | String | 是 | 碼流處理 | |
> 一些其他參數(待收集) | String | 是 | wiki無 | |
realTimeList | Array | 否 | 包含多個實時預覽對象 | [] |
> streamType | Number | 否 | 碼流類型:1=主碼流, 2=輔碼流 | 不傳按照路數判斷,超過4路自動默認輔碼流,不超過默認是主碼流 |
> channelId | String | 是 | 通道編碼 | |
> dataType | Number | 否 | 視頻類型:1=視頻, 2=音頻, 3=音視頻 | 1 |
pathList | Array | 否 | 錄像回放/實時視頻路徑列表(實時視頻-string數組['rtsp://xx/'];錄像回放-對象數組[{path:'rtsp://xx/'}],錄像回放傳參如下) | |
> path | String | 是 | 視頻路徑 | |
> endTime | String | 是 | 錄像回放結束時間 | |
> startTime | String | 是 | 錄像回放結束時間 | |
> recordType | String | 是 | 錄像文件類型 0 所有,1 手動錄像,2 報警錄像,3 動態檢測,4 視頻丟失,5 視頻遮擋,6 定時錄像,7 全天候錄像,8 文件錄像轉換,9 普通錄像,11 智能錄像,25 卡號錄像,10 報警開始(匹配協議棧里的定義 10~300 -m -f -c 等特殊報警),1000 智能 報 警 結 束 ( 匹 配 協 議 棧 里 的 定 義300~1000 智能報警) | |
> recordName | String | 是 | 錄像文件名 | |
> fileLength | String | 是 | 單位為 kb | |
windowType | Number | 是 | 窗口類型:0-普通預覽,1-普通回放(含分屏、不含時間軸),2-預覽(不含分屏),3-錄像回放(不含分屏、含時間軸) |