# 回放SDK

[TOC]

## 房间

### 概述

可获取直播间当前流类型信息、监听用户登录成功、失败

### 相关API

#### 信息

##### 当前流类型信息

```javascript
window.on_cc_live_streaminfo = function(data){}
```

>  Windows平台 5.5.0开始支持，Mac平台5.6.0开始支持

返回值

```javascript
{
    "time": 1000,  //  相对回放开始点的相对偏移量（毫秒）
    "type": 10  // 10: 摄像头, 20: 图片, 30: 插播视频, 40: 区域分享, 50: 桌面共享, 60: 自定义场景
}
```

#### 用户

##### 登录成功

```javascript
window.on_cc_login_success = function(data){}
```

返回值

```javascript
{
     template:{
        desc:"视频",  //模板描述信息
        name:"模板一",//模板名称
        type:"1"         //模板类型  （1:大屏模式 ，2：问答、视频、聊天 ，3：视频、聊天，4：文档、视频。聊天，5：视频、文档、问答、聊天，6：视频、问答

    },
     viewer:{
        id:"ae4dec",//  观看者id
        groupId："1",// 观看者分组id
        name："名称" // 观看者名称
    }
}
```

##### 登录失败

```javascript
window.on_cc_login_error = function(error){}  
```

#### 直播间配置

##### 获取直播间配置

```javascript
window.cc_get_room_setting = function(data){
    const { replay } = data
    consle.log("直播间配置详情为:" + replay.settings)
}
```

返回值详情

```javascript
{
    "replay": {
        "name": "xxx", // 直播间名称
        "introSwitch": 1, // 回放简介开关; 1-开启, 0-关闭;
        "startTime": "xxxx-xx-xx xx:xx:xx", // 直播开始时间
        "endTime": "xxxx-xx-xx xx:xx:xx", // 直播结束时间
        "settings": {
            ...
            "replayHintSwitch": 1, // 回放提示语开关; 1-开启, 0-关闭;
            "replayHintContent": "欢迎收看xxx的回放", // 回放提示语内容(内容长度<=20个字符)
            ...
        }
    }
    ...
}
```

##### 获取实时在线观看人数

```javascript
window.on_cc_room_user_count = function(count){
    consle.log("直播间z在线观看人数为:" + count)
}
```

## 播放器

### 概述

可监听播放器加载完成、准备完成、播放开始、暂停、恢复、停止事件；可获取回放打点、跳转到指定时间播放、获取当前播放时间、获取视频总时长；
可监听讲师端启动区域分享/桌面共享的开始、结束事件
支持记忆上次观看时间

### 相关API

#### 基本

##### 播放器加载完成

```javascript
window.on_cc_live_player_load = function () {}
```

##### 播放器准备完成

```javascript
window.on_cc_player_ready = function () {}
```

##### 开始观看回放

```javascript
window.on_cc_callback_play = function () {
  console.log('回放开始播放了')
}
```

##### 播放开始

> 仅支持PC端

```javascript
window.on_player_start = function () {}
```

##### 播放暂停

> 仅支持PC端

```javascript
window.on_spark_player_pause = function () {}
```

##### 恢复播放

> 仅支持pc端

```javascript
window.on_spark_player_resume = function () {}
```

##### 播放停止

> 仅支持pc端

```javascript
window.on_spark_player_end = function () {}
```

##### 回放打点

```javascript
window.on_cc_loadDotPointsData = function (data) {
    console.log(data)
}
data: [
    {
        time: 0 // s
        desc: 'xxxx'
    }
]
```

##### 播放暂停

```javascript
$.DW.play()
```

##### 跳转到指定时间播放

```javascript
$.DW.seek(time, status, callback)   // 跳转到指定时间播放，time单位为秒
```

参数说明

