• 首页
  • 教育培训
    • 双师课堂
    • 直播网校
    • 大班课堂
    • 小班课堂
  • 互动直播
    • 财经直播
    • 网络互动直播
    • 企业培训
    • 年会直播
    • 移动直播
    • 营销直播
    • 网络研讨会
    • 网络市场活动
    • 企业级网络会议
  • 关于我们
    • 公司新闻
    • 关于我们
    • 荣誉资质
    • 联系我们
    • 人才招聘
  • 帮助与下载
    • 工具下载
    • app下载
    • 视频教程
    • FAQ
    • 开发者
    • SDK下载
  • 销售热线:4006-061-263
  • 免费试用
English
  • 接口使用指引
  • Web接口开发指南
    • Webcast API接口
      • Webcast Json API
      • Webcast URL API
    • Training API接口
      • Training Json API
      • Training URL API
    • Web Flash SDK
      • 直播 SDK
      • 点播 SDK
    • Web H5 SDK
      • 桌面端点播SDK
      • 移动端点播SDK
      • 移动端直播SDK
      • 桌面端直播SDK
  • 实时系统回调接口
  • APP SDK开发指南
    • SDK 快速选择指南
    • Ios 接口开发
      • IOS-VOD SDK
      • IOS-RT SDK
      • IOS-Player SDK
      • IOS-Fast SDK
    • Android 接口开发
      • Android 接口FAQ
      • Android -VOD SDK
      • Android -RT SDK
      • Android-Player SDK
      • Android-Fast SDK
  • 微信小程序接口
    • 微信小程序 SDK
      • 微信小程序 点播SDK
      • 微信小程序 直播SDK

接口文档使用指南

1. 概述

1.1接口文档类型和功能介绍

URL API文档:

用于使用iframe方式嵌入WEB端URL,并且可以传递参数,无需手工输入昵称和房间口令。使得直播看上去像是网站的一部分,属于一种简单的集成方式。

JSON API文档:

用于通过接口的方式,完成对Gensee后台的操作(如新建直播,编辑直播,获取直播房间URL,获取点播URL等信息)

WEB SDK文档:

如果对于我们的标准三分屏播放器、互动增强播放器等样式不满意,可以使用此接口自定义开发直播和点播的播放器。

APP SDK文档:

此接口可以用于开发接收端源生android、IOS的APP。

实时回调接口文档:

用于实时接收直播课堂状态和用户状态(如直播课堂开启、结束、用户进入、离开、以及当前房间实时人数)

展视直播产品共分为两条产品线,webcast(大会直播)与training(教育培训)。请于左侧导航阅读使用对应产品的接口文档(APP SDK开发工具包为三个产品线公用开发包)。

2. 接口相关常见问题

2.1我们自己有网站,如何完成与我们网站的用户系统对接?整体流程是怎样的?

只需通过URL API接口,即可实现学生/用户只需在客户自己网站登陆后,即可进入gensee实时课堂。大致流程描述如下,客户自己有官网或网站入口,点击观看直播后,要求用户需要登陆,学员登陆后,客户自有业务系统检查当前登陆用户是否购买了当前直播课程,如果没购买则跳转到购买页面。如果已经购买,则进入到正式直播页面。正式直播页面中用iframe的方式嵌入gensee直播课堂的WEB端URL链接,并把当前登陆用户的昵称通过nickname参数以get方式传参到URL链接中。则学员在直播课堂中发送聊天和文档即会显示昵称。

如果要避免单一学员购买课程后,把帐号分享给别人一同使用观看直播,则需要额外传送UID参数,相同UID用户接入课堂,后者会把前者踢出,前者提示当前用户在其他地方登陆等提示信息。传送方式同nickname。详见URL API接口文档。

PS:请参考对应产品(webcast/training)的URL API文档,参数略有区别

  • nickname: 用户昵称,必填。(webcast产品为nickName,training产品为nickname)

  • 中文需URL编码

  • uid: 第三方系统可传入8字节长度以内正整数作为直播用户ID。该项可作为用户唯一性校验。若uid相同,则后加入直播用户将把之前加入具有相同uid的用户踢出。直播结束后统计报告包含该uid值。该uid值必须从 1000000000 开始,以避免与本系统用户数据的ID 冲突。

URL格式:http://站点域名/training/site/r/ {课堂编号}?nickname=xxx&token=xxxxx

Iframe嵌入代码例子:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Iframe URL demo</title>
</head>
<div style="text-align:center"><iframe src="http://demo.gensee.com/webcast/site/entry/join-39880c94a99b4856bfa82008efa8a9aa?nickName=tset" frameBorder="0 "marginwidth="0" marginheight="0" scrolling="no" width="1000px"  height="800px" ></iframe></div>
<body>
</body>
</html>

2.2我们都是收费课程会不会直播链接被盗用?如何避免链接被盗用?

当采用3.1的方式进行URL嵌入后,有客户会顾虑是否会被学员用查看页面源代码的方式获得直播房间的原始URL,跨过网站的用户验证系统直接观看。

为了避免这种情况发生training平台有如下两种解决方案:

采用域名认证(改动较小,安全级别中,只有training产品支持):

 

 

采用域名认证方式,即只有直播端URL被嵌入到客户指定域名下才可以顺利播放,如果直接访问直播URL,则会跳转到客户指定的认证失败地址上。

采用K值认证(较为复杂,安全级别高):

K值认证流程图:

 

 

Training产品设置位置:

 

 

Webcast产品设置位置:

 

 

