微吼课堂 iOS-SDK 参考

产品介绍    

产品介绍

简介

本文档目的是指导开发者快速集成微吼课堂iOS-SDK,以便客户可以针对自己的业务场景设计最符合自己业务场景的学员端APP,相关界面需要由开发人员根据设计来恰当的布局。

主要功能

本SDK包含学员端的全部基础功能,最多支持1V4连麦

功能名称 功能描述
观看直播 支持观看课堂直播混流画面
观看回放 支持观看课堂回放录像
参与互动 支持最多1V4连麦互动,观看互动画面
观看文档/白板 支持观看讲师演示的文档和白板
讨论 支持看直播聊天
用户登录 支持通过口令验证机制来控制观看直播和回放的权限
应用签名 保证应用安全防护

接入流程    

接入流程

一、获取AppKey、AppSecretKey

1、联系客户经理开通权限立即沟通权限申请,或4006826882电话立即沟通申请

2、获取API/SDK的使用权限信息,得到Acess key点击查看

二、SDK包下载

  1. 通过pod方式集成 pod 'VHClassSDK'

  2. 手动集成 下载SDK包

微吼平台提供SDK包和demo。其中VHClassSDK即微吼课堂SDK,VHCFoundation作为基础组件,使用其他库时需先引入VHCFoundation库;VHClassSDKDemo是SDK的demo。

打开VHCSDK_iOS.xcworkspace即可查看demo和相关Api。

将SDK包VHClassSDK文件夹添加到项目中

引入SDK包后,将工程中任意文件.m改为.mm。

在TARGETS - General - Embedded Binaries下添加VhallLiveBaseApi、VhallSignalDynamic、WebRTC。

在TARGETS - Build Setting - Enable Bitcode 将值改为NO

添加系统依赖库libicucore.tbd

注意使用互动功能时,需要添加摄像头和麦克风的权限配置

四、注册SDK

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    //注册SDK
	[VHClassSDK initWithAppKey:@"appKey" appSecretKey:@"secretKey"]

    return YES;
}

五、使用SDK

使用与课堂SDK的操作时,请先进入课堂:

VHClassSDK

1、注册SDK:

略...

2、获取课堂基本信息:

/**
 @brief 获取课堂基本信息,异步函数
 @param roomId   课堂id
 @param sucess   成功,返回课堂基本信息  @see VHClassSDKBaseInfo
 @param failed    获取出错,返回错误信息
 */
- (void)classBaseInfoWithRoomId:(nonnull NSString *)roomId
                       sucessed:(void(^)(VHClassBaseInfo *result))sucess
                         failed:(void(^)(VHCError *error))failed;

获取的基本信息通过block回调,在result中查看课堂基础属性,包括布局、课堂状态等。

3、进入课堂:

/**
 @brief          进入课堂房间,异步函数
 @param roomId   要进入的房间id
 @param keyValue 要进入的房间口令,即进入房间的密码
 @param nickName 用户昵称
 @param sucess   进入成功,返回“参会id”,参会id即用户再此课堂中的用户id
 @param failed   进入失败,返回失败原因
 */
- (void)joinClassWithNickName:(nonnull NSString *)nickName
                       roomId:(nonnull NSString *)roomId
                          key:(nonnull NSString *)keyValue
                     sucessed:(void(^)(NSString *joinId,VHClassBaseInfo *result))sucess
                       failed:(void(^)(VHCError *error))failed;

使用SDK其他模块功能前,需要先进入课堂。直播、互动等功能都是在课堂内完成的,所以进入课堂才会有其他模块功能的使用权限。

成功进入课堂后用户就会在微吼课堂的讲师端列表中显示出来。

进入课堂后根据当前课堂的状态选择进入不同的功能模块,如果当前是直播状态,则可以进行看直播、互动。

4、离开课堂

/**
 @brief 退出课堂
 @discussion 退出课堂将关闭与课堂相关的系统消息
 @warning 离开课堂时请务必调用此方法
 */
- (void)leaveRoom;

离开课堂将停止与课堂之间的通信等。

VHCError

微吼课堂SDK错误类,内有错误描述和错误码

/**
 @brief 错误类型
 */
@property (nonatomic, readonly) VHCErrorType errorCode;

/**
 @brief 错误类型描述
 */
@property (nonatomic, copy) NSString *errorDescription;

VHClassBaseInfo

课堂基本信息模型

@property (nonatomic, copy) NSString *roomId;
@property (nonatomic, copy) NSString *roomName;
@property (nonatomic, copy) NSString *introduction;
@property (nonatomic, assign) VHClassState state;
@property (nonatomic, assign) VHClassType type;
@property (nonatomic, assign) VHClassLayout layout;

VHCRecord

此类的父类是VHClassBaseInfo,提供了进入录播课堂的Api:

@interface VHCRecord : VHClassBaseInfo

@property (nonatomic) VHCRecordType recordType;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *recordId;//音视频id

/**
 进入录播课堂  异步函数
 
 */
+ (void)enterRecoredClassSucess:(void(^)(VHCRecord *record))sucess
                         failed:(void(^)(VHCError *error))failed;

@end

成功进入录播课堂才能进行正长的录播课程观看,否则需要刷新重新进入。

VHCLiveUser