<table width="900px">
    <tr  style="background:#F60;color:#FFF">
        <td>参数名称</td>
        <td>参数类型</td>
        <td>说明</td>
        <td>是否必须</td>
    </tr>
    <tr>
        <td>time</td>
        <td>Number</td>
        <td>
        单位秒
        </td>
        <td>是</td>
    </tr>
    <tr>
        <td>status</td>
        <td>String</td>
        <td>
        'play': 完成seek后播放回放<br/>
        'pause': 完成seek后暂停回放
        </td>
        <td>否</td>
    </tr> 
    <tr>
        <td>callback</td>
        <td>Function</td>
        <td>
        完成seek后执行的回调函数
        </td>
        <td>否</td>
    </tr> 
</table>

##### 获取视频缩略图

> 回放生成缩略图需要联系客服开通 缩略图预览 权限
> 生成的回放缩略图是一张1600x900的大雪碧图，为10分钟的截图数据，6秒截一张图，每张小图大小160x90，共10行10列，需要使用css定位展示对应时间点小图

```javascript
$.DW.getVideoPreview(time) // 获取指定时间的视频缩略图信息， time单位为秒
```

返回值说明
```javascript
{
  "time": 100, // 请求缩略图的时间
  "videoPreviews": [
    {
      "url": "//img-test212.play.bokecc.com/comimage/FAA3DD658CB47E29/2023-11-24/F978EAA4B676690D9C33DC5901307461_thumbnail_000.jpg"
    },
    {
      "url": "//img-test212.play.bokecc.com/comimage/FAA3DD658CB47E29/2023-11-24/F978EAA4B676690D9C33DC5901307461_thumbnail_001.jpg"
    },
    {
      "url": "//img-test212.play.bokecc.com/comimage/FAA3DD658CB47E29/2023-11-24/F978EAA4B676690D9C33DC5901307461_thumbnail_002.jpg"
    }
  ], // 缩略图列表原数据
  "current": { // 请求时间点缩略图信息
    "url": "//img-test212.play.bokecc.com/comimage/FAA3DD658CB47E29/2023-11-24/F978EAA4B676690D9C33DC5901307461_thumbnail_000.jpg", // 雪碧图地址
    "width": 160, // 请求时间点缩略图宽度
    "height": 90, // 请求时间点缩略图高度
    "x": -960, // 请求时间点缩略图在雪碧图中定位x
    "y": -90 // 请求时间点缩略图在雪碧图中定位y
  }
}
```
示例
```
<div id="video-preview" class="video-preview">
    <div id="preview-image" class="preview-image"></div>
</div>
```

```
// 自定义进度控制条mousemove事件
barmousemove: function (e) {
    var thisX = (e || b.event).offsetX;
    var max = this.offsetWidth
    var percent = thisX * 100 / max;
    var previewSecond = parseInt($.DW.getDuration() * parseInt(percent) / 100)
    // 获取视频缩略图
    var videoPreviewData = $.DW.getVideoPreview(previewSecond)
    // 展示视频缩略图
    let videoPreviewLeft = 0
    if (videoPreviewData.videoPreviews.length !== 0){
        videoPreviewLeft = thisX - videoPreviewData.current.width / 2;
    }
    // 边界限制
    if (videoPreviewLeft < 0) {
        videoPreviewLeft = 0;
    }
    if (videoPreviewLeft > max - videoPreviewData.current.width) {
        videoPreviewLeft = max - videoPreviewData.current.width;
    }
    const videoPreviewDOM = document.querySelector('#video-preview')
    videoPreviewDOM.style.display = 'block';
    videoPreviewDOM.style.left = videoPreviewLeft + 'px';
    const previewImageDOM = document.querySelector('#preview-image')
    previewImageDOM.style.width = videoPreviewData.current.width + 'px'
    previewImageDOM.style.height = videoPreviewData.current.height + 'px'
    previewImageDOM.style.backgroundImage = "url('"+ videoPreviewData.current.url +"')"
    previewImageDOM.style.backgroundPosition = videoPreviewData.current.x + "px "  + videoPreviewData.current.y + "px";
}

```


##### 获取当前播放时间

```javascript
$.DW.getPlayerTime();   // 获取当前播放时间
```

