用户工具

站点工具


vhall_open:流媒体快速接入介绍

流媒体快速接入介绍

初始化配置

(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_idvhall平台生成的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用户名
email用户邮箱
vhall_idVhallId (登陆后获取,没有传空)
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访客数据信息不全
10404KEY值验证出错
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用户名
email用户邮箱
vhall_idVhallId (登陆后获取,没有传空) 回放这里传空
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)
vhall_open/流媒体快速接入介绍.txt · 最后更改: 2017/09/29 15:52 由 yan.gao