此类是微吼课堂用户类,其中包括了用户id,角色等字段,并提供了一个通过用户的joinId获取用户基础信息的Api。

/**
 @brief          获取joinId对应的用户的基础信息,异步函数
 @param joinId   用户参会id
 @param sucess   登录成功,返回用户信息
 @param failed   登录失败,返回失败原因
 */
+ (void)getLiveUserInfoWithJoinId:(NSString *)joinId
                         sucessed:(void(^)(VHCLiveUser *user))sucess
                           failed:(void(^)(VHCError *error))failed;

此类的作用将就是在项目中如果需要获取用户信息,可通过此类的Api来实现目的。

使用说明    

使用说明

一、注意事项

  • SDK支持iOS9.0以及以上系统

  • SDK不支持模拟器

  • 使用文档/白板功能时,需要引入第三放库SDWebImage

  • 需要将工程中任意文件.m改为.mm,修改一个文件即可

  • 注意使用互动功能时,需要添加摄像头和麦克风的权限配置

二、报错处理

1、WebRTC.framework/WebRTC的错误

在TARGETS - General - Embedded Binaries下添加VhallLiveBaseApi、VhallSignalDynamic、WebRTC,如图:

iamge

2、does not contain bitcode的错误

在TARGETS - Build Setting - Enable Bitcode 将值改为NO

3、_utf8_nextCharSafeBody", referenced from