##### 获取当前播放时间，毫秒级

```javascript
$.DW.getPlayerSecTime();   // 获取当前播放时间，毫秒级，保留小数点后3位
```

##### 获取视频总时长

```javascript
window.on_cc_live_player_load = function () { // 播放器加载完毕
    console.log($.DW.getDuration()); // 获取视频总时长
};
```

##### 获取缓存

```javascript
$.DW.getBuffer()
```

##### 销毁

```javascript
$.DW.destroy()
```

##### 获取视频画面缩放比例

```javascript
$.DW.getZScale()
```

> 仅支持Flash播放器

##### 设置视频画面缩放比例

```javascript
$.DW.setZScale()
```

> number（0-1），仅支持Flash播放器

##### 获取视频窗口比例

```javascript
$.DW.getScale()
```

> 仅支持Flash播放器

##### 设置视频窗口比例

```javascript
$.DW.setScale()
```

> （"full", "scale43", "scale169", "original"），仅支持Flash播放器

##### 打开设置面板

```javascript
$.DW.openSettingPanel()
```

> 仅支持Flash播放器

#### 控制条

##### 视频控制条切换显示/隐藏状态

```javascript
$.DW.isShowBar(tag)
```

参数说明
<table width="900px">
    <tr  style="background:#F60;color:#FFF">
        <td>参数名称</td>
        <td>参数类型</td>
        <td>说明</td>
        <td>是否必须</td>
    </tr>
    <tr>
        <td>tag</td>
        <td>Number</td>
        <td>
        0：显示控制条<br>
        1：隐藏控制条<br>
            默认为打开
        </td>
        <td>是</td>
    </tr>
</table>

#### 全屏

##### 回放视频切换全屏状态

```javascript
$.DW.switchFullScreen(tag)
```

参数说明
<table width="900px">
    <tr  style="background:#F60;color:#FFF">
        <td>参数名称</td>
        <td>参数类型</td>
        <td>说明</td>
        <td>是否必须</td>
    </tr>
    <tr>
        <td>tag</td>
        <td>Boolean</td>
        <td>
        true：进入全屏<br>
        false：退出全屏
        </td>
        <td>是</td>
    </tr>
</table>

#### 音量

##### 设置音量

```javascript
$.DW.setVolume(volume)
```
参数说明
<table width="900px">
    <tr  style="background:#F60;color:#FFF">
        <td>参数名称</td>
        <td>参数类型</td>
        <td>说明</td>
        <td>是否必须</td>
    </tr>
    <tr>
        <td>volume</td>
        <td>Number</td>
        <td>
        取值范围 0 ~ 1
        </td>
        <td>是</td>
    </tr>
</table>

##### 获取当前音量

```javascript
$.DW.getVolume()
```

#### 倍速

##### 倍速播放

```javascript
$.DW.playbackRate()
```

> 默认1.0 正常速度，倍速设置范围0.5～2倍速，仅支持H5播放器

#### 音频播放

##### 切换音视频模式播放

```javascript
$.DW.onlyAudio(tag) // tag: true 为音频模式, false 为视频模式
```

> 切换音视频首先要 proton 打开 回放支持音频 权限 并且只对开启之后新生成的回放生效

#### 快进快退

##### 快进

```javascript
$.DW.seekForward(time) // time: 20 // 前进的秒数 (正整数)
```

##### 快退

```javascript
$.DW.seekBack(time) // time: 10 // 后退的秒数 (正整数)
```



#### 共享

##### 开始分享流（区域分享/桌面共享）

```javascript
window.on_cc_live_sharestream_start = (data) => {
	// ...
}
```

>  Windows平台 5.5.0开始支持，Mac平台5.6.0开始支持 

返回值

```javascript
{ 
    "time": 2000,  //  相对回放开始点的相对偏移量（毫秒）
    "type": 40  // 40: 区域分享, 50: 桌面共享 
}
```

##### 结束分享流（区域分享/桌面共享）

```javascript
window.on_cc_live_sharestream_end = (data) => {
	// ... 
}
```

