[toc]

# 播放器 API

## JessibucaPro(options)

options 支持的参数有：

### container

- **类型**：`DOM` or `string`
- **用法**：

播放器容器。

> 若为 string ，则底层调用的是 document.querySelector(container)

源码

```js

let $container = options.container;
if (typeof options.container === 'string') {
    $container = document.querySelector(options.container);
}
if (!$container) {
    throw new Error('jessibucaPro need container option');
    return;
}

if ($container.nodeName === 'CANVAS' || $container.nodeName === 'VIDEO') {
    throw new Error(`jessibucaPro container type can not be ${$container.nodeName} type`);
    return;
}
```

> container 不能是 video 或者canvas 标签

### videoBuffer

- **类型**：`number`
- **默认值**：`1`
- **用法**： 设置最小缓冲时长，单位秒，播放器会自动消除延迟。

>

### videoBufferDelay（pro）

- **类型**：`number`
- **默认值**：`1`
- **用法**： 设置最大缓冲延迟时长，单位秒，最小不能低于1秒，如果延迟超过该值，就会进行丢帧处理。

### decoder

- **类型**：`string`
- **默认值**：`decoder.js`
- **用法**：

worker地址

> 默认引用的是根目录下面的decoder-pro.js文件 ，decoder-pro.js 与 decoder-pro.wasm文件必须是放在同一个目录下面。

### forceNoOffscreen(废弃)

- **类型**：`boolean`
- **默认值**：true
- **用法**：

是否不使用离屏模式（提升渲染能力）

> 由于目前浏览器兼容性太差，会出现慕名奇妙的错误问题，目前播放器内部禁用离屏渲染。

### useOffscreen（pro）(废弃)

- **类型**：`boolean`
- **默认值**：false
- **用法**：

是否使用离屏模式（提升渲染能力）默认是不开启的

> 主要是为了替代`forceNoOffscreen` 参数使用的。

### hiddenAutoPause

- **类型**：`boolean`
- **默认值**：false
- **用法**：

是否开启当页面的'visibilityState'变为'hidden'的时候，自动暂停播放。

### hasAudio

- **类型**：`boolean`
- **默认值**：true
- **用法**：

是否有音频，如果设置`false`，则不对音频数据解码，提升性能。

### hasVideo（pro）

- **类型**：`boolean`
- **默认值**：true
- **用法**：

是否有视频，如果设置`false`，则不对视频数据解码，只播放音频数据。

### rotate

- **类型**：`number`
- **默认值**：0
- **用法**：

设置旋转角度，支持，0(默认) ，90，180，270 四个值。

### isResize

- **类型**：`boolean`
- **默认值**：`true`
- **用法**：

1. 当为`true`的时候：视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边。 等同于 `setScaleMode(1)`
2. 当为`false`的时候：视频画面完全填充canvas区域,画面会被拉伸。等同于 `setScaleMode(0)`

### isFullResize

- **类型**：`boolean`
- **默认值**：`false`
- **用法**：

1. 当为`true`
   的时候：视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全。等同于 `setScaleMode(2)`

### isFlv

- **类型**：`boolean`
- **默认值**：`false`
- **用法**：

1. 当为`true`的时候：ws协议不检验是否以.flv为依据，进行协议解析。

### debug

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： 是否开启控制台调试打印

### debugLevel（pro）

- **类型**：`string`
- **默认值**：`warn`
- **用法**：

debug模式下的日志级别，支持`debug`、`warn`，默认是`warn`

### isMulti（pro）

- **类型**：`boolean`
- **默认值**：`false`
- **用法**：

当多路播放的时候，可以配置起来，这样在看日志的时候，会有一个uuid来区分。

> 该参数只有在 debug:true 模式下才会生效

### timeout

- **类型**：`number`
- **默认值**：`10`
- **用法**：

1. 设置超时时长, 单位秒
2. 在连接成功之前(loading)和播放中途(heart),如果超过设定时长无数据返回,则回调timeout事件

> 不推荐使用，只是为了兼容v2版本的参数，推荐使用`loadingTimeout`和`heartTimeout` 参数，单独配置。

### heartTimeout

- **类型**：`number`
- **默认值**：`10`
- **用法**：

1. 设置超时时长, 单位秒
2. 播放中途,如果超过设定时长无数据返回,则回调timeout事件

### heartTimeoutReplay

- **类型**：`boolean`
- **默认值**：`true`
- **用法**： 是否开启心跳超时之后自动再播放

> heartTimeout 心跳超时之后自动再播放,不再抛出异常，而直接重新播放视频地址。

### heartTimeoutReplayTimes

- **类型**：`number`
- **默认值**：`3`
- **用法**： heartTimeoutReplay 重试次数

> heartTimeoutReplay 重试失败之后，不再重新播放视频地址。

> 是整个生命周期中重试的次数。

> 如果想无限次重试，可以设置为-1。

### loadingTimeout

- **类型**：`number`
- **默认值**：`10`
- **用法**：

1. 设置超时时长, 单位秒
2. 在刚开始播放的时候，在连接成功之前,如果超过设定时长无数据返回,则回调timeout事件

### loadingTimeoutReplay

- **类型**：`boolean`
- **默认值**：`true`
- **用法**： 是否开启loading超时之后自动再播放

> loadingTimeout 心跳超时之后自动再播放,不再抛出异常，而直接重新播放视频地址。

### loadingTimeoutReplayTimes

- **类型**：`number`
- **默认值**：`3`
- **用法**： loadingTimeoutReplay 重试次数

> loadingTimeoutReplay 重试失败之后，不再重新播放视频地址。

> 如果想无限次重试，可以设置为-1

### supportDblclickFullscreen

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： 是否支持屏幕的双击事件，触发全屏，取消全屏事件。

### showBandwidth

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： 是否显示网速

### showPerformance（pro）

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： 是否显示性能面板

### operateBtns

- **类型**：`object`

- **用法**： 配置底部操作按钮

1. fullscreen 是否显示全屏按钮
2. screenshot 是否显示截图按钮
3. play 是否显示播放暂停按钮
4. audio 是否显示声音按钮
5. record 是否显示录制按钮
6. ptz 是否显示PTZ轮盘按钮（pro）
7. quality 是否显示清晰度按钮（pro）
8. close 是否显示关闭按钮（pro）
9. zoom 是否显示电子放大（pro）
10. scale 是否显示sacle按钮（pro）
11. performance 是否显示性能按钮（pro）
12. face 是否显示人脸识别按钮（pro）
12. fullscreenFn 绑定全屏按钮的自定义方法（pro），如设置了，点击全屏按钮的时候触发。
15. fullscreenExitFn 绑定退出全屏按钮的自定义方法（pro），如设置了，点击退出全屏按钮的时候触发。
13. screenshotFn 绑定截图按钮的自定义方法（pro），如设置了，点击截图按钮的时候触发。
14. playFn 绑定播放按钮的自定义方法（pro），如设置了，点击播放按钮的时候触发。
16. pauseFn 绑定暂停按钮的自定义方法（pro），如设置了，点击暂停按钮的时候触发。
17. recordFn 绑定录制按钮的自定义方法（pro），如设置了，点击录制按钮的时候触发。
18. recordStopFn 绑定停止录制按钮的自定义方法（pro），如设置了，点击停止录制按钮的时候触发。

### qualityConfig（pro）

- **类型**：`array`
- **默认值**：`[]`
- **用法**： 配置清晰度 ，例如 `['普清', '高清', '超清', '4K', '8K']`

> 点击回调的参数为当前清晰度的值，比如点击了`高清`，回调的参数就是`高清`。

### defaultStreamQuality（pro）

- **类型**：`string`
- **默认值**：``
- **用法**： 默认显示的清晰度，如果不设置，会显示第一个清晰度

### watermarkConfig（pro）

- **类型**：`object | array`
- **默认值**：`{}`
- **用法**： 配置播放器播放过程中水印显示，支持`图片`和`文字`和`矩形边框`和`自定义HTML`

支持`单个对象` 或者 `数组`

支持的参数有：

```
{
    left: '', //
    right: '', //
    top: '', //
    bottom: '', //
    opacity: 1, // 透明度
    backgroundColor:''// 背景颜色 同css backgroundColor
    // 图片配置
    image: {
        src: '',
        width: '100',
        height: '60'
    },
    // 文字配置
    text: {
        content: '',
        fontSize: '14',
        color: '#000'
    },
    // 矩形边框
    rect:{
            color: '',
            lineWidth: 2,
            width: '',
            height: ''

    },
    // 自定义html
    html: ''
}
```