Undefined symbols for architecture arm64:
  "_utf8_nextCharSafeBody", referenced from:
      _validate_dispatch_data_partial_string in libVHCFoundation.a(VHSRWebSocket.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

在TARGETS - Build Phases - Link Binary With Libraries下添加库libicucore.tbd

4、std::terminate()", referenced from:

Undefined symbols for architecture arm64:
  "___cxa_begin_catch", referenced from:
      ___clang_call_terminate in libVHCInteractive.a(VhallStream.o)
  "std::terminate()", referenced from:
      ___clang_call_terminate in libVHCInteractive.a(VhallStream.o)
  "___gxx_personality_v0", referenced from:
      -[VhallStream init] in libVHCInteractive.a(VhallStream.o)
      -[VhallStream initLocalStreamWithOptions:attributes:] in libVHCInteractive.a(VhallStream.o)
      -[VhallStream initLocalStreamWithOptions:attributes:videoConstraints:audioConstraints:] in libVHCInteractive.a(VhallStream.o)
      -[VhallStream initLocalStreamVideoConstraints:audioConstraints:] in libVHCInteractive.a(VhallStream.o)
      -[VhallStream initWithStreamId:attributes:signalingChannel:] in libVHCInteractive.a(VhallStream.o)
      -[VhallStream dealloc] in libVHCInteractive.a(VhallStream.o)
      -[VhallStream setSignalingChannel:] in libVHCInteractive.a(VhallStream.o)
      ...
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

将工程中任意文件的.m改为.mm即可,比如将AppDelegate.m改为AppDelegate.mm

开发指南    

用户登录    

用户登录

登录即“进入课堂”,是指当前用户进入“微吼课堂房间”的过程。

VHCFundation

VHCFundation是微吼课堂SDK基础库,其中VHClassSDK类是“课堂”的管理类,通过如下Api进入课堂。

进入课堂

使用SDK其他模块功能前,需要先进入课堂。直播、互动等功能都是在课堂内完成的,所以进入课堂才会有其他模块功能的使用权限。

成功进入课堂后用户就会在微吼课堂的讲师端列表中显示出来。

进入课堂后根据当前课堂的状态选择进入不同的功能模块,如果当前是直播状态,则可以进行看直播、互动。

进入课堂后,讲师端将显示您已进入状态。进入课堂后可以看直播、进行互动等。

获取课堂基础信息

/**
 @brief 获取课堂基本信息,异步函数
 @param roomId   课堂id
 @param sucess   成功,返回课堂基本信息  @see VHClassSDKBaseInfo
 @param failed   获取出错,返回错误信息
 */
+ (void)getClassInfoWithRoomId:(nonnull NSString *)roomId
                                  sucessed:(void(^)(VHClassBaseInfo *result))sucess
                                      failed:(void(^)(VHCError *error))failed;

进入课堂

/**
  @brief          登录,异步函数
  @param roomId   房间id
  @param nickName 用户昵称
  @param keyValue 口令
  @param sucess   登录成功,返回用户参会id
  @param failed   登录失败,返回失败原因
 */
+ (void)joinWithRoomId:(NSString *)roomId
                           name:(NSString *)nickName
                              key:(nullable NSString *)keyValue
                      sucessed:(void(^)(NSString *joinId,NSString *accessToken,VHClassBaseInfo *result))sucess
                          failed:(void(^)(VHCError *error))failed;

获取的基本信息通过block回调,在result中查看课堂基础属性,包括布局、课堂状态等。

系列课

系列课登录

/**
 @brief          登录,异步函数
 @param roomId   房间id
 @param nickName 用户昵称
 @param keyValue 口令
 @param resourceType 系列课资源类型 系列课中信息 1、系列课资源类型回放 2、系列课资源类型音视频 3、系列课资源类型课程
 @param resourceId   系列课资源ID
 @param sucess   登录成功,返回用户参会id
 @param failed   登录失败,返回失败原因
 */
+ (void)joinWithRoomId:(NSString *)roomId
                           name:(NSString *)nickName
                              key:(nullable NSString *)keyValue
                          phone:(nullable NSString *)phone
               resourceType:(int)resourceType
                    resourceId:(nullable NSString *)resourceId
                       sucessed:(void(^)(NSString *joinId,NSString *accessToken,VHClassBaseInfo *result))sucess
                           failed:(void(^)(VHCError *error))failed;

获取系列课基本信息

/**
 @brief 获取系列课堂基本信息,异步函数
 @param roomId   课堂id
 @param nickName 用户昵称
 @param keyValue 口令
 @param sucess   成功,返回课堂基本信息  @see VHClassSDKBaseInfo
 @param failed   获取出错,返回错误信息
 */
+ (void)getSeriesClassInfoWithRoomId:(nonnull NSString *)roomId
                                                name:(NSString *)nickName
                                                  key:(nullable NSString *)keyValue
                                              phone:(nullable NSString *)phone
                                          sucessed:(void(^)(VHClassBaseInfo *result))sucess
                                              failed:(void(^)(VHCError *error))failed;

离开课堂

即离开当前的课堂,可以理解为退出登录。

/**
 @brief 退出课堂
 @discussion 退出课堂将关闭与课堂相关的系统消息
 @warning 离开课堂时请务必调用此方法
 */
+ (void)leaveRoom;

离开课堂将停止与课堂之间的通信等。

观看直播    

观看直播

VHCLivePlayer是微吼课堂看直播播放器类,此类定义了看直播以及设置直播属性等Api,实现直播观看,进入互动等功能。

1.初始化直播管理类

- (VHCLivePlayer *)livePlayer {
    if (!_livePlayer) {
        _livePlayer = [[VHCLivePlayer alloc] init];
        _livePlayer.delegate = self;
		[self.view addSubview:_livePlayer.playerView];
    }
    return _livePlayer;
}

2.开始播放

/**
 开始播放
 */
- (void)play;

3.停止播放

/**
 停止播放器
 播放器在 非Unknow 的其他状态下,任何时候都可以停止本次播放,停止后再次播放需要重新调用play方法重新播放。
 停止播放后,再次播放播放器状态将从VHPlayerStatePreparing开始。
 */
- (void)stopPlay;

4.销毁播放器

/**
 销毁播放器
 */
- (void)destroyPlayer;

5.静音

/**
 静音
 @param isMute YES:静音 NO:不静音
 */
- (void)setMute:(BOOL)isMute;

6.上麦申请“举手操作”

/**
 @brief 申请上麦,异步函数
 @discussion 异步函数,当error = nil时,申请成功。申请成功后,收到讲师端邀请,方可上麦互动。举手回调成功后主播有30秒的应答时间,30秒后可方再次申请。
 */
- (void)microApplySucess:(void(^)(VHCError *error))complete;

7.拒绝上麦

/**
 @brief 拒绝上麦
 @param type 1:直接拒绝上麦 0:30秒超时拒绝
 @discussion 异步函数,当error = nil时,成功。讲师端邀请上麦时候可以选择拒绝上麦,拒绝后将会给讲师端发送消息。
 */
- (void)refusOfMicroApplyWithType:(NSInteger)type complete:(void(^)(VHCError *error))complete;

需要注意的是,有些活动支持举手,有些活动不支持举手,支持举手的活动讲师端可以设置是否允许举手。当前是否允许举手,以及举手状态变化,会有回调:

/**
 举手设置回调
 */
- (void)player:(VHCLivePlayer *)player interactivePermission:(VHInteractiveState)state
{
    NSLog(@"举手设置回调 %@",[NSThread currentThread]);
    
    switch (state) {
        case VHInteractiveStateWithOut://当前不允许“举手“
            NSLog(@"不允许举手!");
            break;
        case VHInteractiveStateHave:
            NSLog(@"允许举手!");
            break;
    }
}

VHCLivePlayerDelegate

/**
 播放器状态变化回调
 
 @param player VHCLivePlayer实例对象
 @param state  变化后的状态
 */
- (void)player:(VHCLivePlayer *)player stateDidChanged:(VHPlayerState)state;
/**
 视频所支持的分辨率回调
 
 @param definitions 支持的分辨率数组
 */
- (void)player:(VHCLivePlayer *)player supportDefinitions:(NSArray <__kindof NSNumber *> *)definitions curDefinition:(VHCDefinition)definition;
/**
 播放出错回调
 
 @param error 错误
 
 @see VHCError
 */
- (void)player:(VHCLivePlayer *)player playError:(VHCError *)error;
/**
 下载速度回调
 
 @param speed 下载速度
 */
- (void)player:(VHCLivePlayer *)player loadingWithSpeed:(NSString *)speed;

/**
 @brief      上麦回调
 @discussion 上麦方式有两种:1、用户申请上麦,讲师端收到申请,审批同意后会执行此回调;2、讲师直接邀请参会用户上麦,会执行此回调。
 @warning    收到此回调后用户方可以进行上麦推流。
 */
- (void)playerDidRecivedMicroInvitation:(VHCLivePlayer *)player;

/**
 *  观看直播,互动权限变更回调。
 *  @param player         VHCLivePlayer实例
 *  @param state          互动权限,即是否开启“举手”功能
 */
- (void)player:(VHCLivePlayer *)player interactivePermission:(VHInteractiveState)state;

参与互动    

互动连麦

互动功能即用户端与讲师端进行1对1或者1对多的在线视频连麦功能。VHCInteractive库提供此功能。

####注意:使用此类请先在plist文件中添加对于摄像头和麦克风的权限描述。

<!-- 相机 --> 
<key>NSCameraUsageDescription</key> 
<string>需要您的同意,APP才能访问相机</string> 
<!-- 麦克风 --> 
<key>NSMicrophoneUsageDescription</key> 
<string>需要您的同意,APP才能访问麦克风</string> 

1.VHCInteractiveRoom

简介

VHCInteractiveRoom类是微吼课堂互动直播间实体类,此类定义了进入互动、离开互动、推流等Api,实现用户在线互动功能。此类管理互动直播间的生命周期、上麦推流、互动消息等。

1.初始化

/**
 @brief 构造方法
 @warning cameraView 推流用的cameraView,即VHRenderView的实例对象,需用户自己手动创建。初始化时即绑定推流所用的cameraView,推流时只需调用- (void)startPublish方法即可。
 */
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithPushCameraView:(nonnull VHRenderView *)cameraView;

初始化时,需要传入推流使用的cameraView,即自己的摄像头实例,是VHRenderView类的实例。

2.进入直播间

/**
 @brief 进入互动直播间
 @discussion 结果会在- (void)roomdidEnteredWithRoomMetaDataerror:中回调,如果进入成功,可以开始推流上麦。
 */
- (void)enterLiveRoom;

互动前进入互动直播间,进入失败则不能互动,进入结果会有回调

3.上麦推流

/**
 @brief 推流上麦
 @discussion 调用此方法会有两个回调,先回调推流是否成功:- (void)room:didPublishWithCameraView:error:,然后回调上麦是否成功- (void)room:microUpWithError:
 */
- (BOOL)startPublish;

4.停止推流

/**
 @brief 停止推流
 @discussion 下麦的时候需要停止推流。
 */
- (void)stopPulish;

5.离开直播间

/**
 @brief 离开互动直播间,即下麦
 @discussion 停止推流后离开互动直播间需调用此方法。
 */
- (void)leaveLiveRoom;

6.操作自己的设备

/**
 @brief 设置麦克风开关
 @warning 推流后设置才可生效
 @return VHCError 设置失败 错误码:VHCErrorType_NoAuthority无权操作; VHCErrorType_NotEnterClass:未进入课堂或已掉线;VHCErrorType_InVaild:设置无效,未推流前设置都是无效的。
 */
- (VHCError *)closeMicphone:(BOOL)isClose;
/**
 @brief 设置摄像头开关
 @warning 推流后设置才可生效
 @return VHCError 设置失败 错误码:VHCErrorType_NoAuthority无权操作; VHCErrorType_NotEnterClass:未进入课堂或已掉线;VHCErrorType_InVaild:设置无效,未推流前设置都是无效的。
 */
- (VHCError *)closeVideo:(BOOL)isClose;

其中VHCInteractiveRoomDelegate是互动房间代理,此代理定义了进入互动房间结构回调、推流结果回调、上麦结果回调等与互动房间有关的回调方法。在回调中可以处理您关于互动的相关操作。

####VHCInteractiveRoomDelegate

///----------------------------
/// @name 互动直播间生命周期相关回调
///----------------------------

/**
 @brief 进入互动直播间结果回调
 @param data   互动直播间数据
 @param error  错误
 @discussion   当error为nil时候,表示已进入互动直播间;error不为空时,表示进入失败,失败原因描述:error.errorDescription。成功进入互动直播间成功就可以开始推流上麦了。
 */
- (void)room:(VHCInteractiveRoom *)room didEnteredWithRoomMetaData:(NSDictionary *)data error:(VHCError *)error;

/**
 @brief 推流结果回调
 @param cameraView 推流的cameraView
 @param error      推流错误,当error不为空时表示推流失败
 @discussion 推流成功之后,会收到上麦结果的回调。
 */
- (void)room:(VHCInteractiveRoom *)room didPublishWithCameraView:(VHRenderView *)cameraView error:(VHCError *)error;

/**
 @brief 停止推流回调
 @param cameraView 推流的cameraView
 @discussion 自己调用- unpublish停止推流,会回调此方法;被讲师下麦,会停止推流,回调此方法;推流出错,停止推流,会回调此方法。
 */
- (void)room:(VHCInteractiveRoom *)room didUnpublish:(VHRenderView *)cameraView;

/**
 @brief 某用户被讲师下麦回调
 @param byUserId 操作者户参会id,一般的自己被讲师下麦,此id为讲师参会id
 @param toUserId 被操作者户参会id,如果是自己的参会id,则表示自己被讲师下麦。
 */
- (void)room:(VHCInteractiveRoom *)room leaveRoomByUserId:(NSString *)byUserId toUser:(NSString *)toUserId;

/**
 @brief 某用户上麦结果回调
 @param joinId 上麦用户的参会id
 @param error error为nil时上麦成功
 @param info 其他信息
 @discussion  当error为nil时,表示上麦成功。
 */
- (void)room:(VHCInteractiveRoom *)room microUpWithJoinId:(NSString *)joinId attributes:(NSDictionary *)info error:(VHCError *)error;
/**
 @brief 某用户下麦回调
 @param info 其他信息
 @param joinId 下麦用户的参会id
 */
- (void)room:(VHCInteractiveRoom *)room microDownWithJoinId:(NSString *)joinId attributes:(NSDictionary *)info;

/**
 @brief 用户与直播间的连接状态回调
 @param connectedStatus 用户与直播间的连接状态 @see VHCInteractiveRoomConnectedStatus
 @discussion 失去连接则表示该用户已经在主播端下麦,建议在此回调中处理下麦后的业务;当状态为VHCInteractiveRoomConnectedStatusConnected时,表示已成功上麦;当状态为VHCInteractiveRoomConnectedStatusDisConnected时,表示自己已下麦。
 */
- (void)room:(VHCInteractiveRoom *)room connectedStatusChanged:(VHCInteractiveRoomConnectedStatus)connectedStatus;
//
/////--------------------
///// @name 互动相关事件回调
/////--------------------

/**
 @brief 新加入一路流(有成员进入互动房间,即有人上麦)
 @discussion 流id:attendView.streamId;上麦用户参会id:attendView.userId。
 */
- (void)room:(VHCInteractiveRoom *)room didAddAttendView:(VHRenderView *)attendView;

/**
 @brief 减少一路流(有成员离开房间,即有人下麦)
 @discussion 流id:attendView.streamId;上麦用户参会id:attendView.userId。
 */
- (void)room:(VHCInteractiveRoom *)room didRemovedAttendView:(VHRenderView *)attendView;

/**
 @brief 关闭画面回调
 @param isClose YES:关闭,NO:打开
 @discussion byUserId操作者参会id,toUserId被操作者参会id。
 @warning 自己操作自己的设备byUserId和toUserId都是自己的参会id。
 */
- (void)room:(VHCInteractiveRoom *)room screenClosed:(BOOL)isClose byUser:(NSString *)byUserId toUser:(NSString *)toUserId;

/**
 @brief 关闭麦克风回调,即静音操作回调
 @param isClose YES:关闭,NO:打开
 @discussion byUserId操作者参会id,toUserId被操作者参会id。
 @warning 自己操作自己的设备byUserId和toUserId都是自己的参会id。当toUserId == nil时候,表示全体静音。全体禁音针对的群体是除讲师外的所有学员,因此将时端开启全体禁音时,讲师并不会被禁音,除非讲师自己禁音。
 */
- (void)room:(VHCInteractiveRoom *)room microphoneClosed:(BOOL)isClose byUser:(NSString *)byUserId toUser:(NSString *)toUserId;

###2.VHRenderView

VHRenderView类是推流摄像头view类,该类定义了摄像头视图的创建、推流等Api,通过此类进行互动推流。 此类提供了摄像头的创建、前后转换、静音、取消静音等Api,另外也提供了摄像头和麦克风的开关操作。

2.上麦互动

1.创建本地摄像头

- (VHRenderView *)cameraView {
    if (!_cameraView) {
        //语音上麦,只推语音流
        NSDictionary *option = nil;
        if (_type == MicroTypeOnlyVoice) {
            option = @{VHVideoWidthKey:@"192",VHVideoHeightKey:@"144",VHVideoFpsKey:@(25),
							VHMaxVideoBitrateKey:@(200),VHStreamOptionStreamType:@(5)}; }
        _cameraView = [[VHRenderView alloc] 
								initCameraViewWithFrame:CGRectZero pushType:VHPushTypeSD options:option];
        _cameraView.scalingMode = VHRenderViewScalingModeAspectFill;
    }
    return _cameraView;
}

####2.添加本地摄像头

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    ///防止摄像头卡顿再此添加摄像头
    self.cameraView.frame = self.view.bounds;
    [self.view insertSubview:self.cameraView atIndex:0];
}