>  Windows平台 5.5.0开始支持，Mac平台5.6.0开始支持

返回值

```javascript
{ 
    "time": 3000,  //  相对回放开始点的相对偏移量（毫秒） 
    "type": 40  // 40: 区域分享, 50: 桌面共享 
}
```

#### 截图

#####   截图

```
$.DW.clipVideoImage()
```

> 该方法会截取视频图像，并且返回base64的视频图像的内容(目前只支持h5播放器)

#### 跑马灯

##### 视频显示跑马灯

```javascript
$.DW.showMarquee(marquee)
```

示例

```javascript
var marquee = $("#viewerMarquee").text();
$.DW.getMarquee = function(data) {
    // console.log('getMarquee 跑马灯数据', data)
    if (!!data) {
        marquee = data;
        return;
    }
    marquee = $("#viewerMarquee").text();
    $.DW.showMarquee(marquee);
};
```

#### 记忆播放点

##### 获取记忆播放时间点

> 播放器会默认记录视频上次观看到的时间点。同一浏览器打开同一回放资源，可从上次观看的时间点继续播放。

```javascript
$.DW.getHistoryPlayTime();
```

##### 设置记忆播放时间点

> 设置视频从指定的秒数开始播放。

```javascript
$.DW.setHistoryPlayTime(second);
```

#### 回放试看

##### 获取回放试看时长

```
window.on_cc_player_freetime = function (time) {}
```

time单位为秒

#####  监听回放试看结束

```javascript
window.on_cc_player_freetime_end = function() {}
```

## 文档

### 概述

支持文档翻页、文档自适应、文档显示跑马灯

### 相关API

#### 基本

##### 当前分片文档翻页信息/ 文档缩略图

```javascript
window.on_cc_callback_pages = function (pageData) {}
```

返回值

```javascript
[{ 
    "time": 11,   // 图片时间 
    "url": "http://image.csslcloud.net/image/3CD4C4DF4DF8E0CB9C33DC5901307461/73D088D5AC02E6B1/0.jpg",  // 图片地址
    "docId": "73D088D5AC02E6B1",  // 文档id
    "docName": "英语.pptx",  // 文档名称
    "docNotes": "第一页有多个，这是第一个。", // 文档备注（需PPT中有备注信息，若无则没有该字段）
    "docTotalPage": 11,  // 文档总页数 
    "pageNum": 0,  // 当前页码
    "mode": 0  // 0: 静态文档 1: 普通动画 2: 极速动画
}]
```

##### 翻页信息回调

```javascript
window.on_cc_callback_pagechange = function (data) {}
```

返回值

```javascript
{ 
    "docId": "xxxx",//当前页id 
    "docName": "Java.pdf",//当前页name 
    "docTotalPage": 105,//总页数 
    "pageNum": 0    //当前页索引值 
}
```

##### 文档自适应

> 仅支持PC端

```javascript
$.DW.docAdapt(true); // true为打开自适应，false为关闭，默认为关闭，
```

#### 跑马灯

##### 文档显示跑马灯

```javascript
$.DW.showMarqueeDoc(marquee)
```

示例

```javascript
var marquee;
$.DW.getMarquee = function(data) {
  if (!!data) {
    marquee = data;
    return;
  }
  marquee = $("#viewerMarquee").text();
};
window.on_cc_swf_loading_completed = function() { //需要播放器加载完毕再执行
  setTimeout(function() {
    var marqueeInfo = $.trim(marquee);
    $.DW.showMarqueeDoc(marquee);
  }, 1000);
};
```

## 聊天

### 概述

可获取直播过程中的聊天数据并展示

### 相关API

##### 当前分片聊天信息

```javascript
window.on_cc_live_chat_msg = function (data) {}
```

返回值