整体认证思路和流程类似于购买团购券,团购后,用户得到的是团购码,拿到团购码后去商家消费,商家需要上指定团购网站去验证团购码的合法性,当团购网站确认团购码合法并消费成功后会被标记,避免再次使用。

同上思路,具体实现流程为:学员用户通过3.1章节方式进入正式直播页面,该页面会自动生成一个K值串(生成规则和算法客户业务系统自己实现),并以get的方式传到WEB端的URL链接中

URL格式:http://站点域名/training/site/r/ {课堂编号}?nickname=xxx&token=xxxxx&k=xxxxx。当Gensee的服务器收到带K值参数会把K值转发到客户提前预设好的认证地址上(以post方式)。客户的认证页面返回pass 或者 fail ,当返回pass时,Gensee服务器正常让用户进入直播观看,反之则跳转到客户提前预设好的错误URL页面。

详见URL API接口文档中的K值认证章节。

2.3 我们自己有运营管理后台,可以使用我们自己系统建立直播教室等后台动作吗?

可以,使用Gensee提供的json API接口文档完成后台建立直播等工作,当直播教室建立完成后,Gensee会返回成功建立后的URL链接等信息,客户可以直接把相关URL和信息直接记录在自己的DB中。方便后期使用和直接调用。同理,编辑直播室、删除直播教室等操作也通过Json接口完成,当操作成功后,Gensee会返回状态码code 0,即表示操作成功,同时客户自己的数据库也要进行同步更新,避免后期出现数据不匹配的情况。

注意:一旦使用JSON进行建立直播教室等操作,就不要使用Gensee提供的管理后台进行新建、编辑等操作,以免出现Gensee数据和客户网站数据库记录不匹配的情况。

2.4 我们觉得三分屏不好看,我们还要增加自己的功能,可以自己定制播放器吗?

回答:完全可以,如果客户觉得我们的播放器不好看,或者UI要重新设计布局,可是使用Gensee提供的WEB SDK接口文档,进行播放器的二次开发。

《Gensee_Web_Player_SDK.doc》用于实时课堂,即直播SDK。

《Gensee_Vod_Player_SDK.doc》用于课件播放,即点播SDK。

详见WEB SDK接口文档。

用客户前台研发人员在调试SDK过程中发现视频/文档都正常,但聊天和问答无法提交,原因大多都是使用了group参数导致。大多数情况下无需group参数,

group参数详细解释如下:

group: 分组名称。(可选) 适用于不同直播(课堂)的Widget放在同一个页面中的情况。Group用来标示哪些Video和Doc Widget属于同一个组。相同组内的Widget可以共享通讯信息。若不填,SDK会自动将Widget归属到默认组。

效果参考:

对啊网:

 

 

摩根汇通:

 

 

2.5 我们可以使用接口把用户观看直播和点播的访问记录获取到进行分析吗?

回答:可以使用training Json API中的【导出课堂参会记录】把Gensee数据库中的数据,同步到客户自己数据库中,在客户数据库中根据3.1章节传入的UID进行数据分析和二次加工,得到想要数据和相关报表。

Webcast产品同理,参考webcast Json API 中【导出直播用户访问历史记录】。

2.6 我们如何通过接口获取到直播教室录制的课件链接地址?

回答:可以使用training Json API 中的【获取课堂录制下的所有课件】或【分页同步课件数据】,建议按天增量把数据同步到客户自己数据库中,用于客户自己官网页面展示。

Webcast产品,请在webcast json API中查看【分页同步点播数据】

2.7 我们想实时的知道直播课堂什么时候开启、结束,房间有多少人,可以吗?

回答:完全可以,通过实时回调接口,把系统参会人员和房间状态实时外推到第三方地址上,格式如:http://直播记录外推URL?ClassNo=*&Operator=*&Action=*& Affected=*&totalusernum=*

以便实时读取课堂状态、房间人数等信息

Training产品设置位置:

Webcast产品设置位置:

 

 

详见:《Gensee_实时系统回调接口文档.doc》

2.8 我们可以在自己的官网首页显示目前正在开课的房间并实时显示房间人数吗?

回答:完全可以,通过实时回调接口,请参考3.7章节。即可知道房间状态和实时房间人数,可以根据实时房间人数,在首页以倒序进行排列展示。

详见:《Gensee_实时系统回调接口文档.doc》

2.9 我们微信公众账号怎么和直播教室对接,最终完成从微信直接进入直播室?

回答“:完全可以,把gensee的WEB学生端URL地址直接和微信公众帐号嵌入,把微信公众账号作为免费直播入口,如果需要验证用户合法性请参考3.1章节。用户以WEB方式进入观看。

PS:用户昵称即nickname参数为必传参数。

2.10 我们有自己的移动端APP能否把直播教室也加进来,学生通过APP观看?

回答:完全可以,可以采用以下两种方式。均有各自优势,可以酌情选择,推荐使用源生APP SDK进行开发。

方式一:(伪APP,开发难度低,研发速度快, IOS、android均可使用,但页面播放器必须使用gensee提供的默认移动端播放器样式,或使用WEB SDK开发H5,样式类似3.9章节对啊网移动端效果。但因Android设备众多,很多设备对H5支持并不好(直接使用系统的webview可能近一半的安卓机对于H5视频都会遇到播放和加载等问题),故强烈不推荐,如果非要使用这种方式,建议不要直接使用系统的webview,而是使用第三方开源的webkit内核,或第三方的内核sdk 例如腾讯 、uc、cloudapi等,如果仅用系统提供的webview基本无解,即使使用开源webkit,个别安卓机型也可能存在无法支持HLS协议的情况,属于生态问题,目前无解。)
方式二:(推荐源生APP,开发难度较高,研发速度慢,IOS、android需要独立开发,但UI布局完全可以自定义,源生APP相较于伪APP用户体验更好)