3.处理进入直播间回调

成功进入,则开始推流上麦

/**
 @brief 进入互动直播间结果回调
 @param data   互动直播间数据
 @param error  错误
 @discussion   当error为nil时候,表示已进入互动直播间;error不为空时,表示进入失败,失败原因描述:error.errorDescription。成功进入互动直播间成功就可以开始推流上麦了。
 */
- (void)room:(VHCInteractiveRoom *)room didEnteredWithRoomMetaData:(NSDictionary *)data error:(VHCError *)error
{
    if (error) {
        VHCLog(@"互动房间连接出错");
        return;
    }
    VHCLog(@"互动房间连接成功,开始推流");
    
    dispatch_async(dispatch_get_main_queue(), ^{
        //上麦推流
        [room publishWithCameraView:self.cameraView];
    });
}

4.处理上麦结果

/**
 @brief 某用户上麦结果回调
 @param joinId 上麦用户的参会id
 @param error error为nil时上麦成功
 @discussion  当error为nil时,表示上麦成功。
 */
- (void)room:(VHCInteractiveRoom *)room microUpWithJoinId:(NSString *)joinId error:(VHCError *)error
{
    if (error) {
        if ([joinId isEqualToString:[User defaultUser].joinId]) {
            VHCLog(@"上麦失败!");
            [VHCTool showAlertWithMessage:@"上麦失败!"];
            //上麦失败,退到看直播
            [self closeButtonClick:nil];
        }
        return;
    }

    if ([joinId isEqualToString:[User defaultUser].joinId])
    {
        VHCLog(@"上麦成功!");
        [VHCTool showAlertWithMessage:@"您已上麦"];
    }
    else {
        [VHCTool showAlertWithMessage:[NSString stringWithFormat:@"用户%@上麦了",joinId]];
    }
}