#### 图片配置

支持 url 或者 base64 格式

```

{
    watermarkConfig: {
        image: {
            src: 'data:image/png;base64, ',
            width:150,
            height:48
        },
        right: 10,
        top:10
    }

}
```

```
{
    watermarkConfig: {
        image: {
            src:"http://jessibuca.monibuca.com/jessibuca-logo.png",
            width:150,
            height:48
        },
        right: 10,
        top:10
    }
}
```

#### 文字配置

```

{
    watermarkConfig:{
        text:{
            content:'jessibuca-pro',
                fontSize:'14',
                color:'#000'
        },
        right: 10,
        top:10,
        left:10,
        bottom:10
    }

}
```

#### 矩形边框
```

{
    watermarkConfig:{
        rect:{
            color: 'red',
            lineWidth: 2,
            width: '100',
            height: '200'
        },
        right: 10,
        top:10,
        left:10,
        bottom:10
    }

}
```

#### HTML

```

{
    watermarkConfig:{
        html:'<div>this is a <span style='color:red'>test</span> html</div>',
        right: 10,
        top:10,
        left:10,
        bottom:10
    }

}
```

> 在单个配置项上面：优先级 image > text > rect > html


#### 多个水印配置

配置成数组就可以支持多个水印效果。

```

{
    watermarkConfig:[
        {
            html:'<div>this is a <span style='color:red'>test</span> html</div>',
            right: 10,
            top:10,
            left:10,
            bottom:10
        },
        {
            text:{
                content:'jessibuca-pro',
                    fontSize:'14',
                    color:'#000'
            },
            right: 10,
            top:10,
            left:10,
            bottom:10
        }
    ]

}
```



### keepScreenOn

- **类型**：`boolean`
- **默认值**：`true`
- **用法**： 开启屏幕常亮，在手机浏览器上, canvas标签渲染视频并不会像video标签那样保持屏幕常亮。

> 只会在移动端生效，默认开启。

### isNotMute

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： 是否开启声音，默认是关闭声音播放的。

> 是否不是静音 = 是否开启声音

> 配置了不一定会生效，因为浏览器的限制，只有在用户主动触发事件后才能播放声音。

### loadingIcon

- **类型**：`boolean`
- **默认值**：`true`
- **用法**： 加载过程中的时候，是否显示加载icon。

### loadingText

- **类型**：`string`
- **默认值**：``
- **用法**： 加载过程中文案。

### background

- **类型**：`string`
- **默认值**：``
- **用法**： 播放前的背景图片。

### backgroundLoadingShow

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： 如果配置了`background`参数，在loading 过程中的时候还继续显示`background`配置的图片。

### useMSE

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： 是否开启MediaSource硬解码

> 视频编码只支持H.264视频（Safari on iOS不支持）

> 不支持 forceNoOffscreen 为 false (开启离屏渲染)

> 优先级高于useWCS:true

### mseUseCanvasRender（pro）

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： MediaSource硬解码通过canvas播放流数据

> 推荐使用`useCanvasRender` 参数

### hlsUseCanvasRender （pro）

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： hls通过canvas播放流数据

> 推荐使用`useCanvasRender` 参数

### useWCS

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： 是否开启Webcodecs硬解码

> 视频编码只支持H.264视频 (需在chrome 94版本以上，需要https或者localhost环境)

> 支持 forceNoOffscreen 为 false （开启离屏渲染）

> 如果同时设置了useMSE:true, 则优先使用useMSE

### wcsUseVideoRender（pro）

- **类型**：`boolean`
- **默认值**：`true`
- **用法**： Webcodecs硬解码之后通过video播放流数据,仅仅useWCS 为true的时候有效

> 推荐使用 `useVideoRender` 参数

### useSIMD（pro）

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： 是否使用SIMD 软解码，仅仅wasm软解码的时候有效

> 只会在wasm解码的时候才会生效

> 使用Chrome/Edge 91, Firefox89及之后正式提供的SIMD指令集加速解码, 在1080P以上分辨率带来100%-300%的性能提升

> 尤其在HEVC的解码上提升非常明显.

> Safari暂不支持

### wasmUseVideoRender（pro）

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： wasm软解码之后通过video播放流数据，仅仅wasm软解码的时候有效

> 推荐使用 `useVideoRender` 参数

### wasmDecodeErrorReplay（pro）

- **类型**：`boolean`
- **默认值**：`true`
- **用法**： 是否开启解码失败重新播放

> wasm解码报错之后，不再抛出异常，而是直接重新播放视频地址。

### mseDecodeErrorReplay（pro）

- **类型**：`boolean`
- **默认值**：`true`
- **用法**： mse解码报错之后，是否重新播放

> mse解码报错之后，不再抛出异常，而是直接重新播放视频地址。


### wcsDecodeErrorReplay（pro）

- **类型**：`boolean`
- **默认值**：`true`
- **用法**： wcs解码报错之后，是否重新播放

> wcs解码报错之后，不再抛出异常，而是直接重新播放视频地址。

### autoWasm

- **类型**：`boolean`
- **默认值**：`true`
- **用法**： 在使用MSE或者 Webcodecs 播放H265的时候，是否自动降级到wasm模式。

> 在MSE或者WCS解码出现错误的时候，如果配置的`mseDecodeErrorReplay:true`,或者`wcsDecodeErrorReplay:true`的前提下。

> 如果配置了`autoWasm:true`, 则会自动降级到wasm模式播放。

> 在多屏的情况下，如果解码失败，配置了`autoWasm:true`，则会自动降级到wasm模式播放，会加大CPU的负担。

### hotKey

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： 是否开启键盘快捷键

> 目前支持的键盘快捷键有：esc -> 退出全屏；arrowUp -> 声音增加；arrowDown -> 声音减少；

### controlAutoHide

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： 控制栏是否自动隐藏

> 只有鼠标聚焦到播放器内部才会显示，移除之后，会消失。

> 只支持pc端，移动端不生效。

### playbackConfig（pro）

- **类型**：`object`
- **默认值**：`{}`
- **参数**：TF卡流（录像流）播放配置
    - `{array} playList` 底部UI 24小时高亮时间端，如在该时间段内，可触发点击事件
        - `{number} start`  开始时间戳 例如 1653841634 或者 16538416340000
        - `{number} end`  结束时间戳 例如 1653843420 或者 16538434200000
    - `{number} fps`  默认值`25` 渲染FPS(如果不设置，播放器会根据流数据计算出fps),
    - `{number} isCacheBeforeDecodeForFpsRender` 默认值`false` 是否在解码前缓存数据
    - `{boolean} showRateBtn`   默认值 `true` 是否显示倍速播放按钮
    - `{array} rateConfig`   默认值 `[]` 倍速播放配置
        - `{number} value`  倍速播放倍数
        - `{string} label`  倍速播放按钮显示的文字
    - `{boolean} showControl`   默认值 `true` 是否显示底部UI 24小时控制条
    - `{boolean} uiUsePlaybackPause` 默认值 `false`  ui上面是否使用 playbackPause 方法
    - `{boolean } isUseFpsRender` 默认值 `false` 是否使用固定的fps渲染，如果设置的fps小于流推过来的，会造成内存堆积甚至溢出
    - `{boolean } isUseLocalCalculateTime` 默认值 `false` 是否使用本地时间来计算playback时间
    - `{number} localOneFrameTimestamp`  默认值`40` 一帧 40ms, isUseLocalCalculateTime 为 true
      生效。（不适合高倍率I帧渲染的场景,当切换成只解码I帧的时候需要更新这个时间戳）。

- **用法**： TF卡流时间端配置

例如

```js
jessibucaPro.playbackConfig('url', {
    playList: [
        {
            start: 16538416340000,
            end: 16538434200000
        },
        {
            start: 1653881963,// 会自动补齐最后四个0
            end: 1653885397 // 会自动补齐最后四个0
        }
    ],
    fps: 25,
    showControl: true,
    uiUsePlaybackPause: true,
    isCacheBeforeDecodeForFpsRender: false,
    isUseFpsRender: false,
    isUseLocalCalculateTime: false,
    localOneFrameTimestamp: 40
})
```