详见 APP SDK开发包及开发文档。

2.11 直播结束后如何取得点播地址?

1.使用2.6 及 2.7 说明的组合的方式实现。(有可能存在因网络原因导致没收到请求)

2.使用2.6 章节 json分页同步课件数据的函数方法,用定时器的方式定时进行增量同步点播信息到本地DB中。比如每5分钟同步10分钟前的信息,例如9:05分同步 8:50—9:00产生的点播数据。

流程说明:

1.可以使用实时回调接口获得停止录制状态。

2.得到停止录制状态后,等待3-5分钟点播正常入库后,再触发 3.6章节的json分页同步点播数据的方法,把新增的点播信息同步到客户本地DB中。

Ps:因回调接口属于直接发送get请求,当客户方服务器网络不正常,或客户服务器负载压力比较大时候,有可能出现我们发送的get请求 贵司服务器没有收到情况(比较少)。为了以防万一,故建议除了收到停止录制的回调信息后触发获取外,再增加手工获取的触发方法,以防回调信息因网络原因没有收到导致的问题。

3. URL API接口开发调试常见问题

3.1 为何URL传入昵称后依然无法跳过登陆界面?

1.请确认传入昵称参数名是否正确(webcast产品昵称参数为nickName,training产品昵称参数名为nickname,区分大小写),并且正确传入对应身份口令(token)。

2.取消直播配置中【是否要求用户登录】。

Webcast:示例:http://demo.gensee.com/webcast/site/entry/join-8a65b8abb3ff4fbb820e0ae3fa3d080c?nickName=test_User&token=333333

 

 

Training:示例:http://demo.gensee.com/training/site/s/29160259?nickname=test_User&token=444444

 

3.2 为何传入中文昵称后客户端看到的用户昵称为乱码?

传入的中文昵称要统一采用UTF-8编码,并且中文一律要先经过URL编码处理。

如JavaScript代码示例:

var url = http://demo.xxx.com/webcast/site/entry/join-123456?nickName= + encodeURIComponent(‘中文’);

3.3 为何传入uid后会即使不重复web用户也会互相踢掉?

uid要严格开发文档中的取值范围,超出取值范围会导致实时系统错乱。

1000000000 < UID < 64位(8字节)。

直播踢出逻辑为,相同直播房间内,相同UID,后者踢出前者。

3.4 嵌入三分屏的flash播放器,但flash在当前页面的最前端,遮盖原页面元素。

举例:如下图当页面设计中有横幅或其他需要在flash前显示的元素,直接嵌入后会发现原本最前面的div被flash遮盖在后面(下图已经过处理,所以访问记录正常)。

 

解决办法有以下三种:

方法一:

追加透明度参数trans=true。

 

 

缺点:三分屏播放器需要用户输入聊天和Q&A,如果设置为flash透明,经过测试发现有很多输入法会被影响导致用户无法输入。

方法二:

用iframe嵌入后,会发现flash覆盖问题,从技术上,不是说只有flash设置为透明才能解决。客户开发人员可以使用另外一个iframe(层级比较高)来实现遮盖三分屏播放器。

iframe在页面里面层级是最高的。可以遮挡任何东西(包括flash)。只要将客户希望遮挡在三分屏上的内容放在另外一个iframe里面,就可以实现这个iframe盖在其他元素之上。

技术细节请度娘。

方法三:

Web SDK可以终极解决。Web SDK设计时候已经考虑到原有的问题,因此没有键盘输入功能。所以默认flash设置即是透明。

3.5 为何使用第三方认证(K值认证)总是被跳转认证失败地址。

通过以往对接经验,有以下几种可能性,供参考。

1.没有在站点管理后台启用并配置第三方权限认证URL地址。

2.直播/点播URL地址没有带上可用的k值参数。

3. Gensee系统收到接口调用请求后,会向第三方认证url发送http post请求,同时把k参数作为post数据提交回第三方系统。由第三方系统重新验证k值合法性。若第三方认证通过,第三方认证url返回字符串”pass”,否则返回”fail”。除了pass/fail以外,页面中包含其他html标签信息(如title body等)。

4.曾出现过客户方验证web服务器不支持post请求,Gensee系统根据第三方认证URL返回值判断认证是否成功:当http response状态不为200且http response的内容不为pass时,接口将跳转到指定的第三方认证失败地址。若该地址未配置,则跳转到Gensee的默认出错页面;若认证成功,则进入直播/点播页面。

5.自行验证接口方法:使用postman或百度API等工具,模拟向自己开发的验证接口发送post请求,调试返回值是否正常。

6.曾出现过客户研发反馈,通过调试工具,后台日志都显示pass,但是依旧被跳转。最后我通过抓包发现,因为对方在win下使用记事本文件编码虽然也用的UTF-8但是会被自动保存BOM信息,数据包抓包对比下图所示:

解决办法,修改源码文件编码为 UTF-8无BOM编码格式!或者在linux下使用vim写demo。

 

 

PS:K值认证失败可以通过查看后台站点中的 日志监控 来协助定位原因。

 

Webcast:

 

 

Training:

 

4 Json API接口开发调试常见问题

4.1 Json调试页面如何使用?

测试工具的使用:

如开了一个站点test 域名是test.gensee.com那么测试工具的地址就是http://test.gensee.com/webcast/static/integration /tool.html域名必须填写正确。在测试工具中选择教育系统就可以选着对应的接口,测试工具的左边是参数的填写,点击发送之后的结果会显示在右边。

Gensee采用多站点运营的SAAS模式,故给每个合作客户均建立了独立站点域名。如 http://demo.gensee.com  或  http://test.gensee.com 或 http://support.gensee.com

故调试页面为 http://{站点域名} /webcast/static/integration/tool.html

如开放站点为 http://demo.gensee.com 则该客户调试页面地址为:http://demo.gensee.com/webcast/static/integration/tool.html

选择对应的产品:会议(meeting)教育(training)直播(webcast)

4.2 直播ID(webcastID)、课堂ID(roomId)指的什么?

答:直播ID、课堂ID为唯一值。

Webcast产品:

 

 

Training产品:

 

4.3 通过json创建直播,sec=true时,密码(password)采用什么加密算法?

目前加密算法为md5、sha-1二选一,默认为md5,可以在后台进行设置。

Webcast产品:

 

 

Training产品:

 

 

4.4 为何通过json创建直播房间,开始时间总是1970年?

一般出现该问题都是由于误把毫秒时间戳 当成秒时间戳来处理导致。请核对检查。

发送参数时间格式:yyyy-MM-dd HH:mm:ss或者为long型(如果时间格式为long型那么该值为从1970年1月1日00:00:00 GMT以来此时间对象表示的毫秒数)

返回参数时间格式:long,(该long型那么该值为从1970年1月1日00:00:00 GMT以来此时间对象表示的毫秒数)。

举例:2016年1月20日 18:18:18   对应毫秒时间戳为:1453285098000

工具:http://www.box3.cn/#

4.5 通过json接口获取的返回数据是否进行了排序?

目前json返回的数据,如:分页同步点播数据、访问记录等为了提高响应性能,均未进行排序处理,如果需要排序显示,请客户方技术通过json对应接口,把数据同步到客户自己数据库中才进行排序显示。

4.6 课件/已发布点播与录制件有什么区别?

课件:training产品直播录制下来或castmark上传可直接用于点播的视频。

已发布点播:webcast产品直播录制下来或castmark上传可直接用于点播的视频。

课件、已发布点播 与 录制件区别:录制件可以理解为存储在服务器上的物理文件,故录制件有诸如存储大小、录制开始时间、录制结束时间等属性。录制件用户是无法直接观看访问的。而课件和已发布点播,抽象理解相当于把录制件开放出一个可供访问的URL地址(俗称发布)。一般情况下课件、已发布点播 与 录制件为一一对应关系,即每个课件ID/点播ID,对应一个录制件ID,也可以粗略把两者理解为一个东西。

4.7 Json创建直播时,开始时间与结束时间是什么关系逻辑?

开始时间为必填参数,在设置的开始时间之前,用户均可以进入,但在超过结束时间后直播房间就不允许再进入。结束时间为选填参数,可以为空,当为空时,意味着该直播房间永久生效,房间URL一直有效,可以重复使用该房间。

4.8 直播录制结束后如何自动获取到点播地址,并且如何知道是哪个房间录制的?

有以下两种方式解决。返回值中均由该点播由哪个直播房间ID产生。

1.在后台写个定时器,定时(如每天夜里或每隔30分钟)通过json的分页同步接口把点播地址同步到本地数据库中。(详情见相关产品JSon接口文档分页同步处)

2.如果不想采用定时的方式,而是想每个直播房间录制结束后就自动获取,则需要使用【实时回调接口】实时监测站点下所有房间的状态码,当回调消息收到停止录制消息时,自动触发json的分页同步点播数据接口(因平台数据量巨大,点播数据入库需要时间,建议收到停止录制回调消息后,等待3-5分钟后再进行获取,避免立即获取取不到数据情况,具体回调状态码参照【实时回调接口】文档)。

4.9 castmaker上传的课件如何获取点播地址?

依然可以使用json分页同步点播/课件 接口,获取castmark上传的视频。(详情见相关产品JSon接口文档分页同步处)

当webcastId(webcast产品) 或 roomId(training产品)为空时,即该点播并非直播房间录制,而是castmark上传。

4.10 使用json修改直播房间配置,未发生变化的值怎么处理?

使用json的修改直播课堂接口时,如果参数值较之前未发生变化,仍需把参数和值一并发送过来,如不发送参数名及对应值,则后台会被滞空处理。

4.11 如何获取直播、点播的访问记录?

使用分页同步接口完成。

详情查看相关产品Json接口“导出直播用户访问历史记录”及“按天同步点播访问记录”部分。

4.12 为何json数据解析不了?

答:在获取访问记录时,出现json格式数据无法解析的情况,主要由于制表符导致。

处理办法:替换制表符。

$txt=str_replace(array("t","r","n"),'',$txt);
n
换行(LF) ,将当前位置移到下一行开头
010
r
回车(CR) ,将当前位置移到本行开头
013
t
水平制表(HT) (跳到下一个TAB位置)
009

例如:


4.13 为何发送post请求但返回500错误,明明传了用户名但仍提示用户名密码为空?

返回值如:

{"code":"500","message":"loginName:may not be nullnpassword:may not be nulln"}

答:json api接口指 返回的数据类型为json格式的数据类型,但发送请求时,请使用表单类型(Content-Type:application/x-www-form-urlencoded)的urlencode格式,而并非是文本类型(Content-Type:text/plain;charset=UTF-8)的json格式请求。

5 WEB SDK接口开发调试常见问题

