(1) 初始化VhallSDK
在用户调用VhallSDK中的任意方法前,一定要先调用init方法,初始化VhallSDK。
/** * VhallSDK初始化 * @param Context * @param APP_KEY 权限申请时获得 * @param APP_SECRET_KEY 权限申请时获得 */ VhallSDK.init(this , APP_KEY , APP_SECRET_KEY);
获取App_Key、App_Secret_Key —>http://e.vhall.com/home/vhallapi/authlist
(2)基础参数说明
参数 | 描述 |
---|---|
id | 对应创建的活动ID(在官网创建) |
token | 对应创建的访问Token (测试Token的实效是一天) |
码率 | 默认300 |
帧率 | 默认10帧 可选范围为10~30帧 超过30帧的按30帧算 |
初次缓冲时间 | 只用在观看直播, 默认为2秒(这里的缓冲时间不是用于延迟播放,而是缓冲2秒的数据) |
K值 | 默认为空,指的是控制直播观看权限的参数,具体使用说明参考第三方K值验证 |
分辨率 | 640*480/1280*720 |
APP_KEY | 权限申请时获得 |
APP_SECRET_KEY | 权限申请时获得 |
包名 | 第三方用户App包名 |
签名 | 第三方用户App签名的SHA1值 |
备注 : 当连接失败 SDK默认重新连接3次,每次重连时间约为5秒
(1) 创建用户
API地址 : http://e.vhall.com/home/vhallapi/active#user_register_第三方创建用户
如果使用聊天和问答功能,需要用户提前调用WebApi进行创建用户标识操作。详细接口说明,请参数请参照API地址,
(2) 登陆
当用户在vhall平台创建用户标识成功之后,调用VhallSDK中的login方法,如果用户需要使用如聊天,问答等功能则必须用户标识。如果不用
户标识则默认是游客模式 (Demo里即使是游客也是可以聊天的,用户可以根据自己的场景控制。问答必须创建用户)
以下是代码展示:
VhallSDK.getInstance().login(username, userpass, new VhallSDK.LoginResponseParamCallback() { @Override public void success(String vhall_id, String customer_id) {vhall_id} @Override public void failed(int errorCode, String reason) {} });
(3)登陆参数描述
参数字段 | 描述 |
---|---|
username | 用户名 |
userpass | 用户密码 |
vhallSDK.RequestCallback() | 回调信息 |
返回参数描述
参数字段 | 描述 |
---|---|
vhall_id | vhall平台生成的ID 后续看直播会用到 |
customer_id | 用户平台生成的ID |
错误码
错误码 | 描述 |
---|---|
10501 | 用户不存在 |
10502 | 登陆密码不正确 |
(1) 准备工作:
屏幕保持常亮。
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
横竖屏发起视频
/** * 如果竖屏发起设置ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT * 如果横屏发起设置ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE */ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
设置发起布局
<com.vhall.business.VhallCameraView android:id="@+id/cameraview" android:layout_width="match_parent" android:layout_height="match_parent" />
VhallCameraView
Activity 被创建,首先初始化 VhallCameraView . 当前自定义View会处理包括采集,自动聚焦等关于Camera的操作 , VhallCameraView
需要初始化获得一些信息,调用 init()方法
/** * pixel_type 发起的分辨率 */ getCameraView().init(pixel_type, Activity(), new RelativeLayout.LayoutParams(0, 0));
(2) 发直播:
Broadcast实例:
Broadcast实例 这里需要将之前设置的信息传入Broadcast中 列如自定义view、帧率、码率 、发起事件回调、聊天,此处完整代码可以参考
Demo
Broadcast.Builder builder = new Broadcast.Builder() .cameraView(mView.getCameraView()).frameRate(param.frameRate) .chatCallback(new ChatCallback()) //如需要使用聊天 加上这个回调 .videoBitrate(param.videoBitrate) .callback(new BroadcastEventCallback()); // 直播事件回调 broadcast = builder.build();
一键发起直播,调用SDK initBroadcast方法,在这之前要先初始化观看实例。
发起参数描述:
参数字段 | 描述 |
---|---|
id | 活动ID |
access Token | 访问token |
vhallID | 是否使用子账号发直播(新加) |
Broadcast | 发起实例 |
RequestCallback | 回调信息 |
备注: 子账号需要先创建,创建后会获取vhallID,当vhallID这个参数不为空时,使用子账号发起直播,使用的Token也需要用子账号重新生
成,否则会返回身份验证失败。当vhallID这个参数为空时,默认使用主账号。
以下是代码展示
VhallSDK.getInstance().initBroadcast(param.id, param.token, getBroadcast(), new VhallSDK.RequestCallback(){ @Override public void success() {} // 发起成功 @Override public void failed(int errorCode, String reason) {} });
(3) 直播事件回调
private class BroadcastEventCallback implements Broadcast.BroadcastEventCallback { @Override public void onError(int errorCode, String reason) {} @Override public void onStateChanged(int stateCode) { switch (stateCode) { case Broadcast.STATE_CONNECTED: /** 连接成功*/ break; case Broadcast.STATE_NETWORK_OK: /** 网络通畅*/ break; case Broadcast.STATE_NETWORK_EXCEPTION: /** 网络异常*/ break; case Broadcast.STATE_STOP:/** 直播停止*/ break; } } @Override public void uploadSpeed(String kbps) {/** 下载速度*/} }
状态码
状态码 | 描述 | Broadcast常量 |
---|---|---|
20151 | 连接成功 | Broadcast.STATE_CONNECTED |
20152 | 网络通畅 | Broadcast.STATE_NETWORK_OK |
20153 | 网络异常 | Broadcast.STATE_NETWORK_EXCEPTION |
20154 | 直播停止 | Broadcast.STATE_STOP |
错误码
错误码 | 描述 |
---|---|
10401 | 活动结束失败 |
10402 | 当前活动ID错误 |
10403 | 活动不属于自己 |
10409 | 第三方用户对象不存在 |
10411 | 用户套餐余额不足 |
20101 | 正在直播 |
20102 | 初始化视频信息失败 |
20103 | 预览失败,无法直播 |
20104 | 直播地址有误 |
20105 | 连接服务器失败 |
(4) 结束直播
获取VhallSDK的实例 调用finishBroadcast() 传入参数活动ID、TOKEN、Broadcast实例、结束回调 当直播结束时,需要调用此方法,此方
法用于结束直播,生成回放,如果不调用,则无法生成回放。
参数说明:
参数字段 | 描述 |
---|---|
id | 活动ID |
access Token | 访问token |
Broadcast | 发起实例 |
RequestCallback | 回调信息 |
以下是代码展示
VhallSDK.getInstance().finishBroadcast(param.id, param.token, getBroadcast(), new VhallSDK.RequestCallback() { @Override public void success() {// 停止成功} @Override public void failed(int errorCode, String reason) {// 停止失败} });
(5)相关功能接口
getBroadcast.changeCamera()切换摄像头;
getBroadcast.setMute(Boolean mute)设置是否静音;
getBroadcast. setVolumeAmplificateSize(float size)设置降噪级别[0-1]
cameraview.setFilter(GPUImageFilter filter)设置滤镜
(1) 看直播
WatchLive 实例:
watchLive 实例 , 这里需要将一些设置信息传入 列如Context、containerLayout(这里需要传入一个RelativeLayout,用于生成观看)、回
调callback, MessageEventCallback 消息回调 ,ChatCallback 聊天回调
WatchLive.Builder builder = new WatchLive.Builder() .context() .containerLayout() // 传入观看布局 .bufferDelay() // 缓冲几秒的BUFFER .callback(new WatchCallback()) .messageCallback(new MessageEventCallback()) .chatCallback(new ChatCallback());//如果使用聊天就加这个回调 watchLive = builder.build();
一键观看直播:
一键观看直播,当Activity 被创建 观看界面Activity必须包涵一个RelativeLayout布局 此布局需要往VhallSDK中传递 用于一键生成回
放,获取VhallSDK的实例 调用initWatch() 这里传入参数WatchLive实例、活动ID(必填)、用户名、用户邮箱、vhall_id、K值校验等参
数。
参数描述
参数字段 | 描述 |
---|---|
id | 活动ID |
nickname | 用户名 |
用户邮箱 | |
vhall_id | VhallId (登陆后获取,没有传空) |
password | 密码(K值) |
WatchLive | 观看直播实例 |
RequestCallback | 回调信息 |
备注:如果用户名和密码为空,则vhall_id 不能为空,
如果vhall_id为空,则用户名和密码不能为空, 如果都传,默认取vhall_id的值。
以下是代码展示 详细见Demo
VhallSDK.getInstance().initWatch(param.id, "test", "test@vhall.com", vhallId , param.k, getWatchLive(), new VhallSDK.RequestCallback() { @Override public void success() {// 获取观看信息成功} @Override public void failed(int errorCode, String reason) { 失败} });
(2) 观看事件回调
WatchCallback 观看回调 private class WatchCallback implements WatchLive.WatchEventCallback { @Override public void onError(int errorCode, String errorMsg) {// 错误返回错误码} @Override public void onStateChanged(int stateCode) { // 返回状态码} @Override public void uploadSpeed(String kbps) { // 速度} }
状态码
状态码 | 描述 | WatchLive常量 |
---|---|---|
20251 | 观看直播连接成功 | WatchLive. STATE_CONNECTED |
20254 | 开始加载 | WatchLive. STATE_BUFFER_START |
20255 | 停止加载 | WatchLive. STATE_BUFFER_STOP |
20256 | 停止观看直播 | WatchLive. STATE_STOP |
错误码
错误码 | 描述 |
---|---|
10030 | 身份验证出错 |
10402 | 当前活动ID错误 |
10049 | 访客数据信息不全 |
10404 | KEY值验证出错 |
10046 | 当前活动已结束 |
10405 | 微吼用户ID出错 |
10047 | 您已被踢出,请联系活动组织者 |
10048 | 活动现场太火爆,已超过人数上限 |
10410 | 用户信息不存在 |
(3) 停止观看
当用户停止观看时,需要调用VhallSDK中停止观看直播方法,调用此方法,SDK会断开拉流。
代码展示如下
getWatchLive().stop();
(4) 开启弹幕
弹幕实现依赖第三方库B站的弹幕引擎•烈焰弹幕 DanmakuFlameMaster
第一步,在我们视频view布局的上方再覆盖一个显示弹幕的View, 弹幕的View必须要做成完全透明的, 这样即使覆盖在视频界面的上方也不会
影响到视频的正常观看,布局如下:
<master.flame.danmaku.ui.widget.DanmakuView android:id="@+id/sv_danmaku" android:layout_width="match_parent" android:layout_height="match_parent" />
第二步,找到build.gradle添加如下依赖
dependencies { compile 'com.github.ctiao:DanmakuFlameMaster:0.6.4' compile 'com.github.ctiao:ndkbitmap-armv7a:0.6.4' compile 'com.github.ctiao:ndkbitmap-armv5:0.6.4' compile 'com.github.ctiao:ndkbitmap-x86:0.6.4' }
第三步,初始化弹幕所需的信息,设置回调详情参考Demo,
HashMap<Integer, Integer> maxLinesPair = new HashMap<Integer, Integer>(); maxLinesPair.put(BaseDanmaku.TYPE_SCROLL_RL, 5); // 滚动弹幕最大显示5行 // 设置是否禁止重叠 HashMap<Integer, Boolean> overlappingEnablePair = new HashMap<Integer, Boolean>(); overlappingEnablePair.put(BaseDanmaku.TYPE_SCROLL_RL, true); overlappingEnablePair.put(BaseDanmaku.TYPE_FIX_TOP, true);
备注: 具体实现方式参考Demo
(5) VR活动
如果发起的直播时VR直播 , 可以使用陀螺仪功能
if (!getWatchLive().isVR()) { // 判断是否是VR活动 watchView.showToast("当前活动为非VR活动,不可使用陀螺仪"); return; } getWatchLive().setVRHeadTracker(!getWatchLive().isVRHeadTracker()); // 设置陀螺仪
(1) 看回放
Watchplayback实例:
Watchplayback实例,和观看直播类似,传入Context , ContainerLayout(这里需要传入一个RelativeLayout,用于生成观看回放) ,
callback获取观看回放时的一些状态。观看回放的操作和观看直播一样,请求的方法相同,参数相同。 代码可以参考上面的观看直播。
WatchPlayback.Builder builder = new WatchPlayback.Builder() .context(playbackView.getmActivity()) .containerLayout(playbackView.getContainer()) .callback(new WatchCallback()) .docCallback(new DocCallback()); //新增 回放绘制PPT和白板 watchPlayback = builder.build();
一键观看回放:(参数和观看直播相同)
一键观看回放,参数和观看直播相同,传递的观看实例变成WatchedPlayBack,
参数字段 | 描述 |
---|---|
id | 活动ID |
nickname | 用户名 |
用户邮箱 | |
vhall_id | VhallId (登陆后获取,没有传空) 回放这里传空 |
password | 密码(K值) |
recordId | 回放片段ID(只在观看回放使用) |
WatchPlayBack | 观看回放实例 |
RequestCallback | 回调信息 |
VhallSDK.getInstance().initWatch(param.id, "test", "test@vhall.com", vhallId , param.k, recordId , getWatchPlayback(), private class WatchCallback implements WatchPlayBack.WatchEventCallback { @Override public void onError(int errorCode, String errorMsg) {// 错误返回错误码} @Override public void onStateChanged(boolean playWhenReady, int playbackState) {/ switch (playbackState) {/播放器过程中的状态信息 case VhallHlsPlayer.STATE_IDLE:// 闲置状态 break; case VhallHlsPlayer.STATE_PREPARING:// 准备状态 break; case VhallHlsPlayer.STATE_BUFFERING:// 正在加载 break; case VhallHlsPlayer.STATE_READY:// 正在加载 break; case VhallHlsPlayer.STATE_ENDED:// 准备就绪 break; case VhallHlsPlayer.STATE_ENDED:// 结束 default: break; } } @Override public void uploadSpeed(String kbps) { // 速度} @Override public void onStartFailed(String errorMsg) {// 初始化观看播放器时的错误} }
(3) 播放器方法 当观看信息请求成功,虽然和观看直播请求的是相同的方法,但是逻辑处理不同,SDK会默认得到播放地址并设置进播放器中,用户只需调用watchPlayback实例中的各种方法来获取想要得到的信息。
开始播放:
getWatchPlayback().start();
暂停播放:
getWatchPlayback().pause();
停止播放:
getWatchPlayback().stop();
获取播放进度:
getWatchPlayback().seekTo(playerCurrentPosition);
获取当前播放进度:
getWatchPlayback().getCurrentPosition();
获取播放时长:
getWatchPlayback().getDuration();
是否正在播放:
getWatchPlayback().isPlaying();
(4) 发送/获取评论信息
发送参数
参数字段 | 描述 |
---|---|
text | 评论内容 |
user_id | 用户登陆返回的唯一标识 |
RequestCallback | 回调信息 |
代码展示
getWatchPlayback().sendComment(text, user_id, new VhallSDK.RequestCallback() { @Override public void success() { //接口请求成功 chatView.clearInputContent(); chatView.clearChatData(); } @Override public void failed(int errorCode, String reason) {} });
错误码 | 描述 |
---|---|
10010 | 活动不存在 |
10011 | 不是该平台下的活动 |
10017 | 活动ID不能为空 |
10806 | 内容不能为空 |
10807 | 用户ID不能为空 |
10808 | 当前用户未参会 |
获取参数
参数字段 | 描述 |
---|---|
webinar_id | 活动ID |
limit | 每页的数量(取条目最多为50条) |
pos | 偏移量(如果从0开始就是最新的一条) |
ChatServer.ChatRecordCallback() | 回调信息 |
watchPlayback.requestCommentHistory(webinar_id, String.valueOf(limit), String.valueOf(pos), new ChatServer.ChatRecordCallback() { @Override public void onDataLoaded(List<ChatServer.ChatInfo> list) {//接口请求成功 chatView.notifyDataChanged(list); chatView.clearInputContent(); } @Override public void onFailed(int errorcode, String messaage) { Log.e(TAG , "messaage--> " + messaage); } });
错误码
错误码 | 描述 |
---|---|
10030 | 身份验证出错 |
10402 | 当前活动ID错误 |
10403 | 活动不属于自己 |
10407 | 查询数据为空 |
10412 | 直播中,获取失败 |
10413 | 获取条目最多为50条 |
10409 | 参会信息不存在 |
10410 | 活动开始时间不存在 |
备注: 如果出现相同的评论信息,请根据请求后返回的ID去重
(5) 观看回放绘制PPT和白板
回调WatchPlayBack.DocumentEventCallback
private class DocCallback implements WatchPlayback.DocumentEventCallback { @Override public void onEvent(String key, List<MessageServer.MsgInfo> msgInfos) { if (msgInfos != null && msgInfos.size() > 0) { documentView.paintPPT(key, msgInfos); documentView.paintBoard(key, msgInfos); } } @Override public void onEvent(MessageServer.MsgInfo msgInfo) { documentView.paintPPT(msgInfo); documentView.paintBoard(msgInfo); } }
备注: 在Builder观看回放实例的时候加入 docCallback()
6 滤镜直播:
使用滤镜发起直播, 需要使用新的CameraFilterView发起直播,目前提供美颜滤镜,
<!- 滤镜使用的布局文件-> <com.vinny.vinnylive.CameraFilterView android:id="@+id/cameraview" android:layout_width="match_parent" android:layout_height="match_parent" />
方法实现 调用CameraFilterView 中实现滤镜的方法
<!- 滤镜功能实现方法 -> <!- @param boolean open 是否开启或者关闭滤镜 -> cameraFilterView.getCameraView().setFilterToBeauty(true); <!- 滤镜是否开启 -> <!- 返回滤镜是否开启 -> cameraFilterView.getCameraView().isShowFilter(); <!- 自动判断当前机型硬件是否可以支持滤镜 -> cameraFilterView.setAutoCloseFilterCallback(new GPUImageRenderer.AutoCloseBaeutyFilter() { @Override public void onAutoCloseBaeutyFilter() { } }); <!- 设置美颜滤镜的等级 -> <!- @param int adjuster 美颜等级 int值 20,40,60,80 100 -> cameraFilterView .setFilterAdjuster(int adjuster)