> 其他不在时间段的区域，显示是表示没有数据段。不绑定点击时间回调事件。其他在时间区域内的区间点击是有事件响应的。

> isCacheBeforeDecodeForFpsRender 为 true 时，会在解码前缓存数据，针对于有些特殊的流，在原本播放器只需要一倍率播放的情况下，
> 但是服务器端推流是2倍或者以上，这种建议设置为true，防止解码之后缓存，导致内存溢出。

### openWebglAlignment (pro)

- **类型**：`boolean`
- **默认值**：`false`
- **用法**： webgl渲染是否每次取1字节的数据，仅在使用canvas 渲染的时候生效。

> 为了解决 视频渲染发绿（软解码）

### playbackForwardMaxRateDecodeIFrame (pro)

- **类型**：`number`
- **默认值**：`4`
- **用法**：录像流播放的时候，当倍率达到多少之后，直接只解码I帧数据。

> 默认是达到4倍率的时候，就直接只解码I帧数据。

### playbackCurrentTimeMove(pro)

- **类型**：`boolean`
- **默认值**：`true`
- **用法**：录像流数据的当前时间是否跟着播放时长移动。

### mirrorRotate(pro)

- **类型**：`string`
- **默认值**：`none`
- **用法**：镜像翻转，支持水平(level)和垂直(vertical)

### useVideoRender(pro)

- **类型**：`boolean`
- **默认值**：`true`
- **用法**：是否使用video标签进行渲染

> 方便一键式配置渲染元素。

### useCanvasRender(pro)

- **类型**：`boolean`
- **默认值**：`false`
- **用法**：是否使用canvas标签进行渲染

> 方便一键式配置渲染元素。

### networkDelay(pro)

- **类型**：`number`
- **默认值**：`10`
- **用法**：单位秒(s), 根据本地时间戳和流播放的时间戳，检测网络播放延迟。

### networkDelayTimeoutReplay(pro)

- **类型**：`boolean`
- **默认值**：`false`
- **用法**：设置网络超时之后，是否重新播放。

> 如果设置为true，那么当网络超时之后，会重新播放。


> 因为这个参数的特殊性，如果配置 `false` 并不会暂停播放。 所以如果业务层需要自己做超时处理，则只需要自己监听


```js
// 监听一次（once）即可。
jessibucaPro.once('networkDelayTimeout', () => {
    // do something
})
```

### syncAudioAndVideo（pro）

- **类型**：`boolean`
- **默认值**：`false`
- **用法**：是否根据时间戳来音视频同步。

> 播放器内部默认是根据流的顺序来进行音视频同步播放的。

> 如果设置为`true`，那么就是根据时间戳来进行音视频同步播放的。

### recordType（pro）

- **类型**：`string`
- **默认值**：`mp4`
- **用法**：视频录制默认的格式，支持`webm`和`mp4`。

### ptzClickType（pro）

- **类型**：`string`
- **默认值**：`click`
- **用法**：ptz 操作指令点击事件类型，支持`click` 和 `mouseDownAndUp`

> click 事件 会在点击之后，立即触发ptz arrow事件,300ms之后触发stop事件。
>
> mouseDownAndUp 会在鼠标按下，立即触发ptz arrow事件，鼠标松开，触发stop事件。

### ptzZoomShow（pro）
- **类型**：`boolean`
- **默认值**：`false`
- **用法**：是否显示ptz zoom 按钮


### extendOperateBtns（pro）

- **类型**：`array`
- **默认值**：`[]`
- **参数**：
    - `{string} name`  `必填` 类似uuid 用于区分按钮
    - `{number} index` `选填` 排序字段，默认值 `0`
    - `{string} icon`  `必填` 按钮图标,支持base64 或者src，主要是设置`background-url` 属性
    - `{string} iconHover` `选填` 按钮hover图标,等同于`icon`
    - `{string} iconTitle`  `选填` 按钮图标title
    - `{string} activeIcon`  `选填` 按钮active图标,等同于`icon`
    - `{string} activeIconHover`  `选填` 按钮active hover图标,等同于`icon`
    - `{string} activeIconTitle`  `选填` 按钮active图标title
    - `{function} click` `必填` 按钮点击事件
    - `{function} activeClick` `选填` active 状态下按钮点击事件
- **用法**：添加自定义按钮

```js
{
    extendOperateBtns:[
        {
            name: 'testBtn',
            index: 2,
            icon: '/expand.png',
            iconHover: '/expand-hover.png',
            iconTitle: '测试hover',
            activeIcon: '/zoom-stop.png',
            activeIconHover: '/zoom-stop-hover.png',
            activeIconTitle: '测试active-hover',
            click: () => {
                console.log('test click')
            },
            activeClick: () => {
                console.log('test active click')
            },
        },
        {
            name: 'testBtn2',
            index: 5,
            icon: 'data:image/png;base64, ',
            iconHover: 'data:image/png;base64, ',
            iconTitle: '测试hover2',
            click: () => {
                console.log('test click2')
            },
        }
    ]
}
```

### contextmenuBtns（pro）

- **类型**：`array`
- **默认值**：`[]`
- **参数**：
    - `{string} content`  `必填`
    - `{number} index` `选填` 排序字段，默认值 `0`
    - `{function} click` `必填` 点击事件
- **用法**：添加自定义右键菜单按钮

```js
{
    contextmenuBtns: [
        {
            content: '测试1',
            index: 0,
            click: () => {
                console.log('test click1')
            },
        },
        {
            content: '测试2',
            index: 1,
            click: () => {
                console.log('test click2')
            },
        }
    ]
}
```

### checkFirstIFrame（pro）

- **类型**：`boolean`
- **默认值**：`true`
- **用法**：是否检测第一个iframe，如果为true，则会在播放的时候，首帧必须是i帧的时候，才会去解码，如果不是i帧，就会一直等待i帧的出现。

> 如果设置为false，则会不判断首帧是否是i帧，可能会出现绿屏或者花屏的情况。

### audioEngine （pro）

- **类型**：`string`
- **默认值**：`'null'`
- **用法**：设置音频引擎，可选值有`'worklet'`、`'script'`、`'active'`、，默认值为`'null'`，会自动选择最佳的音频引擎。

> worklet：使用webworklet，需要浏览器支持(需要https环境)，如果不支持，会自动降级到script引擎。

> active：是为了兼容安卓的微信端播放的，一般情况下，在安卓的微信端，默认会使用active引擎。

> script：使用script引擎，一般情况下，会自动选择这个引擎（兼容性最好的音频播放音频）。

### weiXinInAndroidAudioBufferSize（pro）

- **类型**：`number`
- **默认值**：`4800`
- **用法**：安卓微信端的音频缓冲大小，单位是字节。

> 只会在安卓微信端生效（audioEngine参数设置为 null 或者 active），其他情况下，不会生效。

> 一般情况下，不需要设置这个参数，如果出现音频播放卡顿的情况，可以尝试设置这个参数。

> 属于高级参数，一般情况下，不需要设置。如有需要，可以联系作者。

### isShowRecordingUI（pro）

- **类型**：`boolean`
- **默认值**：`true`
- **用法**：是否显示录制的UI（在没有配置底部的录制按钮的情况下），如果为true，则会显示录制的UI，如果为false，则不显示录制的UI。

> 方便通过直接调用js的录制方法的时候，可以显示录制的UI。

> 录制中的UI默认是根据底部按钮的配置来显示的，如果没有配置底部按钮，则会根据这个配置来显示。

### isShowZoomingUI（pro）

- **类型**：`boolean`
- **默认值**：`true`
- **用法**：是否显示缩放的UI（在没有配置底部的缩放按钮的情况下），如果为true，则会显示缩放的UI，如果为false，则不显示缩放的UI。

> 方便通过直接调用js的缩放方法的时候，可以显示缩放的UI。

> 缩放中的UI默认是根据底部按钮的配置来显示的，如果没有配置底部按钮，则会根据这个配置来显示。

### useFaceDetector（pro）

- **类型**：`boolean`
- **默认值**：`false`
- **用法**：是否使用人脸检测，如果为true，则会使用人脸检测，如果为false，则不使用人脸检测。

> 人脸检测的功能，需要额外的引入 `js`和`wasm` 文件。
>

### useWebFullScreen(pro)

