# byskplayer.js API

### 兼容性

`byskplayer.js` 不支持IE浏览器，因 `byskplayer.js` 使用了 `ES6` 的特性，推荐使用 Chrome浏览器

### Demo

- 在线访问demo

- 下载demo

### 注意事项

- demo需要部署到web容器中运行, 如: 使用 `nginx` 部署, 然后使用http(s)在浏览器中访问

  - 在浏览器通过文件协议访问(即直接使用浏览器打开文件)的方式没有经过测试, 可能会有问题

- 如果 `H265` 视频使用 `webgl` 的方式播放:

  - `bsjlib` 目录需要部署到网站的根目录下, 因为 `bsjlib` 目录下的文件是通过绝对路径(如: `/bsjlib/Decoder.worker.bee2ba95.js` )访问的

  - 使用 `Vue2` / `Vue3` 开发需要放到静态资源目录下(如: `static`, `public` 目录 )

    `vue2` `webpack` 老项目开发环境需要添加代理 `bsjlib` 到 `static/bsjlib` 下

    打包需要将 `static/bsjlib` 拷贝到根目录下

  - 在 `network` 中, 如果 `bsjlib/libbsjdecoder.wasm` 文件出现 `404`, 请检测 `bsjlib` 是否放置到项目根目录, 或者检测服务器是否允许访问 `wasm` 文件, 如: `nginx` 添加 `MIME` 类型 `application/wasm wasm`

- `byskplayer.js` 是已经压缩过的了, 请不要重复打包压缩

### 在本地快速体验 Demo

> 需要提前安装 nodejs, 下载地址: https://nodejs.org/en/download/prebuilt-installer

- 在本地新建目录 `player-demo`, 然后下载 demo 到本地, 目录可以任意命名

- 将下载的 demo 解压到 `player-demo` 目录

- 在 `player-demo` 的位置打开命令行(cmd)

- 在命令行中执行 `npx http-server -p 4409`, 端口可设置

- 在浏览器中通过 http://localhost:4409/demo.html 快速访问 demo

> 使用其他 `http服务器软件` 也可实现上述的效果, 比如: `nginx`, `iis` 等, 请根据需要选择自己熟悉的方式

### 引入

- 下载直接引入：

      <script src='./byskplayer.js'></script>

- `import byskplayer from './byskplayer.js'`

  > 使用 `Vue2` / `Vue3` 开发需要放到静态资源目录下(如: `static`, `public` 目录 )

  > `vue2` `webpack` 老项目需要添加代理

      xxxxxxxxxx// 在 `config/index.js` 配置代理// dev 开发环境通过代理 `/bsjlib` 访问 `static/bsjlib`proxyTable: {    '/bsjlib': {        target: `http://localhost:${ process.env.PORT || 8080 }`,        pathRewrite: {          '/bsjlib': '/static/bsjlib'        }      }}

      ​x// 在 `build/webpack.prod.conf.js` 中配置拷贝目录// 打包 线上生产环境通过将 `static/bsjlib` 目录拷贝到根目录下// copy bsjlibnew CopyWebpackPlugin([{  from: path.resolve(__dirname, '../static/bsjlib'),  to: 'bsjlib',  ignore: ['.*']}])
      // 或者收到将 bsjlib 目录拷贝的网站的根目录

> 通过 import 的方式引入, 需要保证 byskplayer.js 不会被压缩打包

> 如果遇到相关问题, 可以尝试通过配置 babel-loader 的 exclude 属性, 将 byskplayer.js 排除

### 接口

`byskplayer.js` 通过在 `window` 对象上公开 `byskplayer` 类导出所有接口

构造函数：

- new byskplayer()

实例属性：

- player.version

- player.poster

- player.autoCloseTime

- player.real

- player.record

实例方法：

- player.destroy()

- player.setPlayerNum()

- player.allocate()

- player.real.open()

- player.real.close()

- player.real.openSpeak()

- player.real.closeSpeak()

- player.record.query()

- player.record.open()