5.1 WEB SDK的必填参数都有哪些?ownerid填的什么?

Webcast产品:

 

 

Training产品:

 

 

5.2 为何WEB SDK调试页面无法进入,怎么用?

答:请核对site、ownerid、ctx、authcode是否填写正确。

举例:拿直播举例,点播也类似,只不过在对应的已发布点播(webcast)/课件管理(training)下找。

Webcast产品:

调试页面举例http://demo.gensee.com/sdk/site/test/simple?ownerid=8a65b8abb3ff4fbb820e0ae3fa3d080c&ctx=webcast&authcode=333333

 

 

Training产品:

调试页面举例

http://demo.gensee.com/sdk/site/test/simple?ownerid=CD9uw1X9Wz&ctx=training&authcode=444444

 

5.3 为何自己写的WEB SDK打开后一直提示loading?

一般出现这种情况是由于site写错导致,系统找不到该站点导致,请按5.1章节中说明,正确填写相关参数。

 

5.4 为何自己写的WEB SDK 打开后提示not_found?

一般出现这种情况是由于ctx 、ownerid写错导致,系统找不到该站点下的直播ID导致,请按5.1章节中说明,正确填写相关参数。

 

5.5 为何自己写的WEB SDK 打开后提示auth_fail?

通常出现这个问题有两种可能:

1.直播间设定了普通参加者口令,但SDK没有传入authcode参数,请按5.1章节中说明,正确填写相关参数;

2.如果站点开启了第三方权限认证集成,那么还需传入K值。

 

5.6 为何自己写的WEB SDK打开后收不到任何监听事件消息?

答:请按以下注意事项逐一检查。

1. 确认组织者/老师 客户端已经正确开启直播(小班课需要上讲台)。

2. 确认已经打开组织者视频或老师视频,并处于直播视频中。

3. 确认WEB SDK页面已经发布到web server上进行访问调试,不能直接双击html方式打开。

5.7 使用WEB SDK开发后的视频能全屏吗?

如果想视频或文档的flash进行全屏,则video需要增加bar条,及文档全屏参数。

如果不使用bar控制条,则flash只能通过调整DIV大小在浏览器内实现全屏效果,无法脱离浏览器外整体全屏。

5.8 否可以指定video的背景图?设置完bgimg参数但是不生效?

可以指定video播放前的背景图,参数如下:

bgimg: 设置背景图案,图片URL地址。

如果遇到指定图片URL地址后不生效,video区域出现黑屏,则因为flash的跨域问题,解决办法:图片所在服务器的根目录增加crossdomain.xml 文件。

crossdomain.xml:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" secure="false"/>
</cross-domain-policy>

5.9 当桌面共享时,文档(doc)、视频(video)位置大小互换 效果如何实现?

需要根据onVideoConfig事件来进行判断,当监听到桌面共享时,文档和视频的div大小及位置进行互换处理。

参数:

{
"hasVideo":[true|false],
"width":320,
"height":240,
"type":["video"|"share"]
参数 说明
hasVideo 是否有视频数据, true 或者 false
width 流宽度
height 流高度
type

video – 当前Video Widget显示视频流;

share start – Video Widget显示共享流;

share stop – Video Widget 停止显示共享流

5.10 如何实现对啊网播放器那种在聊天前增加对应身份图标?

实现原理:因用户先登录客户网站后再进入直播页面,故可以判断学员是否为付费VIP学员,当为付费学员,可以在初始化昵称时,在真实昵称前加入vip1_****,即uname=vip1_***,当播放器监听到公聊信息并且uname有预设关键字时,解析显示一个图标,并把真实昵称、聊天信息正常显示出来。最终达成如下截图效果。(手机图标处理逻辑同理)

5.11 公聊如何实现屏蔽关键字、控制发言间隔?

在使用WEB SDK的submitChat -- 提交公聊信息 事件前,先用js进行前端关键字及发言间隔判断,当不符合要求时,不继续提交。

5.12 WEB SDK聊天submitChat如何实现发送表情?

submitChat提交公聊信息

注意:

content与richtext至少提交其中之一,若同时提交content和richtext时,以richtext为准。

如果两个公聊信息的提交有设置间隔时间,那么在间隔内提交公聊信息不会成功的,同时如果提交公聊信息有设置回调函数那么会调用回调函数。

(提议:以input、textarea作为聊天信息输入的,使用content属性提交信息,以div[contenteditable] 作为聊天信息输入的,使用richtext属性提交信息)

参数:

{
"content":"hello",
"richtext":"……",
"security":"[default|high]"
}

参数

说明

content

聊天内容

richtext

聊天内容允许带有表情图标。表情图标参考6.3

security

设置聊天内容的安全等级权限,default是原有的较低的安全等级模式,high为新增较高安全等级模式,缺省该属性默认为default安全等级

关于聊天功能的表情图标

http://static.gensee.com/webcast/static/emotion/icon.json

在聊天功能中,提供富文本内容支持。

其中表情图标的URL见以上json格式中数据。

URL规则:prefix + url

Type说明:1 – 心情, 2 – 反馈, 3 – 礼物

使用聊天发送表情需要用到WEB SDK文档中以上两部分及JS配合使用。以【礼物】这个表情为例。

  1. 使用submitChat提交的数据如下:

(提议:以input、textarea作为聊天信息输入的,使用content属性提交信息,以div[contenteditable] 作为聊天信息输入的,使用richtext属性提交信息)

{
"content":"hello",
"richtext":"$^lw^",    //当security=high时采用高安全等级,发送文本为icon.json的含义符字符串部分。
"security":"high"
}在前台把content对应的文本或richtext的img src对应解析图标展示在前台即可。

http://static.gensee.com/webcast/static/emotion/chat.gift.png

 

 

提供表情转换function 使用方式如下

使用channel 你获取的富文本做emotionNormalize处理即可 还有使用高安全性security:"high"参数

例子如下

channel.send("submitChatTo", {"receiverId":uid,"receiver":uname,"richtext":emotionNormalize(richText), security:"high"});
function emotionNormalize(richText, replace, local){
            richText = richText.replace(/<img.*?emotion (.+?).(gif|png)".*?="">/gi, function (match, capture) {
                            var note = "";
                            var code = "";
                            switch(capture){
                                case "feedback.quickly":
                                    code = "$^tk^";
                                    // note = i18n("emotion.feedback.quickly");
                                    break;
                                case "feedback.slowly":
                                    code = "$^tm^";
                                    // note = i18n("emotion.feedback.slowly");
                                    break;
                                case "feedback.agreed":
                                    code = "$^zt^";
                                    // note = i18n("emotion.feedback.agreed");
                                    break;
                                case "feedback.against":
                                    code = "$^fd^";
                                    // note = i18n("emotion.feedback.against");
                                    break;
                                case "feedback.applaud":
                                    code = "$^gz^";
                                    // note = i18n("emotion.feedback.applaud");
                                    break;
                                case "feedback.think":
                                    code = "$^sk^";
                                    // note = i18n("emotion.feedback.think");
                                    break;
                                case "emotion.smile":
                                    code = "$^nh^";
                                    break;
                                case "emotion.goodbye":
                                    code = "$^zj^";
                                    break;
                                case "emotion.laugh":
                                    code = "$^gx^";
                                    break;
                                case "emotion.cry":
                                    code = "$^sx^";
                                    break;
                                case "emotion.angerly":
                                    code = "$^fn^";
                                    break;
                                case "emotion.nod":
                                    code = "$^wl^";
                                    break;
                                case "emotion.lh":
                                    code = "$^lh^";
                                    break;
                                case "emotion.question":
                                    code = "$^yw^";
                                    break;
                                case "emotion.bs":
                                    code = "$^qm^";
                                    break;
                                case "rose.up":
                                    code = "$^xh^";
                                    break;
                                case "rose.down":
                                    code = "$^dx^";
                                    break;
                                case "chat.gift":
                                    code = "$^lw^";
                                    break;
                                default:;
                            }
                            if((typeof local == "undefined" || !local))match = code;
                            if(replace){
                                return note;
                            }else{
                                if(local){
                                    return match + note;
                                }else{
                                    return match;
                                }
                            }
                        });
            return richText;
        }