- **类型**：`boolean`
- **默认值**：`false`
- **用法**：是否使用web全屏(旋转90度)（只会在移动端生效）。

> 如果手机设置了自动选择，建议不要开启。
>
> web全屏使用的是css方式实现的伪全屏，实现的是横屏播放的。如果手机设置了自动旋转，建议不要使用这个功能。
>
> ios上面不支持系统级别的全屏方法，推荐使用这个参数。



### fullscreenWatermarkConfig (pro)

- **类型**：`object`
- **默认值**：`{}`
- **参数**：全屏水印配置
- **参数**：
    - `{string} text`  `必填` 水印内容
    - `{string} opacity` `选填`  透明度 `默认：0.15` 参考css opacity
    - `{string} angle` `选填`  倾斜角度 `默认：15` 参考css transform rotate
    - `{string} color` `选填`  字体颜色 `默认：black` 参考 css color
    - `{string} fontSize` `选填` 字体大小 `默认：18px` ，参考css的font-size
    - `{string} fontFamily` `选填` 字体 `默认：微软雅黑`，参考css font-family

### pageVisibilityHiddenTimeout (pro)

- **类型**：`number`
- **默认值**：`5 * 60` 5 分钟
- **用法**：监听窗口不可见的超时时间，单位秒。如果为0，则不会监听窗口不可见的事件。

> 需要监听`visibilityHiddenTimeout` 事件来监听事件

```js
// 配置信息：
{
    pageVisibilityHiddenTimeout: 5 * 60
}
```

```js


player.on('visibilityHiddenTimeout', function () {
    // 窗口不可见5分钟超时
});
```

### heartTimeoutReplayUseLastFrameShow（pro）

- **类型**：`boolean`
- **默认值**：`false`
- **用法**：播放过程中，超时重连时，是否使用最后一帧来显示。


> 推荐使用 replayUseLastFrameShow 参数

### replayUseLastFrameShow（pro）

- **类型**：`boolean`
- **默认值**：`false`
- **用法**：触发重播的时候，是否使用最后一帧来显示。


> heartTimeoutReplayUseLastFrameShow 是历史版本的遗留（不推荐使用了）。

> replayUseLastFrameShow 配置优先级高于 heartTimeoutReplayUseLastFrameShow。

> replayUseLastFrameShow 配置了之后，会覆盖 heartTimeoutReplayUseLastFrameShow 的配置。



### controlHtml（pro）

- **类型**：`string | DOM`
- **默认值**：`''`
- **用法**：自定义控制栏的html，如果配置了这个参数，则会在底部控制栏渲染出来。

## 静态变量

### ERROR

播放器对外的错误

```js
jessibucaPro.on(JessibucaPro.EVENTS.error, (error) => {
    if (error === JessibucaPro.ERROR.playError) {
        // 播放错误
    }
})
```

### EVENTS

播放器对外的事件

事件里面的`key`值

```js
jessibucaPro.on(JessibucaPro.EVENTS.blur, () => {
    // 窗口不可见
})
```

## 方法

### setDebug(flag)

- **参数**：
    - `{boolean} flag`
- **返回值**：`void`
- **用法**： 是否开启控制台调试打印

```js
// 开启
jessibucaPro.setDebug(true)
// 关闭
jessibucaPro.setDebug(false)
```

### getOption() （pro）

- **用法**： 获取配置参数信息
- **返回值**：`{object}`

```js
jessibucaPro.getOption()
```

### mute()

- **用法**： 静音
- **返回值**：`void`

```js
jessibucaPro.mute()
```

### cancelMute()

- **用法**： 取消静音
- **返回值**：`void`

```js
jessibucaPro.cancelMute()
```

### audioResume()

- **用法**： 留给上层用户操作来触发音频恢复的方法。
- **返回值**：`void`

> iPhone，chrome等要求自动播放时，音频必须静音，需要由一个真实的用户交互操作来恢复，不能使用代码。

https://developers.google.com/web/updates/2017/09/autoplay-policy-changes

### setTimeout(time)

- **参数**：
    - `{number} time`
- **返回值**：`void`
- **用法**：

设置超时时长, 单位秒 在连接成功之前和播放中途,如果超过设定时长无数据返回,则回调timeout事件

> 会同步设置`loadingTimeout`和`heartTimeout`的值

```js
jessibucaPro.setTimeout(10)

jessibucaPro.on('timeout', function () {
    //
});
```

### setScaleMode(mode)

- **参数**：
    - `{number} mode`
- **返回值**：`void`
- **用法**：

1. `0` 视频画面完全填充canvas区域,画面会被拉伸 等同于参数 `isResize` 为false
2. `1` 视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边 等同于参数 `isResize` 为true
3. `2` 视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全 等同于参数 `isFullResize` 为true

```js
jessibucaPro.setScaleMode(0)

jessibucaPro.setScaleMode(1)

jessibucaPro.setScaleMode(2)
```

### pause(isClear)

- **参数**：
    - `{boolean} isClear` 是否清除画面，默认 `false`
- **返回**：
    - `{Promise}`
- **用法**： 暂停播放

```js
jessibucaPro.pause().then(() => {
    console.log('pause success')

    jessibucaPro.play().then(() => {

    }).catch((e) => {

    })

}).catch((e) => {
    console.log('pause error', e);
})

```

```js
jessibucaPro.pause(true).then(() => {
    console.log('pause success')

    jessibucaPro.play().then(() => {

    }).catch((e) => {

    })

}).catch((e) => {
    console.log('pause error', e);
})

```

可以在pause 之后，再调用 `play()`方法就继续播放之前的流。

### close()

- **用法**： 关闭视频,不释放底层资源
- **返回**：
    - `{Promise}`

```js
jessibucaPro.close().then(() => {
    console.log('close success')
}).catch((e) => {
    console.log('close error', e);
})
```

### destroy()

- **用法**： 关闭视频，释放底层资源
- **返回**：`Promise`


```js
jessibucaPro.destroy().then(()=>{
    console.log('destroy success')
}).catch((e) => {
    console.log('destroy error', e);
})
```

### clearView()

- **用法**： 清理画布为黑色背景
- **返回**：`void`

```js
jessibucaPro.clearView()
```

### play([url],[options])

- **参数**：
    - `{string} url`
    - `{object} options` 目前用不到这个参数

- **返回**：
    - `{Promise}`
- **用法**： 播放视频

```js

jessibucaPro.play('url').then(() => {
    console.log('play success')
}).catch((e) => {
    console.log('play error', e)
})
//
jessibucaPro.play()
```

### resize()

- **用法**： 重新调整视图大小
- **返回**：`void`

```js
jessibucaPro.resize()
```

### setBufferTime(time)

- **参数**：
    - `{number} time`
- **返回**：`void`

- **用法**： 设置最大缓冲时长，单位秒，播放器会自动消除延迟，如果设置为0 则不进行任何缓冲，直接进行解码渲染。
  等同于 `videoBuffer` 参数。

```js
// 设置 200ms 缓冲
jessibucaPro.setBufferTime(0.2)
```

### setBufferDelayTime(time)(pro)

- **参数**：
    - `{number} time`
- **返回**：`void`

- **用法**： 设置最大延迟时间，单位秒，播放器当延迟超过这个时间之后就会丢帧，消除延迟。

等同于 `videoBufferDelay` 参数。

```js
// 设置 1000ms 最大延迟时间
jessibucaPro.setBufferTimeDelay(1)
```

### setRotate(deg)

- **参数**：
    - `{number} deg`
- **返回**：`void`
- **用法**： 设置旋转角度，支持，0(默认) ，90，180，270 三个值。

> 可用于实现监控画面小窗和全屏效果，由于iOS没有全屏API，此方法可以模拟页面内全屏效果而且多端效果一致。

> 注意，当旋转90度后，用户也会旋转手机，这时如果手机未锁定方向，画面又可能因为浏览器旋转导致画面又旋转了。可以监听页面旋转事件，将角度又旋转回0

```js
jessibucaPro.setRotate(0)

jessibucaPro.setRotate(90)

jessibucaPro.setRotate(270)
```

### setVolume(volume)

- **参数**：
    - `{number} volume`

- **用法**：

1. 设置音量大小，取值0 — 1
2. 当为0时，完全无声
3. 当为1时，最大音量，默认值

