腾讯互动直播基于独立模式的流程解析

来源:互联网 发布:sql怎么还原数据库 编辑:程序博客网 时间:2024/04/28 14:14

本章内容

  1. 基于独立模式的流程
  2. 代码分享
  3. 存留问题

基于独立模式的流程

好吧,感谢腾讯云带来的服务的同时吐槽下腾讯云的坑….不言中…
言归正传,我的项目是基于独立模式开发的,使用的是腾讯云1.7互动直播的SDK,说是互动,其实我做的就只是开直播和看直播,没有两边互动互看的功能,当然也不是旁路直播(所谓旁路直播就是直播和看直播,但是无法聊天),我这边做的其实就是映客的那种模式,可以送礼物什么的,以上就是我所做功能的概括。
先说流程吧,在Demo中你会看到许许多多的接口,获取直播列表的接口,请求房间号的接口,创建房间后,判断房间是否存在的接口,还有退出房间时的接口,请看好,我说的是接口,而不是SDK中的API!!!那么,我只想说,这些接口,Demo中所有的接口你都可以无视它,是的无视掉,因为这些接口都是你可以替换掉的!!!
那么问题来了,房间号怎么来?UserSig怎么来,取消房间怎么来?送礼物、聊天画面一些特殊的效果制定怎么办?好吧,没有开发文档,代码注释也是寥寥无几,刚刚入手只想放(ma)弃(niang),后来才知道原来有种服务叫做“至尊服务”,服务费记得好像是5W,我只想说–人(ran)性(bing)化(luan)。
事实上,在开发之前,你需要去腾讯申请 APPID 和 ACCOUNTTYPE,这两个值是用来进行SDK的注册的,你可以把这个看成是你开直播的许可证–你看腾讯大大,我已经申请成功了,那么我可以开始直播了吗?–NO!–WHY?我不知道你是谁啊!–の…于是就是要UserSig,一个用户的标识,如果是做手机客户端的就笑了,因为这个是不归我们管的,这个是后台要做的事情,这块儿,讲道理,我是真没什么好说的,我也不懂。
总之,你有了 APPID、ACCOUNTTYPE、UserSig(请确保这个UserSig是你使用的独立模式下,你的账号对应的正确的UserSig),那么你就可以使用SDK提供的API进行注册了。
注册成功后,你要开直播你需要房间号,聊天组房间号。房间号是用来进入房间,看直播的,聊天组是为了聊天的,感觉像废话,总之,这两个参数都是有用的,以及手机号。


代码分享

我也只能是分享一些比较重要的流程代码,一边说,一边看代码吧。
正如上面所说,第一步是注册直播SDK,注册需要四个参数 APPID、ACCOUNTTYPE、UserSig和账号。
APPID、ACCOUNTTYPE这两个参数在申请互动直播的时候,在你们腾讯云的后台就可以拿到,这个直接写死到程序里面。
我的代码中,在进入APP登录的时候直接向服务器请求了我的UserSig,后台生成直接给我:

private void login() {        if (checkInputValue()) {            MaterialDialogUtil.showBasicDialog(getActivity());            HttpTasks.getUserInfo(phone, code, getActivity());        }    }

在成功拿到UserSig之后,就是注册了,这里我注册的账号是手机号:

AppApplication.instance.mQavsdkControl.startContext(AppApplication.instance.userInfo.data.list.mobile, AppApplication.instance.userInfo.data.userSig);        }

以上就是注册了,其实说的并不是太详细,比如参数什么的,不过,代码本身就不一样,大家理解流程就好。

在这里,说一下注册的事儿,很多时候你发现Android能互看,IOS能互看,但是Android和IOS就互看不了,其实这里有连个原因:

第一个坑,请把Demo中所有“+86”全部注释掉,一堆86868686868686,很可能是源头,再三确认

第二坑,做IOS的童鞋可以忽略掉,做Android的同学,如果你做互动直播,那么就用好一点的手机吧!在腾讯云的后台里面有改画面参数的一些选项,可能你改了之后就发现Android没法直播了,一样的代码,动都没动就Over了,你能开直播,但是对面看不到,没有声音,无法聊天,在看直播的人请求画面的时候,返回值就只有–10004,这个错误码!腾讯的API中说是:参数非法,吐血有木有!具体的我也不太清楚,这应该是腾讯的问题,请使用好点的Android手机,不然会坑了自己!!!!


第一步就这样过去了,第二步开直播
再次明确一点,整个Demo中,接口都是你要替换的,真正有用的只是SDK!
在注册成功后,你要直播,那么第一个请求,房间号,这里的接口是我们后台自己的,房间号也是后台生成的,据我们后台讲,其实这个房间号就是一个随机的五位数,说是随机也不对,但是不能重复,我们的做法是,每次递增一,你们觉得呢:

 case R.id.start_live:                live_title = fragment_live_title.getText().toString();                if (!TextUtils.isEmpty(live_title))                    HttpTasks.getRoomId(getActivity());                break;

申请到了房间号之后,就要调用SDK中的方法来,创建房间了,在请求房间号的回调中,我调用了创建房间的API:

@Subscribe    public void onGetRoomIdEvent(GetRoomIdEvent getRoomIdEvent) {        if (getRoomIdEvent != null && getRoomIdEvent.room_id != 0) {            room_id = getRoomIdEvent.room_id + "";            createRoom(getRoomIdEvent.room_id);        }    }/**     * 加入直播房间     *     * @param roomNum 讨论房间号     */    public void createRoom(int roomNum) {        if (Util.isNetworkAvailable(getActivity())) {            AppApplication.mQavsdkControl.enterRoom(roomNum);            CommonUtil.toast(getActivity(), "正在创建视频房间中...");        } else {            CommonUtil.toast(getActivity(), "网络无连接,请检查网络");        }    }

