回放SDK
[TOC]
房间
概述
可获取直播间当前流类型信息、监听用户登录成功、失败
相关API
信息
当前流类型信息
window.on_cc_live_streaminfo = function(data){}
Windows平台 5.5.0开始支持,Mac平台5.6.0开始支持
返回值
{
"time": 1000, // 相对回放开始点的相对偏移量(毫秒)
"type": 10 // 10: 摄像头, 20: 图片, 30: 插播视频, 40: 区域分享, 50: 桌面共享, 60: 自定义场景
}
用户
登录成功
window.on_cc_login_success = function(data){}
返回值
{
template:{
desc:"视频", //模板描述信息
name:"模板一",//模板名称
type:"1" //模板类型 (1:大屏模式 ,2:问答、视频、聊天 ,3:视频、聊天,4:文档、视频。聊天,5:视频、文档、问答、聊天,6:视频、问答
},
viewer:{
id:"ae4dec",// 观看者id
groupId:"1",// 观看者分组id
name:"名称" // 观看者名称
}
}
登录失败
window.on_cc_login_error = function(error){}
直播间配置
获取直播间配置
window.cc_get_room_setting = function(data){
const { replay } = data
consle.log(`直播间配置详情为:${replay.settings}`)
}
返回值详情
{
"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个字符)
...
}
}
...
}
播放器
概述
可监听播放器加载完成、准备完成、播放开始、暂停、恢复、停止事件;可获取回放打点、跳转到指定时间播放、获取当前播放时间、获取视频总时长; 可监听讲师端启动区域分享/桌面共享的开始、结束事件 支持记忆上次观看时间
相关API
基本
播放器加载完成
window.on_cc_live_player_load = function () {}
播放器准备完成
window.on_cc_player_ready = function () {}
开始观看回放
window.on_cc_callback_play = function () {
console.log('回放开始播放了')
}
播放开始
仅支持PC端
window.on_player_start = function () {}
播放暂停
仅支持PC端
window.on_spark_player_pause = function () {}
恢复播放
仅支持pc端
window.on_spark_player_resume = function () {}
播放停止
仅支持pc端
window.on_spark_player_end = function () {}
回放打点
window.on_cc_loadDotPointsData = function (data) {
console.log(data)
}
data: [
{
time: 0 // s
desc: 'xxxx'
}
]
播放暂停
$.DW.play()
跳转到指定时间播放
$.DW.seek(time, status, callback) // 跳转到指定时间播放,time单位为秒
参数说明
参数名称 | 参数类型 | 说明 | 是否必须 |
time | Number | 单位秒 | 是 |
status | String |
'play': 完成seek后播放回放 'pause': 完成seek后暂停回放 |
否 |
callback | Function | 完成seek后执行的回调函数 | 否 |
获取视频缩略图
回放生成缩略图需要联系客服开通 缩略图预览 权限 生成的回放缩略图是一张1600x900的大雪碧图,为10分钟的截图数据,6秒截一张图,每张小图大小160x90,共10行10列,需要使用css定位展示对应时间点小图
$.DW.getVideoPreview(time) // 获取指定时间的视频缩略图信息, time单位为秒
返回值说明
{
"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";
}
获取当前播放时间
$.DW.getPlayerTime(); // 获取当前播放时间
获取当前播放时间,毫秒级
$.DW.getPlayerSecTime(); // 获取当前播放时间,毫秒级,保留小数点后3位
获取视频总时长
window.on_cc_live_player_load = function () { // 播放器加载完毕
console.log($.DW.getDuration()); // 获取视频总时长
};
获取缓存
$.DW.getBuffer()
销毁
$.DW.destroy()
获取视频画面缩放比例
$.DW.getZScale()
仅支持Flash播放器
设置视频画面缩放比例
$.DW.setZScale()
number(0-1),仅支持Flash播放器
获取视频窗口比例
$.DW.getScale()
仅支持Flash播放器
设置视频窗口比例
$.DW.setScale()
("full", "scale43", "scale169", "original"),仅支持Flash播放器
打开设置面板
$.DW.openSettingPanel()
仅支持Flash播放器
控制条
视频控制条切换显示/隐藏状态
$.DW.isShowBar(tag)
参数说明
参数名称 | 参数类型 | 说明 | 是否必须 |
tag | Number |
0:显示控制条 1:隐藏控制条 默认为打开 |
是 |
全屏
回放视频切换全屏状态
$.DW.switchFullScreen(tag)
参数说明
参数名称 | 参数类型 | 说明 | 是否必须 |
tag | Boolean |
true:进入全屏 false:退出全屏 |
是 |
音量
设置音量
$.DW.setVolume(volume)
参数说明
参数名称 | 参数类型 | 说明 | 是否必须 |
volume | Number | 取值范围 0 ~ 1 | 是 |
获取当前音量
$.DW.getVolume()
倍速
倍速播放
$.DW.playbackRate()
默认1.0 正常速度,倍速设置范围0.5~2倍速,仅支持H5播放器
音频播放
切换音视频模式播放
$.DW.onlyAudio(tag) // tag: true 为音频模式, false 为视频模式
切换音视频首先要 proton 打开 回放支持音频 权限 并且只对开启之后新生成的回放生效
快进快退
快进
$.DW.seekForward(time) // time: 20 // 前进的秒数 (正整数)
快退
$.DW.seekBack(time) // time: 10 // 后退的秒数 (正整数)
共享
开始分享流(区域分享/桌面共享)
window.on_cc_live_sharestream_start = (data) => {
// ...
}
Windows平台 5.5.0开始支持,Mac平台5.6.0开始支持
返回值
{
"time": 2000, // 相对回放开始点的相对偏移量(毫秒)
"type": 40 // 40: 区域分享, 50: 桌面共享
}
结束分享流(区域分享/桌面共享)
window.on_cc_live_sharestream_end = (data) => {
// ...
}
Windows平台 5.5.0开始支持,Mac平台5.6.0开始支持
返回值
{
"time": 3000, // 相对回放开始点的相对偏移量(毫秒)
"type": 40 // 40: 区域分享, 50: 桌面共享
}
截图
截图
$.DW.clipVideoImage()
该方法会截取视频图像,并且返回base64的视频图像的内容(目前只支持h5播放器)
跑马灯
视频显示跑马灯
$.DW.showMarquee(marquee)
示例
var marquee = $("#viewerMarquee").text();
$.DW.getMarquee = function(data) {
// console.log('getMarquee 跑马灯数据', data)
if (!!data) {
marquee = data;
return;
}
marquee = $("#viewerMarquee").text();
$.DW.showMarquee(marquee);
};
记忆播放点
获取记忆播放时间点
播放器会默认记录视频上次观看到的时间点。同一浏览器打开同一回放资源,可从上次观看的时间点继续播放。
$.DW.getHistoryPlayTime();
设置记忆播放时间点
设置视频从指定的秒数开始播放。
$.DW.setHistoryPlayTime(second);
回放试看
获取回放试看时长
window.on_cc_player_freetime = function (time) {}
time单位为秒
监听回放试看结束
window.on_cc_player_freetime_end = function() {}
文档
概述
支持文档翻页、文档自适应、文档显示跑马灯
相关API
基本
当前分片文档翻页信息/ 文档缩略图
window.on_cc_callback_pages = function (pageData) {}
返回值
[{
"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: 极速动画
}]
翻页信息回调
window.on_cc_callback_pagechange = function (data) {}
返回值
{
"docId": "xxxx",//当前页id
"docName": "Java.pdf",//当前页name
"docTotalPage": 105,//总页数
"pageNum": 0 //当前页索引值
}
文档自适应
仅支持PC端
$.DW.docAdapt(true); // true为打开自适应,false为关闭,默认为关闭,
跑马灯
文档显示跑马灯
$.DW.showMarqueeDoc(marquee)
示例
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
当前分片聊天信息
window.on_cc_live_chat_msg = function (data) {}
返回值
{
"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": "" //用户自定义参数
}
当前时间点聊天信息
window.on_cc_live_chat_msg_sync = function (data) {}
seek时间点之前的聊天数据
window.on_cc_seeked_chat_msg = function (data) {}
获取自定义表情列表
window.on_cc_chat_custom_emjio = (data) => {}
问答
概述
可获取直播过程中的问答信息并展示
相关API
当前分片提问信息
window.on_cc_live_qa_question = function (data) {
const { value } = data;
}
返回值
{
"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:未发布",
}
}
当前分片回答信息
window.on_cc_live_qa_answer = function (data) {
const { value } = data;
}
返回值
{
"action": "answer",
"value": {
"questionId": "49CE0XF718D5AA52", //问题ID
"content": "石头里",//回答内容
"isPrivate": 1,//是否是私密回答,1:私密回答,0:公共回答
"userId": "71120e4cc905425f8da91945c7df2df6",//回答者用户ID
"userName": "孙悟空",//回答者名称
"groupId":"111", //分组信息
"userAvatar": "",//回答者头像
"userRole": "回答者角色,teacher:助教,publisher:讲师"//回答者角色
}
}
互动
概述
可获取直播过程中的广播、随堂测数据并展示
相关API
广播
当前分片广播信息
window.on_cc_live_broadcast_msg = function (data) {}
返回值
{
content: "大家好",//广播内容
time: 205 //广播时间
}
同步显示广播信息
window.on_cc_live_broadcast_msg_sync = function (data) {
const { content, time } = data
}
返回值
[{
content: "大家好",//广播内容
time: 205 //广播时间
}]
随堂测
获取随堂测信息
$.DW.getReplayPractice()
随堂测请求成功后回调
window.on_hdReplay_practice_info = function (data) {}
返回值
{
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:错误)
}
...
]
}
}
...
]
}
}
字幕
获取字幕信息
此功能依赖云点播字幕能力,需要开启云点播相关的权限。
1、vunion:开启:"音频转写" + "上传字幕" 权限(语音转写时长大于0);
2、admin后台:云点播开启"全局设置-语音转写设置"开关;
3、admin后台:云直播编辑字幕,入口:"直播间设置-回放管理-字幕";
字幕请求成功后回调
window.on_cc_video_subtitles = function (data) {}
返回值
{
"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时间点所在的分片
该策略主要影响以下响应事件,请重点关注
API | Before | After |
on_cc_live_chat_msg | 全部聊天信息 | 当前分片聊天信息 |
on_cc_live_chat_msg_sync | 同步显示聊天信息(包括当前时间点之前未渲染的数据) | 仅返回当前时间点聊天信息 |
on_cc_seeked_chat_msg | 无 | seek时间点之前的聊天数据 |
on_cc_live_broadcast_msg | 全部广播信息 | 当前分片广播信息 |
on_cc_live_qa_question | 全部提问信息 | 当前分片提问信息 |
on_cc_live_qa_answer | 全部回答信息 | 当前分片回答信息 |
on_cc_callback_pages | 所有文档翻页信息 | 当前分片文档翻页信息 |
on_cc_callback_pages | 所有文档缩略图 | 当前分片文档缩略图 |
升级指南
本次升级不会影响回放顺序播放的数据渲染,主要在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对应关系
如下表:
unknow | 未知角色 |
publisher | 主讲 |
teacher | 助教 |
host | 主持人 |
student | 学员(观众) |