> 区别于 mute 和 cancelMute 方法，虽然设置setVolume(0) 也能达到 mute方法，但是mute
> 方法是不调用底层播放音频的，能提高性能。而setVolume(0)只是把声音设置为0 ，以达到效果。

```js
jessibucaPro.setVolume(0.2)

jessibucaPro.setVolume(0)

jessibucaPro.setVolume(1)
```

### hasLoaded()

- **返回值**：`boolean`
- **用法**： 返回是否加载完毕

```js
var result = jessibucaPro.hasLoaded()
console.log(result) // true
```

### setKeepScreenOn()

- **用法**： 开启屏幕常亮，在手机浏览器上, canvas标签渲染视频并不会像video标签那样保持屏幕常亮。 H5目前在chrome\edge 84,
  android chrome 84及以上有原生亮屏API, 需要是https页面
  其余平台为模拟实现，此时为兼容实现，并不保证所有浏览器都支持
- **返回值**：`void`

```js
jessibucaPro.setKeepScreenOn()
```

### setFullscreen(flag)

- **参数**：
    - `{boolean} flag`

- **用法**： 全屏(取消全屏)播放视频

> iOS不支持，iPadOS13后支持

> 推荐iOS端配置上 useWebFullScreen 这个参数。

```js

jessibucaPro.setFullscreen(true)
//
jessibucaPro.setFullscreen(false)
```

### screenshot(filename, format, quality,type)

- **参数**：
    - `{string} filename`
    - `{string} format`
    - `{number} quality`
    - `{string} type`
- **用法**：

截图，调用后弹出下载框保存截图

1. filename: 可选参数, 保存的文件名, 默认 `时间戳`
2. format : 可选参数, 截图的格式，可选`png`或`jpeg`或者`webp` ,默认 `png`
3. quality: 可选参数, 当格式是`jpeg`或者`webp`时，压缩质量，取值0 ~ 1 ,默认 `0.92`
4. type: 可选参数, 可选`download`或者`base64`或者`blob`，默认`download`

> 手机浏览器不一定能保存下来。 建议手机端通过`base64`形式。让用户自主保存。

```js

jessibucaPro.screenshot("test", "png", 0.5)


const base64 = jessibucaPro.screenshot("test", "png", 0.5, 'base64')


const fileBlob = jessibucaPro.screenshot("test", 'blob')

```

### screenshotWatermark(options)（pro）

- **返回值**：`Promise`
- **options 参数**：
    - `{string} filename`
    - `{string} format`
    - `{number} quality`
    - `{string} type`
    -
- **用法**：

截图(支持水印参数)，调用后弹出下载框保存截图

1. filename: 可选参数, 保存的文件名, 默认 `时间戳`
2. format : 可选参数, 截图的格式，可选`png`或`jpeg`或者`webp` ,默认 `png`
3. quality: 可选参数, 当格式是`jpeg`或者`webp`时，压缩质量，取值0 ~ 1 ,默认 `0.92`
4. type: 可选参数, 可选`download`或者`base64`或者`blob`，默认`download`

```js

jessibucaPro.screenshotWatermark({
    filename: 'test',
    text: {
        content: 'jessibuca-pro',
        fontSize: '40',
        color: 'red'
    },
    right: 20,
    top: 40
})


jessibucaPro.screenshotWatermark({
    filename: 'test',
    text: {
        content: 'jessibuca-pro',
        fontSize: '40',
        color: 'red'
    },
    right: 20,
    top: 40,
    type: 'base64'
}).then((base64) => {

})


jessibucaPro.screenshotWatermark({
    image: {
        src: 'data:image/png;base64, ',
        width: 60,
        height: 60
    },
    right: 20,
    top: 20,
    type: `blob`,
}).then((fileBlob) => {

})

```

### startRecord(fileName,fileType)

- **参数**：
    - `{string} filename`
    - `{string} fileType`（废弃）
- **返回值**：`{Promise}`
- **用法**： 开始录制。

1. fileName: 可选，默认时间戳
   ~~2. fileType: 可选，支持webm 和mp4 格式 默认webm~~

```js
jessibucaPro.startRecord('xxx')
```

> 文件类型根据 `recordType` 参数走。

### stopRecordAndSave(type,fileName)

- **用法**： 暂停录制并下载。
- **参数**：
    - `{string} type`
    - `{string} fileName`
- **返回值**：`{Promise}`

1. type: 可选，默认`download`，支持`download`和`blob`
2. fileName: 可选，默认时间戳

```js
jessibucaPro.stopRecordAndSave()
```

```js
jessibucaPro.stopRecordAndSave('', 'fileName')
```

```js
```

```js
jessibucaPro.stopRecordAndSave('blob')
jessibucaPro.once('recordBlob', (fileBlob) => {
    console.log(fileBlob)
})
```

```js
jessibucaPro.stopRecordAndSave('blob').then((fileBlob) => {
    console.log(fileBlob)
})
```

### isPlaying()

- **返回值**：`boolean`
- **用法**： 返回是否正在播放中状态。

```js
var result = jessibucaPro.isPlaying()
console.log(result) // true
```

### isLoading()（pro）

- **返回值**：`boolean`
- **用法**： 返回是否正在加载中状态。

```js
var result = jessibucaPro.isLoading()
console.log(result) // true
```

### isPause()（pro）

- **返回值**：`boolean`
- **用法**： 返回是否正在暂停中状态。

```js
var result = jessibucaPro.isPause()
console.log(result) // true
```

### isPlaybackPause()（pro）

- **返回值**：`boolean`
- **用法**： 返回是否正在回放暂停中状态。

```js
var result = jessibucaPro.isPlaybackPause()
```

### isMute()

- **返回值**：`boolean`
- **用法**： 返回是否静音。

```js
var result = jessibucaPro.isMute()
console.log(result) // true
```

### isRecording()

- **返回值**：`boolean`
- **用法**： 返回是否正在录制。

```js
var result = jessibucaPro.isRecording()
console.log(result) // true
```

### clearBufferDelay() （pro）

- **返回值**：`void`
- **用法**： 手动消除缓冲区数据。

```js
jessibucaPro.clearBufferDelay()
```

### playback(url,options)（pro）

- **参数**：
    - `{string} url`
    - `{object} options` 同 `playbackConfig`配置参数

- **返回**：
    - `{Promise}`
- **用法**： 播放录像流视频

### forward(rate)（pro）

- **参数**：
    - `{number} rate`

- **返回**：
    - `{Promise}`
- **用法**： 快放 1倍，2倍，4倍，8倍,16倍,32倍,支持范围 0.1 - 32

### playbackForward(rate)

等同于 `forward(rate)` 方法

### normal()（pro）

- **返回**：
    - `{Promise}`
- **用法**：快放->恢复

```js
jessibuca.normal().then(() => {
    console.log('normal')
}).catch((err) => {
    console.log(err)
})
```

### playbackNormal()

等同于 `normal` 方法

### playbackPause(isPause)（pro）

- **参数**：
    - `{boolean} isPause` 默认：`false`
- **返回**：
    - `{Promise}`

- **用法**： 录像流暂停，只是停止渲染画面，继续接收流数据，不触发超时机制

如果 `playbackPause(true)` 等同于调用`pause()` 方法

### playbackResume()（pro）

- **返回**：
    - `{Promise}`

- **用法**： 录像流暂停->恢复播放

### updatePlaybackForwardMaxRateDecodeIFrame(rate)（pro）

- **参数**：
    - `{number} rate` 支持范围 1 - 8 整数
- **返回**：
    - `{void}`
      更新TF卡流只解码i帧播放倍率，支持playback()之前调用。

### setPlaybackStartTime(timestamp)（pro）

- **参数**：
    - `{number} timestamp` 时间戳，针对于24H的时间戳，
- **返回**：
    - `{void}`

请求完服务器端seek之后，把seek之后的时间传递给播放器，用于UI上面展示更新之后的时间。

如果是通过点击UI上面的时间，会得到时分秒，然后转换成时间戳`const timestamp = new Date().setHours(hour,min,second,0)`，然后调用`setPlaybackStartTime(timestamp)`方法。

> 会存在一种场景，就是seek之后，流媒体服务器端还有一小戳的seek之前的数据推给前端，因为前端24H UI 上面的时间戳是根据流里面的时间戳做`当对值`得到的。
> 所以如果立马触发`setPlaybackStartTime`方法的话，会就有可能因为还是seek之前的时间戳，等seek之后的时间戳到来的时候，UI上面的时间会直接跳的不对。