5.13 为何onUserList -- 用户列表事件收不到消息?

需要组织者或老师在客户端中打开【在WEB端显示参会者列表】并开启直播后,web端才能收到消息。

并且onUserList事件只会在播放器成功进入直播后收到一次消息(除非断开重连后会再次收到),直播中的用户变动,需要使用onUserJoin -- 用户加入,onUserLeave -- 用户离开,做相应增减操作,并显示的UI前台界面上。

PS:当在线人数超过200人时,onUserList最多只会推送200条数据,会优先推送组织者和嘉宾的用户信息。

5.14 为何onUserOnline -- 用户在线人数事件收不到消息?

需要组织者或老师在客户端中打开【在WEB端显示参会者人数】并开启直播后,web端才能收到消息。

5.15 为何使用submitChatTo -- 提交私聊信息发送了私聊,但onPriChat – 收到私聊消息事件收不到任何消息?

一般是由于在使用submitChatTo提交私聊信息时,误把接收者聊天ID理解为接收者UID导致。

5.16 为何点播SDK中的onQAList、onChatHistory收不到任何消息?

因聊天和QA(问答)数据量巨大,故目前点播播放时并非一次性全部获取这些信息,而是通过对应提交事件触发后,分页方式来进行获取。

SubmitQAList

事件说明:通过接口申请获取生成该点播的直播Q&A历史记录。

这是个异步申请接口,Q&A数据将通过onQAList事件返回给第三方。因此,请在调用此方法前,预先监听onQAList事件。

SubmitChatHistory

事件说明:通过接口申请获取生成该点播的直播公共聊天历史记录。

这是个异步申请接口,公共聊天历史数据将通过onChatHistory事件返回给第三方。因此,请在调用此方法前,预先监听onChatHistory事件

5.17 如何实现未登陆用户试看一定时间自动弹出购买和注册窗口(广告)?

答:因WEB SDK均使用前台开发技术实现,故只需要在JS中写计时器,播放到指定时间后自动触发播放停止事件并前台UI做个弹框覆盖视频区域即可。

5.18 WEB SDK如何实现暖场的效果?

暖场实际为开始直播前循环播放的点播。故使用WEB SDK 则需要按以下几个步骤来实现暖场效果。

  1. 用直播WEB SDK写个直播播放器页面。
  2. 用点播WEB SDK写个点播播放器页面。
  3. 使用实时回调接口,检测直播房间是否处于开启直播状态,如果未开始直播则用户进入观看页面调用点播播放器播放点播内容,若直播已经开始,则用户进入观看页面调用直播播放器播放内容。
  4. 当用户进入观看界面时,直播尚未开始,用户进入点播播放器,观看一段时间后直播开始,则需要点播播放页面收到直播开始消息(客户通过网页技术实现通信),自行刷新处理,进入正常直播播放器界面。

5.19 聊天是否支持自定义第三方表情?