上麦结果回调会回调每个进入互动直播间的用户上麦消息,根据joinId区分不同的用户,收到上麦结果,error为空时,才算上麦成功,否则上麦失败。上麦失败建议退出互动直播间,重新进入。

其他具体见demo。

三、注意

VHRenderView和VHCInteractiveRoom类都提供了摄像头和麦克风的开关Api:

/*
 * 关闭音频
 */
- (void) muteAudio;

/*
 * 取消关闭音频
 */
- (void) unmuteAudio;

/*
 * 关闭视频
 */
- (void) muteVideo;

/*
 * 取消关闭视频
 */
- (void) unmuteVideo;

以上Api直接对自己的设备进行操作,关闭或者打开自己的摄像头。

/**
 @brief 设置麦克风开关
 @warning 推流后设置才可生效
 @return VHCError 设置失败 错误码:VHCErrorType_NoAuthority无权操作; VHCErrorType_NotEnterClass:未进入课堂或已掉线;VHCErrorType_InVaild:设置无效,未推流前设置都是无效的。
 */
- (VHCError *)closeMicphone:(BOOL)isClose;
/**
 @brief 设置摄像头开关
 @warning 推流后设置才可生效
 @return VHCError 设置失败 错误码:VHCErrorType_NoAuthority无权操作; VHCErrorType_NotEnterClass:未进入课堂或已掉线;VHCErrorType_InVaild:设置无效,未推流前设置都是无效的。
 */
