| 日期 | 版本号 | 更新内容 | 备注 |
|---|---|---|---|
| 2016-11-10 | 1.0.0 | 初稿,支持观看端聊天 | 下载旧版文档 |
| 2016-12-02 | 2.0.0 | 新增观看端问答&对1.0.0版本优化 | |
| 2017-01-08 | 2.1.0 | 新增观看端视频与文档模块(仅只支持移动端) | |
| 2017-02-13 | 2.3.0 | 内部小优化,不影响以前版本的使用 | |
| 2017-03-13 | 2.3.1 | 支持https | |
| 2017-03-15 | 2.3.2 | 修复2.3.1拉取回放历史聊天数据bug | |
| 2017-08-11 | 2.3.3 | 新增PC端观看视频和文档 | |
| 2017-08-14 | 2.3.3 | 新增点播上传模块 | |
| 2017-09-28 | 2.3.3 | 新增公告和签到功能 | |
| 2017-10-12 | 2.3.3 | 新增自定义消息类型功能 | |
| 2017-10-20 | 2.3.3 | 新增子账号点播上传功能 | |
| 2017-10-31 | 2.3.3 | 修复2.3.3上传纯音频文件无法播放 |
注:2.0.0及以上版本对1.0.0版本进行了优化,在已使用1.0.0版本的情况下如需使用2.0.0及以上版本的新增功能,需按照本版本更新相应代码
本文档为了指导开发者更快使用微吼直播的“自助式网络直播服务SDK”通过引用JS的方式开发自己的PC网页以及H5来对接微吼直播平台,默认读者了解前端开发并拥有JavaScript基础,如需在移动端使用视频模块同时要求开发者了解HTML5 Video标签与Media标签的使用。
目前支持的功能如下:
| 分类 | 功能 | 描述 |
|---|---|---|
| 聊天 | 观看端聊天 | 支持在直播时聊天和观看回放时聊天 |
| 问答 | 观看端问答 | 支持观看直播时提问和收取问答 |
| 视频 | 观看端视频 | 支持移动端和PC端观看直播视频和回放视频 |
| 文档 | 观看端文档 | 支持移动端和PC端观看文档演示(移动端不支持文档笔触信息) |
| 点播 | 视频文件上传 | 支持单视频上传、显示文件名称、断点续传功能、上传进度条和百分比、视频不同格式上传和准备、上传中、成功及错误反馈状态 、子账号点播上传 |
| 签到 | 观看端签到 | 支持用户观看直播时签到的功能 |
| 公告 | 观看端公告 | 支持观看端显示公告消息以及查看历史公告 |
| 消息 | 自定义消息类型 | 支持针对不同的消息类型进行了区分设计,观众在提交消息时会带上指定的消息类型,其他观众在接收到消息时会根据消息类型展示不同的效果。 |
请点击API&SDK权限申请 立即沟通申请,申请后客户经理会在线上与您直接联系。
审核通过后,可以生成开发应用所需的App_Key 立即查看。
本SDK依赖于JQuery库,请在需要引入JQuery的页面按以下代码示例进行引入,对JQuery版本没有要求
<script src="http://cnstatic01.e.vhall.com/3rdlibs/jquery/1.11.2/jquery.min.js" type="text/javascript"></script>
在需要调用SDK的页面插入以下代码以引入JS文件:
<script type="text/javascript" src="http://cnstatic01.e.vhall.com/jssdk/dist/2.3.3/vhallSDK.js"></script>
支持https
注:支持使用AMD/CMD标准模块加载规范加载
请使用以下的方法和参数进行SDK的初始化以及权限的验证
VHALL_SDK.init({
account : '',//必填,唯一用户id,与使用第三方创建用户接口所传的third_user_id需一致)
email : '',//参数必填,值可为空,用于与嵌入视频区用户同步
username : '',//必填,用户昵称用以在各模块中显示
roomid :'',//必填,当前聊天所在活动id
app_key :'',//必填,启用服务唯一验证,API/SDK权限申请后生成,此参数名在1.0.0版本中为appkey,使用当前版本时请更新
signedat :'',//必填,启用服务唯一验证,unix时间戳
sign :'',//必填,启用服务唯一验证,有效期一小时,见下面的生成规则
facedom :'',//可选,当使用微吼表情时必填,呼出表情弹窗dom属性 如('#id','.class'等)
textdom : '',//可选,当使用微吼表情时必填,插入表情文本dom属性 如('#id','.class'等)
videoContent : '',//【新】可选,当需要使用视频模块时,插入视频dom属性 如('#id','.class'等)
docContent: '',//【新】可选,当需要使用文档模块时,插入视频dom属性 如('#id','.class'等)
});
注:如使用了网页嵌入,为确保嵌入页面的用户与SDK各模块中的用户是同一个用户,请尽量传入与视频区嵌入相同的email参数,否则会被统计成两个不同的用户
以上参数sign由PHP生成,其生成规则如下:
将account、email、username、roomid、app_key以及signedat这些参数:
| 1 | 按参数名升序排列 |
| 2 | 然后按参数名1+参数值+参数名2+参数值拼接 |
| 3 | 在首尾各加上secret_key |
| 4 | 计算md5作为sign |
示例如下
<?php
$secret_key = "f145b675f441cc00dd3e55746a0f4780";
$params = [
"roomid"=> "123456789",
"account"=> "12345",
"email"=> "zhangsan@vhall.com",
"username"=> "zhangsan",
"app_key"=> "3eb72619af748d73f7fda1e6b0c692a9",
"signedat"=> "1484620708"
];
// 按参数名升序排列
ksort($params);
// 将键值组合
array_walk($params,function(&$value,$key){
$value = $key . $value;
});
// 拼接,在首尾各加上$secret_key,计算MD5值
$sign = md5($secret_key . implode('',$params) . $secret_key);
// 结果形如
// $sign=md5("f145b675f441cc00dd3e55746a0f4780account12345app_key3eb72619af748d73f7fda1e6b0c692a9emailzhangsan@vhall.comroomid123456789signedat1484620708usernamezhangsanf145b675f441cc00dd3e55746a0f4780");
// 计算结果
// $sign = '92eec52c58b9bddc0ba663c75a3c1f7f'; //签名有效期只有一个小时
VHALL_SDK初始化时服务端返回的错误码
| 错误码 | 说明 |
|---|---|
| 1001 | 活动不存在 |
| 1002 | 用户昵称不能空 |
| 1003 | 用户id不能空 |
| 1004 | appkey不存在 |
| 1005 | 签名验证超时 |
| 1006 | 签名错误 |
| 1007 | 当前活动不是该appkey下所属活动 |
| 1008 | 超出套餐使用量 |
| 1009 | 该视频正在转码中 |
| 1010 | 该视频转码失败 |
| 1011 | 该视频正在审核中 |
| 1012 | 该视频已下线,有疑问请联系客服 |
对上述内容中所提appkey、app_key以及secret_key三个参数的说明:
聊天和问答需要获取用户标识与头像,需提前使用第三方创建用户接口创建用户,如传入的第三方用户信息未匹配到用户标识,将自动进行创建,并默认为游客以及使用微吼的默认头像。目前聊天和问答模块只支持观看端,如需要进行管理操作(禁言、踢出、过滤以及回答等功能),请前往微吼平台上进行操作
视频模块目前只支持移动端,需在页面上自行添加HTML5的video标签,样式自行定义,播放相关事件使用的是HTML5中 video标签和 media标签的原生事件
主要调用API
| API | 说明 | 返回内容 |
|---|---|---|
| getRoominfo() | 获取当前活动状态 | 活动相关的状态信息 |
| getUserinfo() | 获取当前用户参会信息 | 用户参会的信息 |
| player.setPlayerDefinition(name) | 设置播放清晰度,值来自于canPlayDefinitions事件中的msg的键 | 切换播放清晰度 |
| player.setPlayerLine(name) | 设置播放线路,值来自于canPlayLines事件中的msg的键 | 切换播放线路 |
| sendChat({text:' '}) | 聊天消息发送,text:消息文本,长度限制为140个字符 | 组装好的聊天数据 |
| sendQuestion({text:' '}) | 提问问题发送,text:问题文本,长度限制为140个字符 | 组装好的提问数据 |
| vhall_get_live_history_chat_msg() | 获取直播聊天历史记录 | 请求后触发事件vhall_live_history_chat_msg |
| getQuestionlist() | 获取问答记录 | 请求后触发事件getQuestionList |
| vhall_get_record_history_chat_msg(curr_page) | 回放拉取历史聊天,curr_page:需拉取数据的页数,每页20条 | |
| vhall_get_history_notice(curr_page) | 获取历史直播公告记录,curr_page:需拉取数据的页数,默认值为1,每页20条 | |
| sendSign(签到ID) | 发送签到请求,值来自于startSign事件中的msg的消息体sign_id | |
| sendCustomEvent(data) | 发送用户自定义广播消息,data类型为object,可自定义,如{type:'xxx_event',data:{id:1,name:'test'}},data大小限制为JSON字符串长度不能大于200 |
响应事件API
| API | 说明 |
|---|---|
| ready | SDK准备就绪后触发事件,全局事件 |
| error | SDK调用错误事件消息,全局事件 |
| playerReady | 播放器准备就绪后触发事件,全局事件 |
| streamOver | 直播活动结束,全局事件 |
| publishStart | 活动开始推流,全局事件 |
| canPlayLines | 获取视频可播放线路,播放器事件 |
| canPlayDefinitions | 获取视频可播放清晰度,播放器事件 |
| userOnline | 用户上线事件消息 |
| userOffline | 用户下线事件消息 |
| chatMsg | 收到直播聊天消息事件 |
| sendChat | 发送聊天消息后触发事件 |
| disadbleChat | 直播禁言消息 |
| permitChat | 直播恢复禁言消息 |
| forbidchat | 直播全员禁言消息,1为全员禁言,0为恢复全员禁言 |
| kickout | 直播踢出消息 |
| kickoutrestore | 直播恢复踢出消息 |
| vhall_live_history_chat_msg | 拉取直播历史消息后触发事件 |
| vhall_record_history_chat_msg | 拉取回放历史消息后触发事件 |
| questionSwitch | 问答开关消息 |
| sendQuestion | 问答消息发送事件 |
| questionMsg | 收到问答消息,只包含用户能接收的问答消息 |
| getQuestionList | 拉取直播问答消息后触发事件 |
| sendSign | 发送签到请求后触发事件 |
| startSign | 接收到签到消息后触发事件 |
| vhall_history_notice | 拉取历史直播公告消息后触发事件 |
| announcement | 收到公告消息时候触发 |
| sendCustomEvent | 发送用户自定义广播消息请求后触发 |
| customEvent | 接收到用户自定义广播消息后触发事件 |
VHALL_SDK客户端错误代码
| 错误码 | 说明 |
|---|---|
| 10000 | 消息体格式不对 |
| 10001 | 消息体为空 |
| 10002 | 当前用户被禁言 |
| 10003 | 聊天输入不能超过140个字符 |
| 10004 | 当前已开启全员禁言 |
| 10005 | 当前活动不是直播状态 |
| 10006 | 当前活动未开启问答 |
| 20000 | 接口请求成功 |
| 20005 | 接口请求失败 |
| 10007 | 当前用户被踢出 |
| 50400 | 用户身份认证错误 |
| 50401 | 用户发送消息频次超过限制 |
| 50402 | 活动xxx发送消息频次超过限制 |
| 50403 | 自定义广播消息内容长度超过限制 |
主要代码示例
SDK准备就绪后触发事件
/**
* [ready sdk准备就绪]
*/
VHALL_SDK.on('ready', function() {
VHALL_SDK.getUserinfo();
/**
* {
* avatar:"//cnstatic01.e.vhall.com/static/images/watch/head50.png" //头像
* forbidchat:"" //0:未开启全员禁言,1:已开启全员禁言
* is_gag:0 //0:未禁言,1:禁言
* is_kickout:0 //0:未踢出,1:踢出
* role:"user"//用户角色
* userid:"用户参会id"
* username:"昵称"
* }
*/
VHALL_SDK.getRoominfo();
/**
* {
* type: 1 // 1:活动直播中,2:预约中,3:活动结束
* openQuestion : 1 //1: 开启,0 || '':关闭
* }
*/
});
SDK调用错误事件
/**
* [error sdk调用错误事件]
* @param {[type]} msg [description]
*/
VHALL_SDK.on('error', function(msg) {
console.log(msg);
});
播放器就绪后触发事件
VHALL_SDK.on("playerReady", function(){
/**
* 可播线路消息
*/
VHALL_SDK.player.on('canPlayLines', function(msg) {
var _src = '';
// i 的值为之后调用方法VHALL_SDK.player.setPlayerLine的传参
for (var i in msg) {
_src += '<li>' + i + '</li>';
}
$("#lines").html(_src).find("li").eq(0).addClass('active');
});
/**
* 可播清晰度消息
*/
VHALL_SDK.player.on('canPlayDefinitions', function(msg) {
var _src = '';
// i 的值为之后调用方法VHALL_SDK.player.setPlayerDefinition的传参
for (var i in msg) {
_src += '<li>' + i + '</li>';
}
$("#definitions").html(_src).find("li").eq(0).addClass('active');
});
});
活动开始推流
VHALL_SDK.on('publishStart', function(msg) {
alert('活动开始推流');
});
直播结束
VHALL_SDK.on('streamOver', function(msg) {
alert('活动已结束');
});
用户上线
/**
* [userOnline 用户上线]
* @param {[type]} msg [description]
*/
VHALL_SDK.on('userOnline', function(msg) {
console.log(msg);
});
用户下线
/**
* [userOffline 用户下线]
* @param {[type]} msg [description]
*/
VHALL_SDK.on('userOffline', function(msg) {
console.log(msg);
});
收到直播聊天消息
/**
* [chatMsg 直播收到聊天消息]
* @param {[type]} msg [object]
*/
VHALL_SDK.on('chatMsg', function(msg) {
console.log(msg);
});
直播消息发送后触发事件
/**
* [sendChat 直播消息发送后事件]
*/
VHALL_SDK.on('sendChat, function(msg) {
console.log(msg);
});
问答消息发送后触发事件
/**
* [sendQuestion 直播问答消息发送事件]
*/
VHALL_SDK.on('sendQuestion, function(msg) {
console.log(msg);
});
直播禁言消息
/**
* [disadbleChat 直播禁言消息]
* @param {[type]} [禁言用户id]
*/
VHALL_SDK.on('disadbleChat', function(userid) {
console.log(userid);
});
直播恢复禁言消息
/**
* [forbidchat 直播全员禁言消息]
* @param {[type]} status [1:开启,0:关闭]
*/
VHALL_SDK.on('forbidchat', function(status) {
console.log(status);
});
直播踢出消息
/**
* [kickout 直播踢出消息]
* @param {[type]} userid [被踢出用户id]
*/
VHALL_SDK.on('kickout', function(userid) {
console.log(userid);
});
直播恢复踢出消息
/**
* [kickoutRestore 直播恢复踢出消息]
* @param {[type]} userid [恢复踢出用户id]
*/
VHALL_SDK.on('kickoutRestore', function(userid) {
console.log(userid);
});
获取直播历史消息成功回调
/**
* [vhall_live_history_chat_msg 获取直播历史消息成功回调]
* @param {[arraylist]} msg [数据数组]
*/
VHALL_SDK.on('vhall_live_history_chat_msg', function(msg) {
console.log(msg);
});
获取回放历史消息成功回调
/**
* [vhall__record_history_chat_msg 获取回放历史消息成功回调]
* @param {[arraylist]} msg [数据数组,回放中有curr_page,total,total_page有数据]
*/
VHALL_SDK.on('vhall_record_history_chat_msg', function(msg) {
console.log(msg);
});
问答开关消息
/**
* [questionSwitch 直播问答开关消息]
* @param {[type]} msg [msg.status 1:开启,0:关闭]
*/
VHALL_SDK.on('questionSwitch', function(msg) {
console.log(userid);
});
发送问答消息后触发事件
/**
* [sendQuestion 直播问答消息发送事件]
*/
VHALL_SDK.on('sendQuestion, function(msg) {
console.log(msg);
});
收到问答消息
/**
* [question 直播问答消息]
* @param {[type]} msg [消息体]
*/
VHALL_SDK.on('questionMsg', function(msg) {
console.log(userid);
});
拉取问答消息后触发事件
/**
* [getQuestionList 获取直播问答历史消息]
* @type {[type]}
*/
VHALL_SDK.getQuestionList();
demo地址:http://cnstatic01.e.vhall.com/jssdk/dist/2.3.3/
demo提供了基本的样式,开发者可在demo样式的基础上修改成自定义的样式
1.依赖库
本SDK依赖于JQuery库,请在需要引入JQuery的页面按以下代码示例进行引入,对JQuery版本没有要求
<script src="http://cnstatic01.e.vhall.com/3rdlibs/jquery/1.11.2/jquery.min.js" type="text/javascript"></script>
2.引入JS文件
在需要调用SDK的页面插入以下代码以引入JS文件:
<script type="text/javascript" src="http://cnstatic01.e.vhall.com/demand-upload-jssdk/dist/1.0.0/vhallDemandSDK.js"></script>
3.方法指引:
/** * 1、初始化dom */ <input type="file" id="upload"/>
/** * 2、根据appKey和secretKey生成sign 生成sign的具体规则如下: * (1) 按参数名升序排列 * (2) 然后按参数名1+参数值+参数名2+参数值拼接 * (3) 在首尾各加上secret_key * (4) 计算md5作为sign */ // 该代码为客户端DEMO代码 仅供参考(生产环境请参考代码下面的服务端代码) function sign(appKey, secretKey) { var param = {}; return { doSign :function(){ param.auth_type = 2; param.app_key = appKey; param.signed_at = new Date().getTime().toString().substr(0, 10); var paramArray = getArray(param); var signStr = secretKey; for(var i =0; i < paramArray.length; i ++) { signStr += paramArray[i]; } signStr += secretKey; return { str : hex_md5(signStr), /* 用MD5加密得到最终sign */ time : param.signed_at /* 获取到sign的时间戳 */ } } } function getArray(paramObj) { var paramArray = []; var length = 0; for (var i in paramObj) { paramArray[length] = i + paramObj[i]; length += 1; } paramArray.length = length; return paramArray.sort(); } }
appKey和secretKey获取方法获取请参见http://e.vhall.com/home/vhallapi/instructions
服务签名端代码请参考 http://e.vhall.com/home/vhallapi/instructions
/** * 3、调用 vhallDemandSDK 方法 */ vhallDemandSDK('#upload',{ params: { sign:sign, /**sign**/ signed_at:time, /**获取sign的时间戳**/ app_key:appKey, sdkChildID:sdkChildID /**子账号ID不传默认为主账号**/ }, ready: function() { /** * 初始化完成的回调函数 **/ }, beforeUpload:function() { /** * 准备中...(文件进行MD5转换过程) **/ }, progress:function(percent, file){ /** * 上传中...' * 'percent 上传进度百分比' * 'file 上传文档具体信息 **/ }, uploadSuccess: function(res){ /** * 上传成功!' * 'res 成功返回的回放ID records_id 和 活动ID webinar_id **/ }, error: function(msg,file,e){ /** * 上传出错' * 'msg 错误返回的状态码信息' **/ } })
错误状态码对应信息参见消息体
| 错误码 | 说明 |
|---|---|
| 10000 | 当前浏览器不支持断点上传 |
| 10001 | 请传入类似于”#id”选择器 |
| 10003 | 当前传入的dom不是input file |
| 10004 | 不支持该文件格式 |
| 10005 | 上传文件大于10GB |
| 10006 | 获取上传临时授权失败 |
| 10008 | 没有上传权限 |
| 10009 | 回放标题不能为空 |
| 11010 | 活动标题不能为空 |
| 11011 | 视频路径不能为空 |
| 10104 | 子账号信息不存在 |
4.上传的文件所支持的格式:
'rmvb', 'mp4', 'avi', 'wmv', 'mkv', 'flv', 'mp3', 'wav', 'mov'
5.DEMO:
需要将获取到的 appKey 和 secretKey 以URL传参的方式拼接到URL中即可使用
6.其他:
为保证本SDK能够正常使用请尽量在高版本浏览器下使用本SDK产品(Chrome58及以上版本)