```javascript
{ 
    "chatId":"23981",  //聊天消息id                         
    "status":"1",  //聊天消息状态 0:显示 1:不显示                            
    "userid": "7f3a0c7c496a4a2b86d8e51e358193fd",//发送聊天消息的用户ID   
    "username": "老张",//发送聊天消息的用户名称     
    "time": 20,//发送时间 
    "msg": "Hello World.",//聊天内容 
    "useravatar": "http://www.bokecc.com/static/cms/image/cc-video/navlogo-big.png", //发送者头像 
    "userRole": "student",//发送者角色(返回值是 string 或 number); 学生:"student"、4; 助教:"teacher"、2; 讲师:"publisher"、1 
    "groupId"："111",  // 分组信息    
    "usercustommark": "" //用户自定义参数 
}
```

##### 当前时间点聊天信息

```javascript
window.on_cc_live_chat_msg_sync = function (data) {}
```

##### seek时间点之前的聊天数据

```javascript
window.on_cc_seeked_chat_msg = function (data) {}
```

##### 获取自定义表情列表，未开启回放聊天功能时生效

```javascript
window.on_cc_chat_custom_emjio = (data) => {}
```

##### 回放SDK支持聊天-初始化获取聊天记录，每页最多60条

```javascript
window.on_cc_chat_initready_success = (data) => {}
```
返回值
```
[{
	"userid": "d4174294f01c4bf4827040e529a60ad8",  //发送聊天消息的用户ID   
	"username": "助教",  //发送聊天消息的用户名称
	"userrole": "teacher",  // 发送者角色(返回值是 string); student：学生，teacher：助教，publisher：讲师
	"useravatar": "",  // 发送者角色头像
	"groupId": "",  // 分组信息 
	"msg": "信息",  //聊天内容
	"time": "2024-04-22 16:56",  //发送时间 
	"chatId": "6626263bfc412d21e465c981",  //聊天消息id
	"status": 0,   //聊天消息状态 0:显示 1:不显示      
	"filterStatus": 1,  //是否为敏感词; 0: 非敏感词，1: 是敏感词
	"type": "", // 消息类型，'': 普通消息，'commodity': 发送直播带货的卡片
    //----- 以下是 type=commodity 时，涉及的参数
    "goods": {
		"bigIcon": 1,  // 大图标展示,值0表示关闭，1表示开启
		"buttonTxt": "购买", // 按钮文案
		"cover": "", // 商品封面
		"desc": "", // 商品描述
		"id": 4335, // 商品ID
		"link": "http://www.baidu.com", // linkType=0: 通用链接地址
		"linkType": 0, // 0:通用链接，1:多平台链接
		"priceCurrent": "100", // 购买价格
		"priceOriginal": "200", // 划线价格
		"title": "2", // 商品名称
        platformLink: [ // linkType=1: 多平台链接对象(数组)
            {link: "gh_*******", terminal: 4},
            {link: "/pages/index/index", terminal: 5}
        ] 
	},
	"goodsLinkValid": false,
	"wxAppId": "",  // 微信小程序id
	"wxAppPath": "",  // 微信小程序路径  

}]
```
##### 回放SDK支持聊天-上滑加载下一页聊天记录（每页最多60条）

```javascript
window.on_cc_chat_prelist_success = (data) => {}
```
##### 回放SDK支持聊天-上滑加载下一页聊天记录，暂无数据

```javascript
window.on_cc_chat_prelistend_success = () => {}
```

##### 回放SDK支持聊天-定时刷新历史聊天记录接口（获取最新的60条，刷新时间间隔：60s）

```javascript
window.on_cc_chat_rerenderlist_success = (data) => {
    // 返回数据结构同 window.on_cc_chat_initready_success 
}
```

##### 回放SDK支持聊天-获取自定义表情+超级表情列表

```javascript
window.on_cc_chat_emoji_success = (data) => {
    // 自定义表情
    let customEmjObj = data.customEmjObj
    // 超级表情
    let superEmjObj = data.superEmjObj
}
```

## 问答

### 概述

可获取直播过程中的问答信息并展示

### 相关API

##### 当前分片提问信息

```javascript
window.on_cc_live_qa_question = function (data) {
    const { value } = data;
}
```