目前gensee web sdk还不支持第三方表情,正在紧张开发中。

暂时可以通过其他办法间接解决,解决思路类似常规发送表情,只是发送的自己定义的含义符,播放器前台收到这种自定义的含义符时,在前台解析出想要解析的对应图标即可,相当于只是把gensee server当做字符串的发布通道而已,表情全部由前台进行解析显示。

5.20 使用了WEB SDK 开发了自定义播放器如何实现同一链接不同设备观看?(达到类似Gensee WEB端在PC和移动端打开效果不同)

使用WEB SDK开发出一套PC浏览器的样式,再开发一套适配移动端的样式。通过用户浏览器UA来进行判断对方属于PC还是移动端,最终加载不同的样式表,达到同一链接,不同设备访问自动适配的效果。

5.21 是否可以在直播播放页中动态加载WEB SDK标签?

方法A:

使用以下步骤。

第一步:加载 gssdk.js

第二步:插入标签到当前页面中。

第三部:重新loadTag:

GS.loadTag('doc', document.getElementsByTagName("gs:doc")[0]);
GS.loadTag('video-vod', document.getElementsByTagName("gs:video-vod")[0]);
GS.loadTag('video-live', document.getElementsByTagName("gs:video-live")[0]);
 方法B:

由于不支持动态更换ownerid的做法,可通过以下方式可实现类似动态更换ownerid的效果,即切换页面里嵌入的iframe实现不同直播间切换。

源码如下:

主要是通过changeLive这个函数实现两个iframe之间的切换。  

<!DOCTYPE html>
<html style="width:100%;height:100%;">
<head>
<meta charset="utf-8" />
<title></title>
<script src="js/jquery-1.8.2.min.js"></script>
<script src="js/gssdk.js"></script>
<script  type="text/javascript">
</script>
</head>
<body style="width:100%;height:100%;">
<div id="test" style="width:80%;height:60%;">
<iframe id = "liveIframe" style="height:80%;width:80%" src='live.html'></iframe>
</div>
<div style="width:100px;height:30px;" onclick="changeLive();">切换直播</div>
</body>
<script  type="text/javascript">
function changeLive(){
if($("#liveIframe").attr("src") == "live.html"){
$("#liveIframe").attr("src","live1.html");
}else{
$("#liveIframe").attr("src","live.html");
}
}
</script>
</html>

5.22 为什么PC端 WebSDK页面不会自动播放

由于chrome 45及以上版本默认不自动播放尺寸小于398*298 的flash,因此视频控件需大于398*298

5.23 使用自定义控制条报错"explain":"Invalid in the mode using the default control bar."

原因是与原有bar条冲突,把视频控件的bar参数为true,改为false即可。

6 实时回调接口开发调试常见问题

6.1 实时回调接口在哪里设置?怎么填写?

实时server会自动发送get请求到预设在后台的URL地址上。客户方服务器会收到请求如下格式:http://******.***.com/gensee_API/Callback.aspx?ClassNo=3tVlObJeCD&Operator=9911237037&Action=101&Affected=9911237037&totalusernum=7

PS:ClassNo 等同于1.5.1的直播ID(即webcast ID,SDK ID)。

Webcast产品:例如设置地址:http://******.***.com/gensee_API/Callback.aspx

 

 

Training产品:例如设置地址:http://******.***.com/gensee_API/Callback.aspx

 

6.2 实时回调接口已经全部开发调试完成,为何有时候会突然收不到推送的回调消息?

因回调接口类似UDP的发送方式,并不一定保证接口URL会收到消息,但只要房间状态发生变化实时server均会进行正常推送。

出现未收到的原因,一般多为server间的网络波动,致使实时server发送的get请求客户方服务器并未收到导致。

7 移动端及其他常见问题

7.1 使用webview在IOS APP上嵌入直播链接,视频自动全屏浮出如何解决?

答:众所周知,iphone系统网页看视频,视频会全屏浮出,占用整个屏幕。这是它的默认行为,不受第三方web开发人员影响。但是对于app应用,由于其有能力将网页内嵌,从而可以实现视频不浮出,不占用全屏。

注意苹果写的:

 

 

因此,对于app,有些支持该功能,有些不支持。这不由网页决定,由app自身决定。

7.2 为何使用iframe嵌入URL后,移动端打开有界面适配的问题?如何解决?

请参考WEB SDK文档 “手机iframe 嵌入原始链接测试工具”

Gensee为每个客户(Site)均提供了独立的iframe嵌入原始链接调试页面,手机iframe下翻转会存在很多问题,尤其微信下,现提供解决方案,使用以下代码解决横竖屏问题

测试页面的URL规则如下:

  • http://{站点域名}/sdk/site/test/iframe? testUrl={原始访问链接 }

URL格式范例:

  • webcast:  http://test.gensee.com/sdk/site/test/iframe?testUrl= http://test.gensee.com /webcast/site /entry/join-ea7825821b894a899ce509021cb3317d
  • training:http://test.gensee.com/sdk/site/test/iframe?testUrl= http://test.gensee.com /training /training/site/s/25100250

7.3 移动端如果使用WEB SDK开发自定义播放器,如何调试?

因我们采用的判断浏览器UA的方式来推送不同流(PC推flash,移动端推H5),如要使用WEB SDK开发移动端web播放器也同样可是使用4.2的调试页面方式,在手机打开该调试页面URL进行调试。

7.4 视频在手机浏览器上观看为何会自动全屏浮出,导致无法看到文档、聊天?

 iphone系统网页看视频,视频会全屏浮出,浮出占用整个屏幕。这是IOS的默认行为,不受第三方web开发人员影响。