- (VHCError *)closeVideo:(BOOL)isClose;

两者是有区别的,VHRenderView只是单纯的关闭或者打开自己的摄像头,但是不会通知主播端,VHCInteractiveRoom中的Api操作设备后会通知主播端。建议使用VHCInteractiveRoom中提供的Api。

观看文档/白板    

文档 & 白板

VHCDocuments是微吼课堂SDK文档&白板管理类,该类提供了文档和白板的添加、切换等功能。使用此模块功能时,请先确保当前已进入课堂!

文档&白板管理

初始化

VHCDocumentsType 说明
VHCDocumentsType_Live 直播
VHCDocumentsType_VOD 点播
VHCDocEventType 说明
VHCDocEventType_Flip ppt翻页
VHCDocEventType_Paint_Doc ppt画笔
VHCDocEventType_Paint_Board 白板画笔
VHCDocEventType_Over 关闭文档

1、文档事件回调协议

@protocol VHCDocumentsDelegate <NSObject>
@optional
//文档事件回调
- (void)documents:(VHCDocuments *)doc docEventType:(VHCDocEventType)type;
@end

2、文档数据获取回调协议

直播时需传入播放器缓存时间进行文档和画面同步

@protocol VHCDocumentsDataSource <NSObject>

/**
 直播时使用文档需要实现该数据源,传入直播播放器的实际延迟时间,作用是文档和视频同步。
 注意单位:秒
 */
- (float)documentsForLiveRealBufferTime:(VHCDocuments *)doc;

@end

3、初始化、销毁及代理设置

- (instancetype)initWithType:(VHCDocumentsType)type delegate:(id <VHCDocumentsDelegate>)delegate dataSource:(id <VHCDocumentsDataSource>)dataSource;

- (void)destoryDocments;

@property (nonatomic, weak) id <VHCDocumentsDataSource> dataSource;

@property (nonatomic, weak) id <VHCDocumentsDelegate> delegate;

文档&白板父视图

/**
 @brief 文档&白板父视图view。
 */
@property (nonatomic, strong, readonly) UIView *documentDrawView;

文档&白板 frame 设置

/**
 更新paas doc的 frame
 */
- (void)docFrame:(CGRect)docFrame;

按时间查询回放文档绘制信息

/**
 @brief 回放 按时间查询绘制信息
 time 查询时间
 isSeek 是否seek time 之前全部信息 否则返回 time之前一秒的信息
 */
- (void)queryTime:(CGFloat)time seek:(BOOL)isSeek;

是否可以绘制 收到授权画笔信息时设置

#pragma mark - 画笔
/*
 * 是否可以编辑 作为发起端 默认NO 不可编辑
 */
@property (nonatomic, assign) BOOL editEnable;

绘制命令类型

VHCDrawAction 说明
VHCDrawAction_Add 添加画板元素 设置 VHDrawType 时会自动设置为此选项
VHCDrawAction_Modify 选择后修改 画板元素
VHCDrawAction_Delete 删除画板元素
``objective-c
/*
 * 绘制命令类型
 */
- (void)setDrawAction:(int)drawAction;

绘制类型