返回值

```javascript
{ 
    "action": "question", 
    "value": {       
        "id": "49CE0XF718D5AA52",//问题ID 
        "content": "我从哪里来？",//问题内容 
        "userId": "92aa0c1965d842ec9b443270f5734124",//提问者ID        
        "userName": "T",//提问者名称        
        "groupId"："111", //分组信息 
        "userAvatar": "http://www.bokecc.com/static/cms/image/cc-video/navlogo-big.png",//提问者头像   
        "isPublish": 1//该问题是否已发布，1：已发布，0：未发布", 
    }
}
```

#####  当前分片回答信息

```javascript
window.on_cc_live_qa_answer = function (data) {
    const { value } = data;
}
```

 返回值

```javascript
{  
    "action": "answer",  
    "value": {        
        "questionId": "49CE0XF718D5AA52", //问题ID        
        "content": "石头里",//回答内容        
        "isPrivate": 1,//是否是私密回答，1：私密回答，0：公共回答         
        "userId": "71120e4cc905425f8da91945c7df2df6",//回答者用户ID 
        "userName": "孙悟空",//回答者名称      
        "groupId"："111", //分组信息       
        "userAvatar": "",//回答者头像         
        "userRole": "回答者角色，teacher：助教，publisher：讲师"//回答者角色 
    }
}
```

## 互动

### 概述

可获取直播过程中的广播、随堂测数据并展示

### 相关API

#### 广播

##### 当前分片广播信息

```javascript
window.on_cc_live_broadcast_msg = function (data) {}
```

返回值

```javascript
{ 
    content: "大家好",//广播内容 
    time: 205 //广播时间 
}
```



##### 同步显示广播信息

```javascript
window.on_cc_live_broadcast_msg_sync = function (data) {
    const { content, time } = data
}
```

返回值

```javascript
[{ 
    content: "大家好",//广播内容 
    time: 205 //广播时间 
}]
```

#### 随堂测

##### 根据回放时间获取随堂测信息（开启此功能需要联系管理员）

```javascript
window.on_cc_practice_start = (data) => { // 随堂测发布
  console.log('on_cc_practice_start', data)
}
window.on_cc_practice_stop = (data) => { // 随堂测结束答题
  console.log('on_cc_practice_stop', data)
}
window.on_cc_practice_close = (data) => { // 随堂测结束答题
  console.log('on_cc_practice_stop', data)
}
window.on_cc_practice_reset = () => { // 随堂测状态重置，回放seek时触发，表示当前没有正在进行的随堂测
  console.log('on_cc_practice_reset')
}
```

data数据说明

```javascript
{
    "closeTime": 22, // 随堂测关闭的相对时间
    "id": "DF0236B91AECD81C", // 随堂测ID
    "options": [ // 选项数据
        {
            "index": 0,
            "isCorrect": 1 // 是否为正确答案
        },
        {
            "index": 1,
            "isCorrect": 0
        },
        {
            "index": 2,
            "isCorrect": 0
        },
        {
            "index": 3,
            "isCorrect": 0
        }
    ],
    "publishTime": "2026-02-26 15:38:27", // 随堂测发布的绝对时间
    "ranking": [ // 直播中随堂测答题的排行信息，回放中可忽略
      {
        "costTime": 5,
        "userId": "6d69e4dd0459434a9d67760648a5040b",
        "userName": "游客-040b"
			}
    ],
    "statistic": { // 直播中随堂测答题的统计信息，回放中可忽略
        "answerCount": 0,
        "correctCount": 0,
        "optionsStatistic": [
            {
                "chooseCount": 0,
                "choosePercent": "0%",
                "index": 0
            },
            {
                "chooseCount": 0,
                "choosePercent": "0%",
                "index": 1
            },
            {
                "chooseCount": 0,
                "choosePercent": "0%",
                "index": 2
            },
            {
                "chooseCount": 0,
                "choosePercent": "0%",
                "index": 3
            }
        ]
    },
    "stopTime": 21, // 随堂测停止的相对时间
    "time": 17, // 随堂测发布的相对时间
    "type": 1 // 1单选、2多选、0判断
}
```