目前通过优化,在微信中的特殊处理,已经实现在微信中观看直播,iPhone不浮出的处理。但safari是苹果官方浏览器,是无论如何也无法实现视频不浮出的。

部分安卓设备视频也会自动浮出全屏,原因是某些国产浏览器或者Android定制系统自动处理导致。

我们的播放器产品是基于上层的应用,无法对下层的实现方式做处理。

目前我们测试只有以下情况,不会浮出

1、安卓设备  使用CHROME浏览器

2、Iphone  使用微信打开(少量机器仍然会全屏,原因不明)

3、微信6.3.5以前版本

建议:

1、使用支持的设备与浏览器观看。比如在微信右上角选择"在浏览器中打开"

2、对于其他情况,建议可以使用部分主流浏览器的小窗功能,能解决文档与视频同时观看的问题

3、我们直播的播放器编辑页面中,可以设置为音频文档模式,取消视频的功能

这个问题是所有web移动端视频都会碰到的问题。大家可以尝试使用手机浏览器打开优酷、土豆、乐视等视频网站,一样会有这个问题,上层应用无法控制。

7.5 使用WEB SDK开发播放器在移动端H5界面上视频区域div隐藏后就会没有声音。

答:目前移动端对于视频流媒体有个自己的处理方式,即当发现原本播放的video内容被隐藏后为了节省手机流量,则会自动断开流媒体播放请求。

故:最好不要用{display: none}或者{width:0;height:0;}的方式,因为这样视频元素会处于未激活的状态。会被移动端自动关掉。最好是采用移出显示界面外的方式进行处理或设置一个小像素放置到界面边缘,让用户察觉不到。

7.6 移动端WEB(H5)能否自动播放?

html5视频播放说明链接:http://www.xuanfengge.com/html5-video-play.html
autoplay的支持依赖内核和网络状况,比如iPhone在蜂窝网络下明确禁用了autoplay;

经过试验,在没有明确的用户操作的情况下,直接通过video.play()也是无法激活播放的;此时需要明确的用户操作(touch、click)时,才能播放视频

7.7 移动端WEB使用iframe嵌入后手机打开变形或错位?

移动端使用iframe嵌入时,不能单纯使用100%,而需要自动计算宽高。具体写法详见WEB SDK 【3.10手机iframe  嵌入原始链接测试工具】及实例代码。

7.8 在使用手机WEB H5播放器时为啥弹幕不显示?为啥手视频上方网页元素不显示?

在部分浏览器下,存在小窗播放的情况。这种情况下,video的层级最高,是一种浏览器的native行为,此时页面元素都被会遮挡,所以需要用户考虑是否将注册移除到非视频区域。

7.9 关于直接使用展视的播放控制条(bar)与自己实现播放控制条(bar)

Bar可以自行实现所有功能,直播没有拖动说法,点播可以拖动

  • PC端:自定义bar可以实现除了调用flash全屏,其他都可以实现。
  • 移动端:建议使用原生的videobar,但是audiobar建议自己实现,因为audio不能被样式控制

7.10 视频能否全屏最大化?(PC WEB &移动端WEB)

(1)pc端全屏

如果需要用flash全屏,就必须使用我们的控制bar,否则不能调用flash的全屏。

注:若用户只是需要占满整个浏览器,可以将包裹我们sdk标签的div容器放大到到整个浏览器即可。

调用浏览器的全屏:可行,但是在ie下由于需要设置安全性,不建议使用

(2)手机全屏

手机播放器的控制条由各个浏览器对video标签的处理自行控制,具体样子没法控制,但是一般都带有全屏按钮,可以使用那个全屏

注:不建议自己做全屏

7.11 为何嵌入后视频显示有黑边?

相关说明链接:

  • 黑边问题:视频源有自己的宽高比,手机视频会按照视频源中宽高比显示,具体还需要看视频源。
  • 黑边颜色:手机的视频黑边没法控制颜色,那是视频播放手机这块的处理,属于native行为。

7.12 在手机APP浏览器中为何有的H5无法播放?

  • 原因:因为展视视频相比于传统单一视频码流和分辨率更为复杂,比如正在桌面共享等,这时候部分app浏览器不支持,播不出来, 这类问题无法直接解决
  • 建议:更换收看app浏览器,会出现奇迹

7.13 app中嵌入webview,出现其他视频能播放,而gensee有时候播放有问题?

  • 原理说明:webview就是一个很简单的webkit,可以理解为浏览器,但不能等价于浏览器。如果等价的话,那uc,qq,百度浏览器就没有存在的必要了,任何人拿一个webview就能出一个浏览器了
  • 其他视频可以显示:其他视频大部分属于推流性质的视频,内容元素比较少,安全性也很低;相比较,我们的内容更丰富,除了音视频以外还有更多富媒体内容。所以简单的webview无法完全支持,一般要启用硬件加速,或多或少会出现内容显示不全的情况
  • 建议:使用app sdk,不使用webview嵌入app(需要有很健壮的html解析和处理功能的app)

7.14 客户门户站点支持https协议,集成播放器sdk的H5页面在iOS平台出现控件加载失败

  • 原因:iOS平台或某些浏览器不支持https 页面里动态的引入 http 资源,比如引入一个 js 文件,会被直接 block 掉的。
  • 解决方法:向本项目销售申请开通直播平台站点支持https协议。

8 第三方权限认证集成

8.1 k值发送post 请求的时候是什么数据格式?

x-www-form-urlencoded格式