解决方案：延迟些时间去触发`setPlaybackStartTime`方法。大概500ms左右。

```js
setTimeout(() => {
    jessibucaPro.setPlaybackStartTime(timestamp)
}, 500)
```


### getPlaybackCurrentRate()（pro）

- **返回**：
    - `{number}`

获取当前TF卡流播放的倍率。

### playbackClearCacheBuffer()（pro）

- **返回**：
    - `{void}`

清除缓存的数据，用于seek之后，清除之前的数据。

### updatePlaybackLocalOneFrameTimestamp(timestamp)（pro）

- **参数**：
    - `{number} timestamp`
- **返回**：
    - `{void}`

更新`localOneFrameTimestamp` 字段

> 当播放器以倍率播放的时候，如果超过了`playbackForwardMaxRateDecodeIFrame`
> 设置的倍率，这个时候只会解码i帧的数据。就会导致`localOneFrameTimestamp`字段不准确。

> 所以当切换倍率超过限制之后，就需要触发这个方法，去更新`localOneFrameTimestamp`字段。

### setNetworkDelayTime(timestamp)（pro）

- **参数**：
    - `{number} timestamp` 单位秒s
- **返回**：
    - `{void}`

设置网络延迟时间，用于播放器计算播放时间，单位秒s

### setStreamQuality(quality)（pro）

- **参数**：
    - `{number} quality`
- **返回**：
    - `{void}`

- **用法**： 设置分辨率 `quality` 必须是`qualityConfig`里面的数据

### setMirrorRotate(mirrorRotate)（pro）

- **参数**：
    - `{string} mirrorRotate`
- **返回**：
    - `{void}`

- **用法**： 设置镜像翻转 `mirrorRotate` ，可选参数有 默认`none`,水平 `level`,垂直 `vertical`

### togglePerformancePanel(flag)（pro）

- **参数**：
    - `{boolean} flag` 是否显示性能面板，如果不写参数，则当做toggle切换
- **返回**：
    - `{void}`

- **用法**： 隐藏/显示 性能面板

### openZoom()（pro）

- **返回**：
    - `{void}`

- **用法**： 打开电子放大

### closeZoom()（pro）

- **返回**：
    - `{void}`

- **用法**： 关闭电子放大

### isZoomOpen()（pro）

- **返回**：
    - `{boolean}`

- **用法**： 当前是否处于电子放大模式下

### expandZoom()（pro）

- **返回**：
    - `{void}`

- **用法**： 电子放大-放大

### narrowZoom()（pro）

- **返回**：
    - `{void}`

- **用法**： 电子放大-缩小

### getCurrentZoomIndex()（pro）

- **返回**：
    - `{number} currentZoom` 当前放大的档位

- **用法**： 获取当前电子放大档位 范围 1~5

### getDecodeType()（pro）

- **返回**：
    - `{string} decodeType` 当前解码类型

返回一个字符串 告知当前解码类型。如果是组合型的话，会用空格分隔。

可能得结果有：`mse`，`wcs`，`offscreen`，`wasm`，`simd`，`webrtc`，`hls`

### getDemuxType()（pro）

- **返回**：
    - `{string} demuxType` 当前解复用类型

返回一个字符串 告知当前解复用类型。

可能得结果有：`flv`，`m7s`，`hls`，`webrtc`，`webTransport`，`nakedFlow`

### getRenderType()（pro）

- **返回**：
    - `{string} renderType` 当前渲染组件 包含 `video`,`canvas`

返回一个字符串 告知当前渲染组件。

### getPlayingTimestamp()（pro）

- **返回**：
    - `{number} pTs` 播放时间戳 单位 秒

返回一个数字，告知当前播放时间戳。

> 等同于 stats 事件中的 `pTs` 字段

### getStatus()（pro）

- **返回**：
    - `{string} status` 当前播放器状态 包含状态有 `playing` `paused` `loading`

返回一个字符串，告知当前播放器状态。

### getPlayType()（pro）

- **返回**：
    - `{string} playType` 当前播放器类型 包含类型有 `player` `playbackTF`

返回一个字符串，告知当前播放器类型。

### getAudioEngineType()（pro）

- **返回**：`{string}` 返回当前音频引擎类型

返回的结果有 `audio`， `worklet`， `script`， `active`

### setNakedFlowFps(fps)（pro）

- **用法**： 设置裸流播放的fps
- **参数**：`{number} fps` fps值 1~100
- **返回**：`{promise}`

### updateDebugLevel(level)（pro）

- **用法**： 设置调试等级
- **参数**：`{number} level` `debug`和`warn`
- **返回**：`{void}`

### faceDetectOpen()（pro）

- **用法**： 打开人脸检测
- **返回**：`{void}`
- **注意**： 人脸检测功能需要额外加载js和wasm文件

### faceDetectClose()（pro）

- **用法**： 关闭人脸检测
- **返回**：`{void}`
- **注意**： 人脸检测功能需要额外加载js和wasm文件

### updateFullscreenWatermark(config)（pro）

- **用法**： 更新全屏水印
- **返回**：`{void}`
- **注意**： config 等同于 `fullscreenWatermarkConfig` 配置

### removeFullscreenWatermark()（pro）

- **用法**： 移除全屏水印
- **返回**：`{void}`

### sendWebsocketMessage(message)（pro）

- **用法**： 发送websocket消息
- **参数**：`{*} message` 消息内容
- **返回**：`{void}`

### addContentToCanvas(contentList)

- **用法**： 给canvas（video） 添加内容
- **返回**：`{void}`
- **参数**：`{Array} contentList` 内容列表
    - `{string} type` 内容类型 支持 `text`,`rect`
    - `{string} text` 文本内容(type 为 text 有效)
    - `{number} fontSize` 字体大小(type 为 text 有效)
    - `{number} width` 宽度(type 为 rect 有效)
    - `{number} height` 高度(type 为 rect 有效)
    - `{number} lineWidth` 边框宽度(type 为 rect 有效)
    - `{string} color` 颜色
    - `{number} x` x坐标
    - `{number} y` y坐标

> ~~目前仅支持 在硬解码模式下，在使用 canvas 渲染。~~

> 现在 `软解码`，`硬解码`, `canvas渲染`，`video渲染` 都支持。

### clearContentToCanvas()

- **用法**： 清空canvas 额外添加的内容
- **返回**：`{void}`

### setControlHtml(html)

- **用法**： 设置控制面板的html
- **返回**：`{void}`


### clearControlHtml()

- **用法**： 清空控制面板的html
- **返回**：`{void}`


### updateWatermark(config)

- **用法**： 更新水印
- **参数**：`{object | array} config` 水印配置
- **返回**：`{void}`

水印参数支持 `object` 和 `array` 支持配置多个水印数据。

### removeWatermark()

- **用法**： 移除水印
- **返回**：`{void}`


### getVideoInfo()

- **用法**： 获取视频信息
- **返回**：`{object}`

返回一个对象，包含以下字段：
- width：视频宽
- height：视频高
- encType：编码类型，包含：`H264(AVC)`，`H265(HEVC)`

> 需要在触发`videoInfo`事件之后才能获取到

### getAudioInfo()

- **用法**： 获取音频信息
- **返回**：`{object}`

返回一个对象，包含以下字段：
- sampleRate：采样率
- channels：声道数
- encType：编码类型，包含：`AAC`，`ALAW`，`MULAW`

> 需要在触发`audioInfo`事件之后才能获取到

### on(event, callback)

- **参数**：
    - `{string} event`
    - `{function} callback`
- **用法**： 监听方法

```js

jessibucaPro.on("load", function () {
    console.log('load')
})
```

## 事件

### load

监听 jessibucaPro 初始化事件。

```js

jessibucaPro.on("load", function () {
    console.log('load')
})
```

### timeUpdate

等同于 `stats`里面的`ts`字段

```js
jessibucaPro.on('timeUpdate', function (ts) {
    console.log('timeUpdate', ts);
})
```

> 等同于 `stats`的`ts`字段

### videoInfo

当解析出视频信息时回调，2个回调参数

1. width：视频宽
2. height：视频高

```js

jessibucaPro.on("videoInfo", function (data) {
    console.log('width:', data.width, 'height:', data.width)
})
```

### audioInfo