随堂测选项渲染说明：

```JavaScript
const context1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
const context2 = ['对', '错']
type为1、2时，通过选项的index匹配context1进行展示
type为0是，通过选项的index匹配context2进行展示
```

##### 获取随堂测信息

```javascript
$.DW.getReplayPractice()
```

##### 随堂测请求成功后回调

```javascript
window.on_hdReplay_practice_info = function (data) {}
```

返回值

```javascript
{ 
    success:true，//是否成功 
    msg:"数据获取成功",//消息 
        errorCode:0,//错误码 0 表示正常 
            datas:{ 
                practiceInfo:[ 
                    { 
                        statistic:{ //统计数据 
                            id:"754251300D86E12B",//统计随堂测id 
                            type:1,//随堂测类型（判断：0，单选：1，多选：2）
                            status:1,//状态值 
                            answerPersonNum:100,//回答人数 
                            correctPersonNum:10,//回答正确人数 
                            correctRate:"10%",//正确率 
                            options:[ 
                                { 
                                    index:0, 
                                    id:"2715AA75469DCD54",//选项id 
                                    isCorrect:1,//是否正确选项（1：是   0：否）
                                    count:5,//此选项选择人数 
                                    percent:"5%"//此选项选择人数百分比             
                                } 
                                ...
                            ]//选项 
                        },
                        rank:{//排名 
                            id:"754251300D86E12B",//随堂测id 
                            ranking:[ 
                                { 
                                    viewerId:"29312",//观看者id 
                                    viewerName:"abc",//观看者名称 
                                    costTime:"22"//耗时 
                                } 
                                ...
                            ]        
                        }, 
                        base:{//基础信息 
                            id:"754251300D86E12B",//随堂测id 
                            type:1,//随堂测类型（判断：0，单选：1，多选：2）
                            status:1,//状态（正在发布：1  已停止：2）
                            publishTime:"2019-11-22 14:08:44",//发布时间 
                            recordId:"D2BBC2DeA",//回放id 
                            recordTime:20,//相对于回放开始时长 
                            stopRecordTime:30,//相对于回放开始停止时长 
                            closeRecordTime:40,//相对于回放开始关闭时长 
                            options:[//选项 
                                { 
                                    index:0,// 
                                    id:"2715AA75469DCD54",//选项id 
                                    isCorrect:1//是否正确（1：正确0：错误）
                                }
                                ...
                            ] 
                        } 
                    } 
                    ... 
                ] 
            } 
}
```


#### 字幕

##### 获取字幕信息
> 此功能依赖云点播字幕能力，需要开启云点播相关的权限。<br/>

```javascript
1、vunion：开启："音频转写" + "上传字幕" 权限（语音转写时长大于0）；
2、admin后台：云点播开启"全局设置-语音转写设置"开关；
3、admin后台：云直播编辑字幕，入口："直播间设置-回放管理-字幕"；
```

##### 字幕请求成功后回调

```javascript
window.on_cc_video_subtitles = function (data) {}
```

返回值

```javascript
{
    "subtitlemodel": 1,       // 字号是固定字号还是自适应,  1-自适应、0-固定字号
    "subtitlefontsize": 16,   // 默认字号
    "defaultVtt": 0,          // 默认字幕 vttList 的索引
    "vttList": [
        {
            "cssStyle": "font-family:微软雅黑,Microsoft YaHei; font-size:16px ;color:#666666; text-shadow:0px 0px 2px #000000; ", // 字幕样式，包含：font-family-字体、font-size-字号、color-字体颜色、text-shadow-文字阴影
            "vttName": "字幕1",  // 字幕名称
            "vttUrl": "https://1-material.bokecc.com/material/CDEBFAB2DCC10433/*****.vtt" // 字幕的远程文件地址
        },
        {
            "cssStyle": "font-family:微软雅黑,Microsoft YaHei; font-size:16px ;color:#666666; text-shadow:0px 0px 2px #000000; ",
            "vttName": "字幕2",
            "vttUrl": "https://1-material.bokecc.com/material/CDEBFAB2DCC10433/*****.vtt"
        }
    ]
}
```