VHCDrawType 说明
VHCDrawType_Pen 画笔
VHCDrawType_Highlighter 荧光笔
VHCDrawType_Rectangle 矩形
VHCDrawType_Circle
VHCDrawType_Arrow 箭头 此版本暂不支持
VHCDrawType_Text 文字 此版本暂不支持
VHCDrawType_Image 图片 此版本暂不支持
VHCDrawType_Isosceles_Triangle 等腰三角形
VHCDrawType_right_Triangle 直角三角形
VHCDrawType_Single_Arrow 单箭头
VHCDrawType_Double_Arrow 双箭头
``objective-c
/*
 * 绘制类型
 * 注意:设置此参数时  editType 自动设置为 VHEditType_Add 模式
 */
- (void)setDrawType:(int)drawType;

设置绘制图形颜色


/*
 * 设置绘制图形颜色
 */
- (void)setDrawColor:(UIColor*)color;

设置绘制图形线宽


/*
 * 设置绘制图形线宽
 */
- (void)setDrawLineWidth:(NSInteger)size;

文档和白板的使用比较简单,如果用户需要添加自定义视图,可以添加view的方式来实现文档更多功能,比如文档缩放、全屏等。

讨论    

讨论

VHCIMClient是集成消息服务的类,提供IM功能、公告功能、答题功能,其他消息服务等。

一、主要类说明

1、VHCIMClient

VHCIMClient微吼消息服务类。该类定义了微吼聊天消息对象的获取、连接聊天服务等Api,并通过代理的方式转发收到的聊天消息。

此类是一个单例对象。

1.1 使用步骤

获取单例对象->连接聊天服务->实现消息监听

1.2 功能使用

讨论功能

1.2.1 获取聊天记录

/**
 @brief 获取number条聊天数据,异步函数
 @discussion 异步函数,结果通过block回调
 @param number 获取条数
 @param msgArray 获取成功回调
 @param failed 失败回调
 */
- (void)getLatestMsgWithNum:(NSUInteger)number
                 completion:(void(^)(NSArray <VHCMsg*> *result))msgArray
                     failed:(void(^)(VHCError *error))failed;

/**
 @brief 分页获取聊天数据,异步函数
 @param page 页数
 @param size 每页数据条数,每页最多可获取200条
 @param msgArray 获取成功回调
 @param failed 失败回调
 */
- (void)getChatMsgWithPageNum:(NSUInteger)page
                     pageSize:(NSUInteger)size
                   completion:(void(^)(NSArray <VHCMsg*> *result))msgArray
                       failed:(void(^)(VHCError *error))failed;

支持获取最近的N条聊天记录和分页获取。

1.2.2 发送消息

/**
 @brief 发送消息
 @warning 最长200字
 */
- (void)sendMsg:(NSString *)msg
        success:(void(^)(void))success
        failure:(void(^)(VHCError *error))failure;

1.2.3 接收消息

/**
 @brief 收到聊天消息
 */
- (void)imClient:(VHCIMClient *)client event:(NSString *)event message:(VHCMsg *)message;

1.2.4 言论状态监听回调

/**
 @brief 主播端禁止某用户发言回调
 @param isBan       YES:被禁言,NO:被取消禁言
 @param joinId      被禁言用户的参会id,全体禁言此id为空
 @warning    讲师端对某禁言/取消禁言,会回调此方法,首次进入聊天也会回调该状态。
 */
- (void)imClient:(VHCIMClient *)client banToChat:(BOOL)isBan withJoinId:(NSString *)joinId

答题功能

1、接收答题消息回调

 @brief 问卷消息回调
 */
- (void)imClient:(VHCIMClient *)client questionMsg:(VHCQuestion *)question;

收到问卷消息回调,处理问卷相关业务,微吼课堂的问卷功能。

2、提交问卷答案

/**
 @brief 提交问卷答案,异步函数
 @param quId 问题id
 @param answers 答案id数组
 */
- (void)commitAnswerWithQuestionId:(NSString *)quId
                            answer:(NSArray<__kindof NSString *> *)answers
                           success:(void(^)(void))success
                           failure:(void(^)(VHCError *error))failure;

公告功能

/**
 @brief 公告消息回调
 */
- (void)imClient:(VHCIMClient *)client announcementMsg:(VHCAnnouncement *)announcement;

在代理中接收公告消息回调,处理微吼课堂公告。

骰子功能

/**
 @brief 设置与取消骰子授权
 @param target_id 被授权参会人id
 @param status 1设置 2取消
 */
- (void)requestSetSieveTarget_id:(NSString *)target_id
                          status:(NSString *)status
                         success:(void(^)(void))success
                         failure:(void(^)(VHCError *error))failure;

/**
 @brief 被授权用户投掷骰子
 @param join_id 被操作参会id
 */
- (void)requestSetSievePointNumJoin_id:(NSString *)join_id
                               success:(void(^)(void))success
                               failure:(void(^)(VHCError *error))failure;

抢答功能

/**
 @brief 学员抢答
 @param join_id 被操作参会id
 */
- (void)requestStudentRushAnswerJoin_id:(NSString *)join_id
                                success:(void(^)(void))success
                                failure:(void(^)(VHCError *error))failure;

课程评价功能


/**
 @brief [通用]提交课程评价
 @param join_id 参会id
 @param evaluate 评价分数
 */
