腾讯云在线直播四

来源:互联网 发布:梦里花落知多少陆叙 编辑:程序博客网 时间:2024/04/29 08:08
    经过几天不间断的学习,将腾讯云的独立模式下的登录,开创房间,收看直播等等相继克服。这个过程确实是让人很蛋疼,没有逻辑的混乱demo代码。没有完整成篇的直播文档,只能逐行的推敲demo中的代码,一遍又一遍的调试功能,才最终完成这个对大家说过的解决独立模式下的直播方案。    在这个过程中遇到了些许问题,一会逐步讲解代码再说出遇到的问题,以及大概说下原因和解决的方法。    关于导入工程包,之前在我的博客[腾讯云在线直播一](http://blog.csdn.net/niceboydo/article/details/51404938)中已经说过,今天就直接从建立独立模式下的工程开始讲起。    首先弄明白独立模式和托管模式下的区别,关于用户管理是交给腾讯管理这么表面的话就不说了,实际上就是用户的相关业务逻辑是不再交给腾讯云而是自己的服务器去管理的,例如我们登录的时候首先需要请求腾讯云的IM接口,成功以后再将用户信息请求自己的服务器并保存起来,只有两个接口都返回YES才算通过,这也是第三方相比独立开发模式的蹩脚之处。    首先还是从注册跟登录开始,腾讯云没有单独的注册一说,只有一个登录+验证过程,我们需要在自己的服务器上注册一个账户,然后登录的时候才需要跟腾讯云交互。登录的代码先上一下。

1.登录使用的库里面的方法
-(int)TLSExchangeTicket:(NSString )identifier andUserSig:(NSString )userSig andTLSExchangeTicketListener:(id)listener

 *  @param identifier 帐号名 *  @param userSig    业务后台生成的TLS用户票据 *  @param listener   处理回调 在调用这个方法的时候我们需要实例化一个对象TLSLoginHelper。实现方式如下 2.appid和账户类型实际上就是在腾讯云平台上申请的那两个数字字符串 ```需要的三个参数*  @param sdkAppid - 用于TLS SDK的appid *  @param accountType - 账号类型 *  @param appVer - app 版本号,格式为 x.x.x.x, [[TLSLoginHelper getInstance]init:[tecentSDKAppid intValue] andAccountType:[tecentAccountType intValue]andAppVer:version];

3.而且后面的listener这个回调就是self在自己的.m文件中调用。实现TLSExchangeTicketListener这个代理的回调方法。

/// 独立模式换票回调 UserSig换A2@protocol TLSExchangeTicketListener <NSObject>/** *  刷新票据成功 *  在此回调接口内,可以调用getSSOTicket获取A2等票据 */-(void) OnExchangeTicketSuccess;/** *  刷新票据失败 * *  @param errInfo 错误信息 */-(void) OnExchangeTicketFail:(TLSErrInfo *)errInfo;/** *  刷新票据超时 * *  @param errInfo 错误信息 */-(void) OnExchangeTicketTimeout:(TLSErrInfo *)errInfo;

4.调用成功以后还需要登录IM服务器,因为如果没有这个步骤,后面就会遇到一个问题,就是这个论坛上提问的这个问题QAVContext的回调不运行
登录IM的代码如下。

             //登录IM参数            TIMLoginParam* loginParam = [[TIMLoginParam alloc] init];            loginParam.accountType =tecentAccountType;            loginParam.identifier = [IMUserInfo IMSharedInstance].userIdentefier;            loginParam.userSig = [IMUserInfo IMSharedInstance].userSig;            loginParam.appidAt3rd = tecentSDKAppid;            loginParam.sdkAppId = [tecentSDKAppid intValue];            //发起登陆            [[TIMManager sharedInstance] login:loginParam succ:^(){                [SVProgressHUD showSuccessWithStatus:@"登录IM成功"];            }fail:^(int code, NSString * err){                [SVProgressHUD showErrorWithStatus:err];            }];

如果你研究腾讯云有一周以上了你会发现上面有一个新的类是你在demo中没有见过的IMUserInfo。这个其实跟腾讯云中的UserInfo作用差不多,都是为了存储用户信息的,后面开创直播的时候回频繁使用。
5.登录成功以后就可以去开启房间了,这里插说一句,研究完这些东西是在看demo和文档,以及不断的调试完成的,其中我感觉最有用的是腾讯云平台下的这个文档。调用流程
和房间的创建和销毁
这两个文档大致讲述了创建房间的过程。然后我们对比demo就可以发现,整体流程如下
6.在创建房间之前我们需要给创建房间的界面传入几个参数
(1)创建房间的房间号
(2)房间标题
(3)房间大图
(4)房间的roomnumber,这个是传给自己的服务器,让后台跟腾讯云通过这个去管理房间的。
首先我们还是需要business这个demo中的类,然后使用- (void)getRoomnumSucc:(businessSucc)succ fail:(businessFail)fail 去创建房间,为了让腾讯云原来的业务逻辑进行的通,我们才能走自己的业务逻辑。
7.创建房间成功以后才可以使用-(QAVResult)startContext:(ContextOperationBlock)block 启动QAVContext对象。
8.在启动QAVContext成功后我们同样需要demo中的MultiIMManager这个类,去实现 - (void)createGroupSucc:(imSucc)succ fail:(imFail)fail 而这个方法中自然引入了其他的方法 - (void)clearGroupListSucc:(imSucc)succ fail:(imFail)fail-(int) GetGroupList:(TIMGroupListSucc)succ fail:(TIMFail)fail
只有这些方法都成功才能创建聊天室。
9.而这个createGroupSucc返回的msg就是需要传给自己的后台的另一个关键字段。同时将创建的房间在自己的后台和腾讯云之间相互处理就会成功创建出聊天室。而后需要客户端去渲染出这个聊天室,就需要打开语音和摄像头

QAVMultiParam *param = [[QAVMultiParam alloc] init];    param.roomID = (int)roomid;    param.isAutoCreateSDKRoom = LIVE_TODOING == [IMUserInfo IMSharedInstance].liveType ? YES : NO;    param.controlRole = nil;    param.authBitMap = QAV_AUTH_BITS_DEFUALT;    QAVResult result = [[AVUtil sharedContext] enterRoom:param delegate:self];

10.进而实现客户端的聊天室创建,在这个过程中还有一个关键的方法回调- (void)insertLivingData:(NSString*)addr 很多时候我也是卡到这个方法里面。因为这个方法里面调用的business里面很关键的一个接口 - (void)insertLive:(NSString*)tilte phone:(NSString*)phone room:(NSInteger)room chat:(NSString*)chat addr:(NSString*)addr image:(UIImage*)image succ:(businessSucc)succ fail:(businessFail)fail
11.这个接口中有很多字段,其中最要紧的就是room和chat这两个。我暂时是将这两个传入的都是同一个值反而成功了。就是步骤6里面的房间号这个参数。这个参数是自己的服务器在跟腾讯云交互创建房间的时候返回给客户端的,获取到这个room才可以进行这么多创建房间的步骤。
综上得出的是创建成功了聊天室,这里留下一个小疑问就是为什么room和chat可以传入相同的值。等以后有大神再给讲解吧。
12.创建完毕就可以进入房间查看直播了。其实在demo里面我们就发现这两个流程几乎一毛一样。为了完整,我还是重头写一遍吧。
13.看直播就不需要创建房间号那个方法了直接调用-(QAVResult)startContext:(ContextOperationBlock)block 然后就是- (void)joinGroup:(NSString*)roomId succ:(imSucc)succ fail:(imFail)fail 这个方法里面套用了另一个-(int) JoinGroup:(NSString*)group msg:(NSString*)msg succ:(TIMSucc)succ fail:(TIMFail)fail 方法。当都成功的时候才能进行下一步。-(QAVResult)enterRoom:(QAVRoomParam*)param delegate:(id<QAVRoomDelegate>)dlg 到这里就跟上面又一样了,主要是回调方法。实现这个代理的方法如下:

/** @brief 返回QAVContext::EnterRoom()的异步操作结果的函数。 @details 此函数用来返回QAVContext::EnterRoom()的异步操作结果。 @param result 返回码。SDK的各种返回码的定义和其他详细说明参考QAVError.h。 */-(void)OnEnterRoomComplete:(int)result;/** @brief 返回QAVContext::ExitRoom()的异步操作结果的函数。 @details 此函数用来返回QAVContext::ExitRoom()的异步操作结果。 @param result 返回码。SDK的各种返回码的定义和其他详细说明参考QAVError.h。 */-(void)OnExitRoomComplete:(int)result;/** @brief 房间成员状态变化通知的函数。 @details 当房间成员发生状态变化(如是否发音频、是否发视频等)时,会通过该函数通知业务侧。 @param eventID 状态变化id,详见QAVUpdateEvent的定义。 @param endpoints 发生状态变化的成员id列表。 */-(void)OnEndpointsUpdateInfo:(QAVUpdateEvent)eventID endpointlist:(NSArray*)endpoints

在成功的回调里面还需要business的一个业务逻辑步骤- (void)enterRoom:(NSInteger)room phone:(NSString*)phone succ:(businessSucc)succ fail:(businessFail)fail 在调用成功后再运行的代码

        //不自动锁屏            [UIApplication sharedApplication].idleTimerDisabled=YES;            [self performSelector:@selector(avRequestView) withObject:nil afterDelay:1];

最后再强调一下这个方法- (void)requestViewOf:(NSArray *)array 曾经也是无数次载到这个方法中。总是回调失败,+(int)requsetViewList:(QAVContext*)context identifierList:(NSArray*)identifierList srcTypeList:(NSArray*)srcTypeList ret:(RequestViewListBlock)block 而这个方法的成败不是这里的原因而是之前进入房间和创建房间的时候是否传入那个自己服务器回传给自己正确的room而导致的。
到此,对于腾讯云在线直播就大致讲解完毕了,如果有遇到还是不太明白的可以留言,帮大家解决下。如果哪里有不完善的地方也希望大神能够帮忙解决下,让更多扔挣扎在腾讯云直播的兄弟姐妹们轻松的解决问题。

2 0
原创粉丝点击