## 备注与说明

### 关于回放数据分片策略的调整

#### 重要提示：

本次更新为优化回放数据的响应速度，减少文档白屏时间，升级了回放数据的处理策略， 将回放数据进行静态化存储，回放数据将按照固定大小（约512kb）被分割为不同的分片，静态化存储为json文件。

分片加载策略：默认会请求第一个分片数据，其他分片会提前五分钟预加载，当seek播放时如果当前时间点的数据还未被请求则会触发该分片加载，请注意，如果seek时间跨度较大有可能出现跨分片的情况，此时只会处理seek时间点所在的分片

该策略主要影响以下响应事件，请重点关注

<table width="900px">
<tr style="background:#F60;color:#FFF">
	<td>API</td>
	<td>Before</td>
	<td>After</td>
</tr>
<tr>
	<td>on_cc_live_chat_msg</td>
	<td>全部聊天信息</td>
	<td>当前分片聊天信息</td>
</tr>
  <tr>
	<td>on_cc_live_chat_msg_sync</td>
	<td>同步显示聊天信息（包括当前时间点之前未渲染的数据）</td>
	 <td>仅返回当前时间点聊天信息</td>
  </tr>
  <tr>
	<td>on_cc_seeked_chat_msg</td>
	<td>无</td>
	<td>seek时间点之前的聊天数据</td>
  </tr>
  <tr>
	<td>on_cc_live_broadcast_msg</td>
	<td>全部广播信息</td>
	<td>当前分片广播信息</td>
  </tr>
  <tr>
	<td>on_cc_live_qa_question</td>
	<td>全部提问信息</td>
	<td>当前分片提问信息</td>
  </tr>
  <tr>
	<td>on_cc_live_qa_answer</td>
	<td>全部回答信息</td>
	<td>当前分片回答信息</td>
  </tr>
  <tr>
	<td>on_cc_callback_pages</td>
	<td>所有文档翻页信息</td>
	 <td>当前分片文档翻页信息</td>
  </tr>
  <tr>
	<td>on_cc_callback_pages</td>
	<td>所有文档缩略图</td>
	<td>当前分片文档缩略图</td>
  </tr>
 </table>

#### 升级指南

本次升级不会影响回放顺序播放的数据渲染，主要在seek播放时数据有可能会有些差异，如果针对seek操作时的数据渲染有时间排序要求，可参考以下建议：

1.针对要接收的数据增加本地数组存储，新增数据时判断其时间是否大于最后一条数据的时间，若小于则对本地数据进行排序处理，排序后再进行渲染。

2.如果聊天数据要求跟随进度条进度渲染需要同时注册on_cc_live_chat_msg_sync、on_cc_seeked_chat_msg，接收到on_cc_seeked_chat_msg数据时替换渲染数组，接收到on_cc_live_chat_msg_sync数据时追加到渲染数组中。

注：广播、文档翻页数据一般不会被分片

### 部分回调对推流客户端版本有要求

流类型详情回调（on_cc_live_streaminfo）、分享流开始回调（on_cc_live_sharestream_start）、分享流结束回调（on_cc_live_sharestream_end）的数据采集对推流客户端版本有要求，Windows平台 5.5.0开始支持，Mac平台5.6.0开始支持

### userRole和fromuserrole对应关系

如下表：  

 <table>
 	<tr>
 		<td>unknow</td>
    	<td>未知角色</td>
    </tr>
     <tr>
         <td>publisher</td>
         <td>主讲</td>
	</tr>
     <tr>
         <td>teacher</td>
         <td>助教</td>
     </tr>
     <tr>
     	<td>host</td>
         <td>主持人</td>
     </tr>
     <tr>
     	<td>student</td>
         <td>学员（观众）</td>
     </tr>
</table>