当解析出音频信息时回调，2个回调参数

1. numOfChannels：声频通道
2. sampleRate 采样率

```js

jessibucaPro.on("audioInfo", function (data) {
    console.log('numOfChannels:', data.numOfChannels, 'sampleRate', data.sampleRate)
})
```

### error

错误信息

目前已有的错误信息：

- jessibucaPro.ERROR.playError ;播放错误，url 为空的时候，调用play方法
- jessibucaPro.ERROR.fetchError ;http 请求失败
- jessibucaPro.ERROR.websocketError; websocket 请求失败
- jessibucaPro.ERROR.webcodecsH265NotSupport; webcodecs 解码 h265 失败
- jessibucaPro.ERROR.mediaSourceH265NotSupport; mediaSource 解码 h265 失败
- jessibucaPro.ERROR.wasmDecodeError ; wasm 解码失败
- jessibucaPro.ERROR.hlsError ; hls 播放失败
- jessibucaPro.ERROR.wasmDecodeVideoNoResponseError ; wasm 解码视频没有响应
- jessibucaPro.ERROR.mediaSourceUseCanvasRenderPlayFailed ; mediaSource 使用 canvas 渲染播放失败
- jessibucaPro.ERROR.mseWidthOrHeightChange ;流分辨率发生变化（可以无视，播放器内部已经处理了）
- jessibucaPro.ERROR.wcsWidthOrHeightChange ;流分辨率发生变化（可以无视，播放器内部已经处理了）
- jessibucaPro.ERROR.mediaSourceFull ;mse 缓存已满
- jessibucaPro.ERROR.mediaSourceAppendBufferError ;mse 解码错误
- jessibucaPro.ERROR.mediaSourceBufferListLarge ;mse 缓存列表过大
- jessibucaPro.ERROR.mediaSourceAppendBufferEndTimeout  ;mse 缓存超时
- jessibucaPro.ERROR.mediaSourceDecoderConfigurationError ;mse 解码器配置错误
- jessibucaPro.ERROR.mediaSourceTsIsMaxDiff ;mse 解码ts 时间戳差值过大
- jessibucaPro.ERROR.webrtcError ;webrtc 播放失败
- jessibucaPro.ERROR.audioChannelError ;音频通道错误
- jessibucaPro.ERROR.simdH264DecodeVideoWidthIsTooLarge ;simd 解码H264视频宽度过大
- jessibucaPro.ERROR.wasmWidthOrHeightChange ;流分辨率发生变化（可以无视，播放器内部已经处理了）

```js

jessibucaPro.on("error", function (error) {
    if (error === jessibucaPro.ERROR.fetchError) {
        //
    } else if (error === jessibucaPro.ERROR.webcodecsH265NotSupport) {
        //
    }
    console.log('error:', error)
})
```

### fetchError

播放器播放的时候，http(s) 协议请求失败

```js

jessibucaPro.on("fetchError", function (data) {
    console.log('fetchError:', data)
})
```

### websocketError

播放器播放的时候，websocket 请求失败

```js
jessibucaPro.on("websocketError", function (data) {
    console.log('websocketError:', data)
})
```

### kBps

当前网速， 单位KB 每秒1次,

```js

jessibucaPro.on("kBps", function (data) {
    console.log('kBps:', data)
})
```

### start

渲染开始

> 如果触发重播机制，也会触发这个方法。


> 如果需要在start 之后调用截图方法，需要写一个延迟方法去执行。因为代码中无法感应到画面被渲染出来了。

```js

jessibucaPro.on("start", function () {
    console.log('start render')

    // 如果有截图需求。需要延迟一下，因为代码中无法感应到画面被渲染出来了。
    // 1s 之后截图
    setTimeout(function () {
        jessibuca.screenshot('xxx')
    }, 1 * 1000)
})

// 只想监听一次
jessibucaPro.once("start", function () {
    console.log('start render')
})
```

### timeout

当设定的超时时间内无数据返回,则回调

1. jessibucaPro.TIMEOUT.loadingTimeout ; 同loadingTimeout
2. jessibucaPro.TIMEOUT.delayTimeout ; 同delayTimeout

```js

jessibucaPro.on("timeout", function (error) {
    console.log('timeout:', error)
})
```

### loadingTimeout

当play()的时候，如果没有数据返回，则回调

```js

jessibucaPro.on("loadingTimeout", function () {
    console.log('timeout')
})
```

### loadingTimeoutRetryEnd

当loadingTimeout事件触发后，如果超过重试次数，则回调

```js

jessibucaPro.on("loadingTimeoutRetryEnd", function () {
    console.log('loadingTimeoutRetryEnd')
})
```

### delayTimeout

当播放过程中，如果超过timeout之后没有数据渲染，则抛出异常。

```js

jessibucaPro.on("delayTimeout", function () {
    console.log('timeout')
})
```

### delayTimeoutRetryEnd

当delayTimeout事件触发后，如果超过重试次数，则回调

```js
jessibucaPro.on("delayTimeoutRetryEnd", function () {
    console.log('delayTimeoutRetryEnd')
})
```

### playFailedAndPaused

当播放失败后，没有触发任何的重播机制，就会触发这个事件。

```js
jessibucaPro.on("playFailedAndPaused", function () {
    console.log('playFailedAndPaused')
})
```

### fullscreen

当前是否全屏

```js
jessibucaPro.on("fullscreen", function (flag) {
    console.log('is fullscreen', flag)
})
```

### webFullscreen

当前是否全屏(H5)

```js
jessibucaPro.on("webFullscreen", function (flag) {
    console.log('is webFullscreen', flag)
})
```

```
### play

触发播放事件

```js
jessibucaPro.on("play", function (flag) {
    console.log('play')
})
```

### play

触发播放事件

```js
jessibucaPro.on("play", function (flag) {
    console.log('play')
})
```

### pause

触发暂停事件

```js
jessibucaPro.on("pause", function (flag) {
    console.log('pause')
})
```

### mute

触发声音事件，返回boolean值

```js
jessibucaPro.on("mute", function (flag) {
    console.log('is mute', flag)
})
```

### stats

流状态统计，流开始播放后回调，每秒1次。

- fps: 视频帧率(fps),
- maxFps:视频峰值帧率(fps),
- dfps:解码帧率(fps)
- abps: 音频码率(bit)
- vbps: 视频码率(bit)
- audioBuffer:音频缓冲帧,
- audioBuffer: 音频缓冲区PCM 数据
- demuxBuffer: 视频待解码帧(直播流)
- flvBuffer: 待解封装数据(byte)
- isDropping: 是否丢帧
- playbackVideoBuffer：视频待渲染(直播流)
- playbackCacheDataDuration：缓存时长(ms)(录像流)
- audioDemuxBuffer：音频待解码帧(直播流)
- mseDelay:MSE缓冲时长(ms)
- mseDecodeDiffTimes：MSE解码间隔(ms)
- mseTs：MSE解码时间(ms)
- mseDecodePlaybackRate：MSE播放模式(1:正常；>1 加速)
- wcsDecodeDiffTimes：WCS解码间隔(ms)
- hlsDelay：HLS缓冲时长(ms)
- hlsDecodePlaybackRate：HLS播放模式(1:正常；>1 加速)
- netBuf:网络延迟(ms)
- buf: 缓存时长(ms) ,
- pushLatestDelay:最新缓冲时长(ms)
- ts:视频显示时间(ms)
- audioTs:音频显示时间(ms)
- dts:视频解码时间(ms)
- delayTs:解码前-解码后延迟(ms)
- totalDelayTs:总延迟(网络+解码)(ms)
- pTs:当前播放器的播放时间(播放器自己计算的时间)，每次从0开始，单位秒（pro）

> 在音频有的情况下： 可以通过 ts - audioTs 来计算出：音视频同步时间戳(ms)

```js
jessibucaPro.on("stats", function (s) {
    console.log("stats is", s)
})
```

> 如果是TF卡流（录像流），建议使用`ts`字段，这个字段是数据流里面的

### performance

渲染性能统计，流开始播放后回调，每秒1次。

- 0: 表示卡顿
- 1: 表示流畅
- 2: 表示非常流程

```js
jessibucaPro.on("performance", function (performance) {
    console.log("performance is", performance)
})
```

### recordStart

录制开始的事件

```js
jessibucaPro.on("recordStart", function () {
    console.log("record start")
})
```

### recordEnd

录制结束的事件

```js
jessibucaPro.on("recordEnd", function () {
    console.log("record end")
})
```

### recordBlob

调用录制结束，接收的二进制内容。

```js
jessibucaPro.stopRecordAndSave('blob')
jessibucaPro.once('recordBlob', (fileBlob) => {
    console.log(fileBlob)
})
```
等同于：
```js
jessibucaPro.stopRecordAndSave('blob').then((fileBlob) => {
    console.log(fileBlob)
})
```

### recordingTimestamp

录制的时候，返回的录制时长，1s一次

```js
jessibucaPro.on("recordingTimestamp", function (timestamp) {
    console.log("recordingTimestamp is", timestamp)
})
```

### playToRenderTimes

监听调用play方法 经过 初始化-> 网络请求-> 解封装 -> 解码 -> 渲染 一系列过程的时间消耗

```js
jessibucaPro.on("playToRenderTimes", function (times) {
    console.log("playToRenderTimes is", times)
})
```

数据结构如下。

```
{
    playInitStart: '', //1 初始化时间戳
    playStart: '', // 2 开始请求流时间戳
    streamStart: '', //3 请求流时间戳
    streamResponse: '', // 4 请求流返回时间戳
    demuxStart: '', // 5 解封装时间戳
    decodeStart: '', // 6 解码时间戳
    videoStart: '', // 7 渲染时间戳
    playTimestamp: '',// playStart- playInitStart
    streamTimestamp: '',// streamStart - playStart
    streamResponseTimestamp: '',// streamResponse - streamStart
    demuxTimestamp: '', // demuxStart - streamResponse
    decodeTimestamp: '', // decodeStart - demuxStart
    videoTimestamp: '',// videoStart - decodeStart
    allTimestamp: '' // videoStart - playInitStart
}