- player.record.close()

- player.record.pause()

- player.record.play()

- player.ftp.downloadToServer()

- player.ftp.cancel()

- player.ftp.downloadFile()

- player.gaDownload.downloadFile()

- player.gaDownload.cancel()

### new byskplayer()

    xxxxxxxxxxlet player = new byskplayer(config): byskplayer;

根据 `config` 创建 `byskplayer` 实例

> 注意: 请先确认 container 元素已经渲染出来后, 再实例化 player

config

Field | Type | Description
--- | --- | ---
`id` | `string` | 视频播放器容器元素Id, 先保证已经渲染完成
`isReal` | `boolean` | 指定是否是实时播放
`isRecord` | `boolean` | 指定是否是回放视频
`userId` | `string` | 用户Id
`userkey` | `string` | 应用key(客户代码)
`userLevel` | `number` | 用户级别，默认1,(开放平台无效)
`baseURL` | `string` | 视频服务的 `WebSocket` 地址
`isSwitchCodetypeOnFullscreen?` | `boolean` | 可选，视频全屏是否高标清切换，默认:`false`
`click?` | `function` | 可选，视频播放器点击回调，参见 click
`playstart?` | `function` | 可选，视频开始播放回调，参见 playstart
`playend?` | `function` | 可选，视频结束播放回调，参见 playend

click

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`plate?` | `string` | 可选，车牌号
`vehicleId?` | `number` | 可选，车辆Id
`groupId?` | `number` | 可选，车辆所属车组Id

playstart

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`plate?` | `string` | 可选，车牌号
`vehicleId?` | `number` | 可选，车辆Id
`groupId?` | `number` | 可选，车辆所属车组Id

playend

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`plate?` | `string` | 可选，车牌号
`vehicleId?` | `number` | 可选，车辆Id
`groupId?` | `number` | 可选，车辆所属车组Id

`status` 状态定义说明

    xxxxxxxxxx * 0: 请求失败； * 1: 请求成功 * -1: 设备备没有响应，网关返回设备响应超时 * -2: 设备不在线 * -3: 设备录像查询，当前有用户在查 * -4: 设备回放有其他高级级别用户再看 * -6: 设备欠压 * -7: 设备休眠 * -8: 设备唤醒中 * -101: WebSocket未连接 * -102: 请求超时

### player.version

    xxxxxxxxxxlet version = player.version

获取 `byskplayer.js` 版本（只读）

### player.poster

    xxxxxxxxxxplayer.poster = 'https://www.exmaple.com/static/images/video_poster.png';

设置视频播放器预览图片（只写）

### player.autoCloseTime

    xxxxxxxxxxplayer.autoCloseTime = 15;

设置自动关闭视频时间(分钟)，从给 `autoCloseTime` 赋值开始计时，为 `0` 则不自动关闭视频（只写）

### player.real

    xxxxxxxxxxlet real = player.real;

通过 `player.real` 控制实时视频播放，参见 `player.real.open` 和 `player.real.close` 方法

### player.record

    xxxxxxxxxxlet record = player.record;

通过 `player.record` 控制回放视频播放，参见 `player.record.query`，`player.record.open` 和 `player.record.close` 方法

### player.destroy()

    xxxxxxxxxxplayer.destroy();

通过调用该方法销毁播放器，销毁后将不能再使用其它功能

### player.setPlayerNum()

    xxxxxxxxxxplayer.setPlayerNum(num);

Parameter | Type | Description
--- | --- | ---
`num` | `number` | 期望显示播放画面数，最小值：`1`，最大值：`16`

切换视频播放器显示的画面数，支持同时显示 `1` 至 `16` 个画面

### player.allocate()

    xxxxxxxxxxplayer.allocate(num, start = 0);

Parameter | Type | Description
--- | --- | ---
`num` | `number` | 期望申请播放视频数量：[1, 2, 4, 6, 8, 9, 12, 13, 16]
`start？` | `number` | 可选，申请播放器开始位置，默认为：`0`，最大位置：`15`