房间创建成功之后,那么接下来就要创建聊天组,不然没法聊天:

 @Subscribe    public void onCreateRoomEvent(CreateRoomEvent createRoomEvent) {        createGroup();    }/**     * IMSDK创建聊天室     */    private void createGroup() {        ArrayList<String> list = new ArrayList<String>();        list.add(AppApplication.instance.userInfo.data.list.name);        TIMGroupManager.getInstance().createGroup("ChatRoom", list, live_title, new TIMValueCallBack<String>() {            @Override            public void onError(int i, String s) {                CommonUtil.toast(getActivity(), "创建群失败:" + i + ":" + s);            }            @Override            public void onSuccess(String s) {                EventBus.getDefault().post(new CreateGroupEvent(s));            }        });    }

创建聊天室也OK了,接下来,你需要告诉你的后台,不然别人怎么进来?如果不知道房间号,观众就无法观看,知道房间号、不知道聊天室房间号,进来了也无法聊天,那就变成旁路直播了:

 @Subscribe    public void onCreateGroupEvent(CreateGroupEvent createGroupEvent) {        if (createGroupEvent != null && !TextUtils.isEmpty(createGroupEvent.group_id)) {            group_id = createGroupEvent.group_id;            HttpTasks.postRoomInfo2Server(room_id, AppApplication.instance.userInfo.data.list.mobile, live_title, group_id, getActivity());        }    }

最后,当一切准备就去,就可进去直播间了:

 @Subscribe    public void onPostRoomInfoEvent(PostRoomInfoEvent postRoomInfoEvent) {        startActivityForResult(new Intent(getActivity(), AvActivity.class)                .putExtra(Util.EXTRA_ROOM_NUM, room_id) //room                .putExtra(Util.EXTRA_SELF_IDENTIFIER, AppApplication.instance.userInfo.data.list.mobile)                .putExtra(Util.EXTRA_GROUP_ID, group_id)                .putExtra(Util.EXTRA_LIVE_COVER, ""), 0);    }

如果按照我上面的步骤,没有任何BUG,那么恭喜你!如果没有,那么我会提供一些方法和我的经验:
在AvActivity中,有一个请求画面的方法:

public void hostRequestView(String identifier) {        Log.d(TAG, "request " + identifier);        AVEndpoint endpoint = null;        if (mQavsdkControl != null && mQavsdkControl.getAVContext() != null && mQavsdkControl.getAVContext().getRoom() != null) {            endpoint = ((AVRoomMulti) mQavsdkControl.getAVContext().getRoom()).getEndpointById(identifier);        }        Log.d(TAG, "hostRequestView identifier " + identifier + " endpoint " + endpoint);        if (endpoint != null) {            mVideoTimer = new Timer(true);            AVView view = new AVView();            view.videoSrcType = AVView.VIDEO_SRC_TYPE_CAMERA;//SDK1.2版本只支持摄像头视频源,所以当前只能设置为VIDEO_SRC_TYPE_CAMERA。            view.viewSizeType = AVView.VIEW_SIZE_TYPE_BIG;            //界面数            mRequestViewList[0] = view;            mRequestIdentifierList[0] = identifier;            mRequestViewList[0].viewSizeType = AVView.VIEW_SIZE_TYPE_BIG;            AVEndpoint.requestViewList(mRequestIdentifierList, mRequestViewList, 1, mRequestViewListCompleteCallback);            //成员模式请求界面            ctx.sendBroadcast(new Intent(Util.ACTION_VIDEO_SHOW)                    .putExtra(Util.EXTRA_IDENTIFIER, identifier)                    .putExtra(Util.EXTRA_VIDEO_SRC_TYPE, view.videoSrcType));        } else {            mEditTextInputMsg.setVisibility(View.GONE);            mButtonSendMsg.setVisibility(View.GONE);            mPraiseNum.setVisibility(View.GONE);            dialog = new Dialog(this, R.style.dialog);            dialog.setContentView(R.layout.alert_dialog);            ((TextView) dialog.findViewById(R.id.dialog_title)).setText("温馨提示");            ((TextView) dialog.findViewById(R.id.dialog_message)).setText("此直播已结束,请观看其他直播!");            ((Button) dialog.findViewById(R.id.close_dialog)).setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View view) {                    onCloseVideo();                    dialog.dismiss();                }            });            dialog.setCanceledOnTouchOutside(false);            dialog.show();        }    }

如果 endpoint 为Null,说明你放入的开直播的账号,这个号有误
!或者说,这个号就没有开直播,如果IOS那边能互看,Android却看不了IOS那么,很明显,一定是两边账号没对上。还有一种就是 endpoint不是null,但是
AVEndpoint.requestViewList(mRequestIdentifierList, mRequestViewList, 1, mRequestViewListCompleteCallback); 这个代码返回值不是 0,比较多的时候是 10004,一个就是我说的 请换个好一点的Android手机,如果还是不行,那就再开一下,事实上这中情况我也经常遇到,应该是腾讯自己的问题。


问题多多

  1. 手机发热现象特别严重
  2. 如果直播和看直播靠得很近,噪音特别大
  3. 画质一般般,至少不是YY、映客那种级别的
  4. 美颜效果我没有找到,如果有找到的朋友请告知我,谢谢

总之,就这样过来了,有些小坑,不知道怎么说,如果Android Studio集成的时候一些问题什么的,都是坑,慢慢磨吧,讲的也不太全,只是把一些流程说一说,避免大家走弯路,功能做的也不是很多,大家看看,有帮助最好,没什么帮助就当看看小说好了!

2 0