```

### playbackSeek（pro）

当点击播放器上面的时间进度条，响应的事件

数据结构如下。

```json
{
    "hour": 1,
    "min": 2,
    "second": 0
}

```

### playbackStats（pro）

录像流的 stats数据,1s回调一次

```json
{
    "fps": "",
    "rate": "",
    "start": "",
    "end": "",
    "timestamp": "",
    "dataTimestamp": "",
    "audioBufferSize": "",
    "videoBufferSize": "",
    "ts": ""
}
```

### playbackTimestamp（pro）

录像流的当前播放的时间,1s回调一次

```json
{
    "hour": "",
    "min": "",
    "second": "",
    "ts": ""
}
```

### playbackPauseOrResume(pro)

录像流的ui配置了 playbackPause 方法之后，当触发 playbackPause方法，会触发事件，方便业务层做与服务器端通讯

```js
jessibucaPro.on('playbackPauseOrResume', (value) => {
    if (value === true) {
        // pause 播放 -> 暂停
    } else {
        //  resume 暂停 -> 播放
    }
})
```

### playbackPreRateChange(pro)

录像流的ui配置了`rateConfig` 之后 ，当在ui上面选择了倍率之后，会触发`playbackPreRateChange`事件，方便业务层做与服务器端通讯。

```js

jessibucaPro.on('playbackPreRateChange', (value) => {
    // value 为当前的倍速
    // 可以与服务器端发送倍率的请求。
    // 然后更新播放器的倍率显示
})
```

### playbackRateChange(pro)

当播放器的倍率发生变化的时候，会触发`playbackRateChange`事件。

### ptz（pro）

回调ptz 操作的方向 包含

- up  方向上
- right 方向右
- down 方向下
- left 方向左
- leftUp 方向左上
- leftDown  方向左下
- rightUp 方向右上
- rightDown 方向右下
- stop 暂停
- zoomExpand  镜头 +
- zoomNarrow  镜头 -
- apertureFar 聚焦 +
- apertureNear 聚焦 -
- focusFar 光圈 +
- focusNear 光圈 -
- fiStop 暂停（聚焦，光圈）

### streamQualityChange（pro）

切换分辨率的事件回调

### close(pro)

播放器被销毁的时候触发的事件
> 由于 close 事件必须先抛出，然后执行的内部的destroy 方法(不然内部执行执行接触事件绑定，外部on方法就会失效掉的)
> ，所以需要在监听事件内部通过 setTimeout 方法之后（让destroy执行成功）再执行后续的业务代码，例如关闭流连接啥的等等

> 如果不在setTimeout之后执行，会出现意想不到的事情

```js
jessibucaPro.on('close', () => {
    setTimeout(() => {
        // do some things
    }, 10)
})
```

### zooming(pro)

电子放大是否开启状态

```js
jessibucaPro.on('zooming', (flag) => {
    console.log('zooming status is', flag);
})
```

### talkStreamError（pro）

语音websocket 接口报 `error` 错误

```js
jessibucaPro.on('talkStreamError', (error) => {
    console.log('talkStreamError is', error);
})
```

### talkStreamClose（pro）

语音websocket 接口报 `close` 错误

```js
jessibucaPro.on('talkStreamClose', (error) => {
    console.log('talkStreamClose is', error);
})
```

### talkStreamInactive（pro）

语音设备的流突然断开了（把麦克风直接给拔掉了等情况，导致流断了）

```js
jessibucaPro.on('talkStreamInactive', (error) => {
    console.log('talkStreamInactive is', error);
})
```

### crashLog（pro）

触发播放器重播的时候，会抛出错误信息，方便业务层做错误上报

主要收集的数据有

- url： 播放地址
- type: 错误的类型
- error： 错误信息
- playType ： 播放类型
- demuxType：解封装类型
- decodeType：解码类型
- renderType: 渲染类型
- videoInfo : 视频信息 {width,height,encType}
- audioInfo : 音频信息 {encType,channels,sampleRate}
- audioEngine ：音频引擎
- allTimes ：播放时长，单位秒

```js
jessibucaPro.on('crashLog', (data) => {
    console.log('crashLog is', data);
})
```

### focus（pro）

播放器实例获取焦点（点击和右键）的时候触发的事件。

```js
jessibucaPro.on('focus', () => {
    // do something
})
```

### blur（pro）

播放器实例失去焦点的时候触发的事件。

```js
jessibucaPro.on('blur', () => {
    // do something
})
```

### visibilityHiddenTimeout（pro）

监听窗口不可见超时时间

```js
jessibucaPro.on('visibilityHiddenTimeout', () => {
    // do something
})
```

### visibilityChange（pro）
窗口可见性（隐藏/显示）变化的时候触发

```js

jessibucaPro.on('visibilityChange', (value) => {
    if (value === true) {
        // 窗口显示
    } else {
        // 窗口隐藏
    }
})
```


### websocketOpen（pro）

> 该事件只有在使用websocket协议的时候才会触发

监听websocket连接成功（open）事件

```js
jessibucaPro.on('websocketOpen', () => {
    // do something
})
```


### websocketClose（pro）

> 该事件只有在使用websocket协议的时候才会触发

监听websocket关闭（close）事件

```js
jessibucaPro.on('websocketClose', () => {
    // do something
})
```


### audioResumeState（pro）

当尝试做声音恢复的时候，会触发该事件，方便业务层做相关的处理

回调参数有：
```
{
    state:' running | suspended',
    isRunning: false|true,
}
```

`isRunning` 为`true` 或者检查 `state` 的值为`running`的时候，说明声音恢复成功了

```js
jessibucaPro.on('audioResumeState', (value) => {
    if (value.isRunning === true || value.state === 'running') {
        // do something
    }
})
```


### networkDelayTimeout（pro）

当网络延迟超过`networkDelay`的时候，会触发该事件，方便业务层做相关的处理。

> 如果配置了`networkDelayTimeoutReplay`，则会自动重播。 事件也会抛出。

> 只要网络延迟超过`networkDelay`，就会触发该事件（频繁），所以建议使用`once`方法监听一次即可。

```js
// 推荐once 监听一次即可。
jessibucaPro.once('networkDelayTimeout', () => {
    // do some things
})
```


### aiObjectDetectorInfo（pro）

当开启了ai物体检测功能的时候，会触发该事件，方便业务层做相关的处理。

> 该事件只有在开启了ai物体检测功能的时候才会触发

```js
jessibucaPro.on('aiObjectDetectorInfo', (data) => {
    console.log('aiObjectDetectorInfo is', data);
})
```