申请需要播放视频的播放器Id，支持同时申请 `1` 至 `16` 个播放器

返回对象：

Field | Type | Description
--- | --- | ---
`flag` | `boolean` | 申请成功标志，`0`：失败，`1`：成功
`msg` | `string` | 提示信息
`ids?` | `array` | 申请播放器元素Id数组，申请失败则不返回

### player.real.open()

请求播放实时视频

    xxxxxxxxxxplayer.real.open(tid, params, cb);

Parameter | Type | Description
--- | --- | ---
`tid` | `string` | 视频播放器Id，通过 `player.allocate` 申请到的
`params` | `object` | 播放参数，参见 params
`cb` | `function` | 可选，请求视频播放回调，参见 cb

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`protocolType` | `number` | 协议类型，`1`：GF-1078,GB-1078;`2`：GA系列
`SpecialSign` | `number` | 特殊协议，`0`：不处理;`1`：粤标
`codeTypeCtrlBtnEnabled` | `boolean` | 是否现在高标清切换按钮（GF才能使用）
`playerType` | `number` | `0`: `video`(默认), `1`: `webgl`
`plate?` | `string` | 可选，车牌号
`vehicleId?` | `number` | 可选，车辆Id
`groupId?` | `number` | 可选，车辆所属车组Id

cb

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`plate?` | `string` | 可选，车牌号
`vehicleId?` | `number` | 可选，车辆Id
`groupId?` | `number` | 可选，车辆所属车组Id
`status` | `number` | 请求响应状态，`0`：失败，`1`：成功，`-2`：设备不在线
`info` | `string` | 响应信息

### player.real.close()

停止播放实时视频

    xxxxxxxxxxplayer.real.close(tid, params, cb);

Parameter | Type | Description
--- | --- | ---
`tid` | `string` | 视频播放器Id，通过 `player.allocate` 申请到的
`params` | `object` | 播放参数，参见 params
`cb` | `function` | 可选，请求视频播放回调，参见 cb

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`protocolType` | `number` | 协议类型，`1`：GF-1078,GB-1078;`2`：GA系列

cb

Field | Type | Description
--- | --- | ---
`status` | `number` | 请求响应状态，`0`：失败，`1`：成功
`info` | `string` | 响应信息

### player.real.openSpeak()

打开对讲

    xxxxxxxxxxplayer.real.openSpeak(params, cb);

Parameter | Type | Description
--- | --- | ---
`params` | `object` | 参数，参见 params
`cb` | `function` | 可选，请求视频播放回调，参见 cb

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`protocolType` | `number` | 协议类型，`1`：GF-1078，`2`：GA系列
`SpecialSign` | `number` | 特殊协议，`0`：不处理;`1`：粤标

cb

Field | Type | Description
--- | --- | ---
`status` | `number` | 请求响应状态，`0`：失败，`1`：成功，`-2`：设备不在线
`info` | `string` | 响应信息

### player.real.closeSpeak()

关闭对讲

    xxxxxxxxxxplayer.real.closeSpeak(params, cb);

Parameter | Type | Description
--- | --- | ---
`params` | `object` | 参数，参见 params
`cb` | `function` | 可选，请求视频播放回调，参见 cb

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`protocolType` | `number` | 协议类型，`1`：GF-1078，`2`：GA系列

cb

Field | Type | Description
--- | --- | ---
`status` | `number` | 请求响应状态，`0`：失败，`1`：成功
`info` | `string` | 响应信息

### player.record.query()

查询回放录像视频记录

    xxxxxxxxxxplayer.record.query(params, cb);

Parameter | Type | Description
--- | --- | ---
`params` | `object` | 播放参数，参见 params
`cb` | `function` | 请求视频播放回调，参见 cb

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`protocolType` | `number` | 协议类型，`1`：GF-1078,GB-1078;`2`：GA系列
`begintime` | `number` | 查询开始时间（时间戳精确至秒）
`endtime` | `number` | 查询结束时间（时间戳精确至秒）
`alarmSign` | `number` | 报警类型，目前指定为 `0`