- (void)requestAddEvaluateJoin_id:(NSString *)join_id
                         evaluate:(NSString *)evaluate
                          success:(void(^)(void))success
                          failure:(void(^)(VHCError *error))failure;

二、使用

使用步骤: 1、引入聊天头文件 2、连接聊天服务器 3、接收聊天消息/获取最近的N条聊天记录 4、处理您自己的聊天显示

启动聊天服务并添加代理

//启动聊天服务器
- (void)startIMClient {
    [[VHCIMClient sharedIMClient] connect];
    [[VHCIMClient sharedIMClient] addDelegate:self];
}

回调中接收聊天数据并处理数据:

/**
 @brief 收到聊天消息回调
 */
- (void)imClient:(VHCIMClient *)client event:(NSString *)event message:(VHCMsg *)message
{
    //4、处理您自己的聊天显示
    VHCLog(@"收到聊天消息:%@",message.text);
    ChatModel *model = [[ChatModel alloc] init];
    [model setAttributesWithData:message];
    if (self.dataSource.count > 1000) {
        [self.dataSource removeLastObject];
    }
    [self.dataSource insertObject:model atIndex:0];
    [self reloadData];
}

言论状态:

/**
 @brief 主播端禁止某用户发言回调
 @param isBan       YES:被禁言,NO:被取消禁言
 @param joinId      被禁言用户的参会id,全体禁言此id为空
 @warning    讲师端对某禁言/取消禁言,会回调此方法,首次进入聊天也会回调该状态。
 */
- (void)imClient:(VHCIMClient *)client banToChat:(BOOL)isBan withJoinId:(NSString *)joinId
{
    //如果被禁言/取消禁言的是自己
    if ([joinId isEqualToString:[User defaultUser].joinId]) {
        if (isBan) {
            [VHCTool showAlertWithMessage:@"您已被禁言!"];
        }
        else {
            [VHCTool showAlertWithMessage:@"您已被取消禁言!"];
        }
    }
}
/**
 @brief 全体禁止发言状态改变回调
 @param isSilence   是否全体禁言,YES:主播开启了全体禁言,NO:主播取消了全体禁言
 @discussion 主播端开启/关闭全体禁言会回调此方法。首次进入聊天也会回调该状态。
 */
- (void)imClient:(VHCIMClient *)client wholeUserIsBan:(BOOL)isSilence {
    if (isSilence) {
        [VHCTool showAlertWithMessage:@"主播已开启了全体禁言!"];
    }
    else {
        [VHCTool showAlertWithMessage:@"主播已取消了全体禁言!"];
    }
}

其他

其他关于聊天页面以及聊天键盘等需用户自定义,demo提供简易版,不建议直接使用。

观看回放    

观看点播

VHCVodPlayer是微吼课堂回放播放器类,此类定义了看点播视频以及设置点播属性等Api,实现点播观看的功能。

看回放

####1.初始化点播播放器

- (VHCVodPlayer *)vodPlayer {
    if (!_vodPlayer) {
        _vodPlayer = [[VHCVodPlayer alloc] init];
        _vodPlayer.delegate = self;
		_vodPlayer.playerView.frame = CGRectMake(0, 0, 150, 113);
		[self.view addSubview:_vodPlayer];
    }
    return _vodPlayer;
}

####2.播放相关

/**
 * 开始播放
 */
- (void)play;

/**
 * 直接使用回放id播放的业务,例如插播.
 */
- (void)showVideoWithRecordId:(NSString *)record accessToken:(NSString *)accessToken;

/**
 * 播放暂停
 */
- (void)pause;

/**
 * 重新播放
 */
- (void)resume;

/**
 * 停止播放
 */
- (void)stopPlay;

/**
 * 销毁播放
 */
- (void)destroyPlayer;

/*
 seek 播放跳转到音视频流某个时间
 * time: 流时间,单位为秒
 */
- (BOOL)seek:(float)time;

/**
 静音
 @param isMute YES:静音 NO:不静音
 */
- (void)setMute:(BOOL)isMute;

####3.VHCVodPlayerDelegate

VHCVodPlayerDelegate中有点播播放器的播放状态、播放进度、播放错误、当前视频支持的分辨率、缓冲、播放等的回调,在回调中处理您需要处理的业务。

/**
 播放器状态变化回调
 
 @param player VHCVodPlayer实例对象
 @param state  变化后的状态
 */
 
- (void)player:(VHCVodPlayer *)player stateDidChanged:(VHPlayerState)state;
/**
 视频所支持的分辨率
 
 @param definitions 支持的分辨率数组
 */
 
- (void)player:(VHCVodPlayer *)player supportDefinitions:(NSArray <__kindof NSNumber *> *)definitions curDefinition:(VHCDefinition)definition;

/**
 播放出错回调
 @param error 错误
 @see LiveStatus
 */
- (void)player:(VHCVodPlayer *)player playError:(VHCError *)error;

/**
 下载速度回调
 
 @param speed 错误
 */
- (void)player:(VHCVodPlayer *)player loadingWithSpeed:(NSString *)speed;

/**
 当前播放时间回调
 */
- (void)player:(VHCVodPlayer*)player playTime:(NSTimeInterval)currentTime;

相关下载    

相关下载

点击下载SDK & demo

业务层SDK对接