cb

Field | Type | Description
--- | --- | ---
`channel` | `number` | 通道号
`status` | `number` | 请求播放状态，`0`：失败，`1`：成功
`info` | `string` | 响应信息
`records` | `number` | 查询到视频记录总数
`recordfiles` | `array` | 查询到的视频记录, 参见 recordfile

recordfile

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`begintime` | `number` | 视频录像开始时间（时间戳精确至毫秒）
`endtime` | `number` | 视频录像结束时间（时间戳精确至毫秒）
`filesize` | `number` | 录像大小（字节）
`alarmSign` | `number` | 报警类型，目前指定为 `0`
`fileName` | `number` | 视频文件名称（`GA系列有效` `播放视频时需要指定`）

### player.record.open()

请求播放回放视频

    xxxxxxxxxxplayer.record.open(ret.ids[0], params, cb, mds);

Parameter | Type | Description
--- | --- | ---
`tid` | `string` | 视频播放器Id，通过 `player.allocate` 申请到的
`params` | `object` | 播放参数，参见 params
`cb` | `function` | 可选，请求视频播放回调，参见 cb
`mds` | `object` | `GB-0178` 必填,其他可选，参见 mds

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`protocolType` | `number` | 协议类型，`1`：GF-1078,GB-1078;`2`：GA系列
`SpecialSign` | `number` | 特殊协议，`0`：不处理;`1`：粤标
`playerType` | `number` | `0`: `video`(默认), `1`: `webgl`
`begintime` | `number` | 视频录像开始时间（时间戳精确至秒）
`endtime` | `number` | 视频录像结束时间（时间戳精确至秒）
`fileName` | `string` | 视频文件名称（ `GA系列有效`）
`datatype?` | `number` | `GB-1078` 必填 `0`
`plate?` | `string` | 可选，车牌号
`vehicleId?` | `number` | 可选，车辆Id
`groupId?` | `number` | 可选，车辆所属车组Id

cb

Field | Type | Description
--- | --- | ---
`tid` | `number` | 播放器Id
`device` | `number` | 终端号
`channel` | `number` | 通道号
`plate?` | `string` | 可选，车牌号
`vehicleId?` | `number` | 可选，车辆Id
`groupId?` | `number` | 可选，车辆所属车组Id
`status` | `number` | 请求播放状态，`0`：失败，`1`：成功，`-2`：设备不在线
`info` | `string` | 响应信息

mds

Field | Type | Description
--- | --- | ---
`hasAudio` | `boolean` | `GB-1078` 需音视频分离必填 `false`；其他不填

### player.record.close()

停止播放回放视频

    xxxxxxxxxxplayer.record.close(tid, params, cb);

Parameter | Type | Description
--- | --- | ---
`tid` | `string` | 视频播放器Id，通过 `player.allocate` 申请到的
`params` | `object` | 播放参数，参见 params
`cb` | `function` | 可选，请求视频播放回调，参见 cb

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`protocolType` | `number` | 协议类型，`1`：GF-1078，`2`：GA系列

cb

Field | Type | Description
--- | --- | ---
`status` | `number` | 状态，`0`：失败，`1`：成功
`info` | `string` | 响应信息

### player.record.pause()

暂停播放视频

    xxxxxxxxxxplayer.record.pause(params);

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`protocolType` | `number` | 协议类型，`1`：GF-1078，`2`：GA系列

### player.record.play()

暂停后继续播放视频

    xxxxxxxxxxplayer.record.play(params);

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`protocolType` | `number` | 协议类型，`1`：GF-1078，`2`：GA系列

### player.ftp.downloadToServer()

设备通过FTP下载到服务器（GF-1078设备）

    xxxxxxxxxxplayer.ftp.downloadToServer(params, cb);

Parameter | Type | Description
--- | --- | ---
`params` | `object` | 参数，参见 params
`cb` | `function` | 可选，请求视频播放回调，参见 cb

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`protocolType` | `number` | 协议类型，`1`：GF-1078，`2`：GA系列
`begintime` | `number` | 开始时间（时间戳精确至秒，`>=file.begintime`）
`endtime` | `number` | 结束时间（时间戳精确至秒，`<=file.endtime`）
`alarmSign` | `number` | 通过 `player.record.query` 查询得到

cb

Field | Type | Description
--- | --- | ---
`status` | `number` | 状态，`0`：失败，`1`：成功
`info` | `string` | 响应信息
`serial` | `string` | 设备返回流水号，用于ftp上传控制

### player.ftp.cancel()

取消设备FTP下载到服务器

    xxxxxxxxxxplayer.ftp.cancel(params, cb);

Parameter | Type | Description
--- | --- | ---
`params` | `object` | 参数，参见 params
`cb` | `function` | 可选，请求视频播放回调，参见 cb

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`serial` | `string` | 通过 `player.ftp.downloadToServer` 查询得到

cb

Field | Type | Description
--- | --- | ---
`status` | `number` | 状态，`0`：失败，`1`：成功
`info` | `string` | 响应信息

### player.ftp.downloadFile

gt下载到本体

    xxxxxxxxxxplayer.ftp.downloadFile(params, cb);

Parameter | Type | Description
--- | --- | ---
`params` | `object` | 播放参数，参见 params
`cb` | `function` | 可选，下载回调，参见 cb

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`protocolType` | `number` | 协议类型，`1`：GF-1078（固定为1）
`SpecialSign` | `number` | 特殊协议，`0`：不处理;`1`：粤标
`begintime` | `number` | 视频录像开始时间（时间戳精确至秒）
`endtime` | `number` | 视频录像结束时间（时间戳精确至秒）
`fileName` | `string` | 视频文件名称（ `GA系列有效`）
`plate?` | `string` | 可选，车牌号
`vehicleId?` | `number` | 可选，车辆Id
`groupId?` | `number` | 可选，车辆所属车组Id

cb

Field | Type | Description
--- | --- | ---
`tid` | `number` | 播放器Id
`media_address` | `object` | 下载地址
`status` | `number` | 请求播放状态，`0`：失败，`1`：成功，`-2`：设备不在线
`info` | `string` | 响应信息

### player.gaDownload.downloadFile()

通过浏览器设备直接下载到本地（GA设备）

    xxxxxxxxxxplayer.gaDownload.downloadFile(params, cb);

Parameter | Type | Description
--- | --- | ---
`params` | `object` | 参数，参见 params
`cb` | `function` | 可选，请求视频播放回调，参见 cb

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号
`protocolType` | `number` | 协议类型，`1`：GF-1078，`2`：GA系列
`begintime` | `number` | 开始时间（时间戳精确至秒，`>=file.begintime`）
`endtime` | `number` | 结束时间（时间戳精确至秒，`<=file.endtime`）
`fileName` | `number` | 通过 `player.record.query` 查询得到
`filesize` | `number` | `(endtime-begintime）/(file.endtime-file.begintime)*file.filesize`

cb

Field | Type | Description
--- | --- | ---
`status` | `number` | 状态，`0`：失败，`1`：成功
`info` | `string` | 响应信息
`serial` | `string` | 设备返回流水号，用于ftp上传控制

### player.gaDownload.cancel()

取消下载到本地

    xxxxxxxxxxplayer.gaDownload.cancel(params, cb);

Parameter | Type | Description
--- | --- | ---
`params` | `object` | 参数，参见 params
`cb` | `function` | 可选，请求视频播放回调，参见 cb

params

Field | Type | Description
--- | --- | ---
`device` | `number` | 终端号
`channel` | `number` | 通道号

cb

Field | Type | Description
--- | --- | ---
`status` | `number` | 状态，`0`：失败，`1`：成功
`info` | `string` | 响应信息
`media_address` | `object` | 下载地址 `media_address.video_address`