| 类名 | 类描述 |
|---|---|
| VHRoom | 互动类 |
| 属性 | 属性描述 |
|---|---|
| delegate | 代理 |
| status | 当前房间状态 |
| broadCastConfig | 旁路布局配置 |
| isPublishing | 当前是否在推流中 |
| isVideoRound | 是否要参与轮巡 |
| isRehearsal | 是否彩排 YES:彩排模式开播 NO:正常直播 (默认 NO,开播前设置有效) |
| isPublishAnother | 是否开启自动旁路 YES:开启 NO:不开启 (默认 NO,开播前设置有效) |
| isMainScreen | 是否开启自动主屏配置 YES:开启 NO:不开启 (默认 NO,开播前设置有效) |
| cameraView | 当前推流 cameraView,只在推流过程中存在 |
| renderViewsById | 除自己以外房间内其他流 id 与视频 view 信息 (key:streamId value:视频 VHRenderView) |
| streams | 除自己以外房间内其他流 id 列表 |
| roomId | 房间 id |
| roomInfo | 房间相关信息(进入房间成功后才有值) |
| 方法 | 方法描述 |
|---|---|
| enterRoomWithRoomId | 观众进入互动房间 |
| enterRoomWithParams | 观众进入互动房间 |
| guestEnterRoomWithParams | 嘉宾进入互动房间 |
| hostEnterRoomStartWithParams | 主持人进入互动房间 |
| publishWithCameraView | 开始推流 |
| unpublish | 下麦并停止推流 |
| leaveRoom | 离开房间 |
| setRoomJoinBroadCastMixOption | 设置是否加入混流 |
| publishAnotherLive | 开启/关闭旁路直播 |
| baseConfigRoomBroadCast | 基础配置旁路混流参数 |
| setHandsUpStatus | 设置是否开启观众举手申请上麦功能 |
| inviteWithTargetUserId | 邀请某个用户上麦 |
| agreeApplyWithTargetUserId | 同意某个用户的上麦申请 |
| rejectApplyWithTargetUserId | 拒绝某个用户的上麦申请 |
| setMainSpeakerWithTargetUserId | 设置某个用户为主讲人 |
| downMicWithTargetUserId | 下麦某个用户 |
| setBanned | 禁言/取消禁言某个用户 |
| setKickOut | 踢出/取消踢出某个用户 |
| applySuccess | 申请上麦 |
| cancelApplySuccess | 取消申请上麦 |
| rejectInviteSuccess | 拒绝主持人发来的上麦邀请 |
| agreeInviteSuccess | 同意主持人发来的上麦邀请,成功回调中开启推流 |
| settingRoomBroadCastDocMixEnable | 是否开启文档融屏旁路 |
| getOnlineUserListWithPageNum | 获取在线成员列表 |
| getLimitUserListWithPageNum | 获取受限成员列表 (包括:被踢出、被禁言的用户) |
| getDocListWithPageNum | 获取房间文档列表 |
| 方法 | 方法描述 |
|---|---|
| enterRoomWithError | 进入房间 |
| didConnect | 进入房间 |
| didError | 房间发生错误 |
| didChangeStatus | 房间状态改变 |
| didPublish | 推流成功 |
| didUnpublish | 停止推流 |
| didAddAttendView | 视频流加入 |
| didRemovedAttendView | 视频流离开 |
| leaveInteractiveRoomByHost | 自己下麦 |
| microphoneClosed | 自己的麦克风开关状态改变 |
| screenClosed | 自己的摄像头开关状态改变 |
| iskickout | 自己被踢出房间 |
| forbidChat | 自己被禁言或取消禁言 |
| allForbidChat | 收到全体禁言或取消全体禁言 |
| liveOver | 直播结束 |
| receiveRoomMessage | 互动相关消息 |
- (void)enterRoomWithRoomId:(NSString *)roomId;
- (void)enterRoomWithParams:(NSDictionary *)params;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| roomId | 是 | 123456789 | 房间 id,同活动 id |
| params[@"id"] | 是 | params[@"id"] = @"123456789" | 房间 id,同活动 id |
| params[@"nickname"] | 否 | params[@"nickname"] = @"张三" | 昵称 (可选) |
| params[@"email"] | 否 | params[@"email"] = @"xxx@vhall.com" | 邮箱(可选) |
@interface UIViewController () <VHRoomDelegate>
/// 互动SDK
@property (nonatomic, strong) VHRoom *inavRoom;
@end
- (void)viewDidLoad {
[super viewDidLoad];
// 初始化互动对象
self.inavRoom = [[VHRoom alloc] init];
// 设置delegate
self.inavRoom.delegate = self;
// 观众进入互动房间
[self.inavRoom enterRoomWithRoomId:@"123456789"];
}v6.1 新增
- (void)guestEnterRoomWithParams:(NSDictionary *)params
success:(void(^)(VHRoomInfo *info))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| params | 是 | params | 必要参数 |
| params[@"id"] | 是 | params[@"id"] = @"123456789" | 房间 id,同活动 id |
| params[@"nickname"] | 否 | params[@"nickname"] = @"张三" | 昵称 |
| params[@"email"] | 否 | params[@"email"] = @"xxx@vhall.com" | 邮箱(可选) |
| 参数名称 | 备注 |
|---|---|
| success | 成功 |
| fail | 错误 |
// 嘉宾进入互动房间
[self.inavRoom guestEnterRoomWithParams:self.params success:^(VHRoomInfo *roomInfo) {
} fail:^(NSError *error) {
}];收到"房间连接成功回调"后可开始推流(主持人使用)
- (void)hostEnterRoomStartWithParams:(NSDictionary *)params
success:(void(^)(VHRoomInfo *info))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| params | 是 | params | 必要参数 |
| params[@"id"] | 是 | params[@"id"] = @"123456789" | 房间 id,同活动 id |
| params[@"nickname"] | 否 | params[@"nickname"] = @"张三" | 昵称 |
| params[@"email"] | 否 | params[@"email"] = @"xxx@vhall.com" | 邮箱(可选) |
// 主持人进入互动房间
[self.inavRoom hostEnterRoomStartWithParams:self.params success:^(VHRoomInfo *roomInfo) {
}fail:^(NSError *error) {
}];加入房 间成功以后方可调用
- (BOOL)publishWithCameraView:(VHLocalRenderView * )cameraView;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| cameraView | 是 | VHLocalRenderView * cameraView = [VHLocalRenderView new]; | 需要推流的本地摄像头 view |
// 房间连接成功
- (void)room:(VHRoom *)room didConnect:(NSDictionary *)roomMetadata
{
NSLog(@"房间连接成功,开始推流");
//上麦推流
[self.inavRoom publishWithCameraView:self.cameraView];
}- (void)unpublish;[self.inavRoom unpublish];- (void)leaveRoom;[self.inavRoom leaveRoom];- (void)setRoomJoinBroadCastMixOption:(BOOL)isJoin
cameraView:(VHLocalRenderView *)cameraView
finish:(void(^)(int code, NSString * _Nonnull message))handle;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| isJoin | 是 | YES | 是否加入 |
| cameraView | 是 | cameraView | 加入混流的 renderView |
| handle | 返回参数 |
| 参数名称 | 备注 |
|---|---|
| code | 状态码 |
| message | 详情 |
[self.inavRoom setRoomJoinBroadCastMixOption:YES
cameraView:self.videoRoundRenderView
finish:^(int code, NSString * _Nonnull message) {
NSLog(@"状态 === %d 文案 === %@",code,message);
}];- (BOOL)publishAnotherLive:(BOOL)isOpen param:(NSDictionary*)param completeBlock:(void(^)(NSError *error))block;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| isOpen | 是 | YES | Yes 开启旁路直播 NO 关闭旁路直播 |
| param | 是 | param | 调用此函数配置视频质量参数和旁路布局 |
NSMutableDictionary *param = [NSMutableDictionary dictionary];
param[@"precast_pic_exist"] = @(NO); //是展示小人占位图
param[@"backgroundColor"] = [self.roomInfo.videoBackGroundColor stringByReplacingOccurrencesOfString:@"#" withString:@"0x"];
NSMutableDictionary * borderDic = [NSMutableDictionary dictionary];
borderDic[@"exist"] = @(YES);
borderDic[@"width"] = @(1);
borderDic[@"color"] = [self.roomInfo.videoBackGroundColor stringByReplacingOccurrencesOfString:@"#" withString:@"0x"];
param[@"border"] = borderDic; //配置背景颜色
[self.inavRoom publishAnotherLive:YES param:[param copy] completeBlock:^(NSError *error) {
if(!error) { //设置旁路直播状态成功
VUI_Log(@"设置旁路成功");
}else if(error.code == 40008) {//旁路推流正在进行中
VUI_Log(@"设置旁路错误:当前推流正在进行中");
}else {
VUI_Log(@"设置旁路错误:%@",error.domain);
}
}];- (NSDictionary*)baseConfigRoomBroadCast:(VHBroadcastProfileMode)definition layout:(VHBroadcastLayout)layout;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| definition | 是 | VHBroadcastProfileMode_480P_0 | 视频质量参数,推荐使用。即(分辨率+帧率+码率) |
| layout | 是 | VHBroadcastLayout_PATTERN_GRID_1 | 旁路布局模板(非自定义布局) |
BroadcastDefinition definition = VHBroadcastProfileMode_480P_0;
VHBroadcastLayout layout = VHBroadcastLayout_ADAPTIVE_TILED_MODE;
[self.inavRoom baseConfigRoomBroadCast:definition layout:layout]- (void)settingRoomBroadCastBackgroundImageURL:(NSURL *_Nullable)url cropType:(VHRoomBGCropType)cropType finish:(void(^)(int code, NSString * _Nonnull message))handle;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| url | 是 | [NSUrl URLWithString:@""] | 背景图 URL,如果为空,则为取消背景图 |
| cropType | 是 | VHRoomBGCropTypeAspectFit | 填充类型:VHRoomBGCropType |
// 设置背景图片
[self.inavRoom settingRoomBroadCastBackgroundImageURL:[NSURL URLWithString:self.roomInfo.finalVideoBackground] cropType:1 finish:^(int code, NSString * _Nonnull message) {
}];主持人使用,若开启,则观众可举手申请上麦。
- (void)setHandsUpStatus:(NSInteger)status
success:(void(^)(NSDictionary *response))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| status | 是 | 1 | 1:开启 0:关闭 |
| success | 请求成功返回参数 | ||
| fail | 请求失败返回参数 |
[self.inavRoom setHandsUpStatus:1 success:nil fail:nil];主持人使用
- (void)inviteWithTargetUserId:(NSString *)userId
success:(void(^)(void))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| userId | 是 | 123456 | 目标用户 id |
| success | 请求成功返回参数 | ||
| fail | 请求失败返回参数 |
[self.room inviteWithTargetUserId:targetId success:^{
NSLog(@"已发送上麦邀请");
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];主持人使用
- (void)agreeApplyWithTargetUserId:(NSString *)userId
success:(void(^)(void))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| userId | 是 | 123456 | 目标用户 id |
| success | 请求成功返回参数 | ||
| fail | 请求失败返回参数 |
[self.inavRoom agreeApplyWithTargetUserId:targetId success:^{
NSLog(@"同意邀请");
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];主持人使用
- (void)rejectApplyWithTargetUserId:(NSString *)userId
success:(void(^)(void))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| userId | 是 | 123456 | 目标用户 id |
| success | 请求成功返回参数 | ||
| fail | 请求失败返回参数 |
[self.inavRoom rejectApplyWithTargetUserId:targetId success:^{
NSLog(@"拒绝某个用户的上麦申请");
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];主持人使用
- (void)setMainSpeakerWithTargetUserId:(NSString *)userId
success:(void(^)(void))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| userId | 是 | 123456 | 目标用户 id |
| success | 请求成功返回参数 | ||
| fail | 请求失败返回参数 |
[self.inavRoom setMainSpeakerWithTargetUserId:model.account_id success:^{
NSLog(@"设置成功");
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];主持人使用
- (void)downMicWithTargetUserId:(NSString *)userId
success:(void(^)(void))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| userId | 是 | 123456 | 目标用户 id |
| success | 请求成功返回参数 | ||
| fail | 请求失败返回参数 |
[self.inavRoom downMicWithTargetUserId:targetId success:^{
NSLog(@"已下麦该用户");
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];- (void)setBanned:(BOOL)status
targetUserId:(NSString *)userId
success:(void(^)(void))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| status | 是 | YES | YES:禁言 NO:取消禁言 |
| userId | 是 | 123456 | 目标用户 id |
| success | 请求成功返回参数 | ||
| fail | 请求失败返回参数 |
[self.inavRoom setBanned:YES targetUserId:targetId success:^{
NSLog(@"禁言成功");
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];- (void)setKickOut:(BOOL)status
targetUserId:(NSString *)userId
success:(void(^)(void))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| status | 是 | YES | YES:踢出 NO:取消踢出 |
| userId | 是 | 123456 | 目标用户 id |
| success | 请求成功返回参数 | ||
| fail | 请求失败返回参数 |
[self.inavRoom setKickOut:YES targetUserId:targetId success:^{
NSLog(@"踢出成功");
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];- (void)applySuccess:(void(^)(void))success
fail:(void(^)(NSError *error))fail;[self.inavRoom applySuccess:^{
NSLog(@"申请成功");
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];- (void)cancelApplySuccess:(void(^)(void))success
fail:(void(^)(NSError *error))fail;[self.inavRoom cancelApplySuccess:^{
NSLog(@"取消申请成功");
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];- (void)rejectInviteSuccess:(void(^)(void))success
fail:(void(^)(NSError *error))fail;[self.inavRoom rejectInviteSuccess:^{
NSLog(@"拒绝成功");
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];- (void)agreeInviteSuccess:(void(^)(void))success
fail:(void(^)(NSError *error))fail;[self.inavRoom agreeInviteSuccess:^{
NSLog(@"同意成功");
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];- (void)settingRoomBroadCastDocMixEnable:(BOOL)enable
finish:(void(^)(int code, NSString * _Nonnull message))handle;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| enable | 是 | YES | 开启/关闭 |
| handle | 请求返回参数 |
//配置融屏
[self.inavRoom settingRoomBroadCastDocMixEnable: YES finish:^(int code, NSString * _Nonnull message) {
}];- (void)getOnlineUserListWithPageNum:(NSInteger)pageNum
pageSize:(NSInteger)pageSize
nickName:(NSString *)nickName
success:(void(^)(NSArray <VHRoomMember *> *list,BOOL haveNextPage))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| pageNum | 是 | 1 | 页码,第一页从 1 开始 |
| pageSize | 是 | 10 | 每页条数 |
| nickName | 否 | 张三 | 指定昵称(非必传参数,可传 nil) |
| success | 请求成功返回参数 | ||
| fail | 请求失败返回参数 |
| 参数名称 | 备注 |
|---|---|
| role_name | 角色 1 主持人 2 观众 3 助理 4 嘉宾 |
| account_id | 用户 id |
| join_id | 参会 id |
| avatar | 头像 |
| nickname | 昵称 |
| is_speak | 是否上麦中 1:上麦中 其他:未上麦 |
| device_type | 设备类型 0 未知 1 手机端 2PC 3SDK |
| device_status | 设备检测状态 0:未检测 1:可以上麦 2:不可以上麦 |
| is_banned | 是否被禁言 |
| is_kicked | 是否被踢出 |
[self.inavRoom getOnlineUserListWithPageNum:pageNum pageSize:pageSize nickName:nil success:^(NSArray<VHRoomMember *> *list, BOOL haveNextPage) {
NSLog(@"成员列表 === %@ 是否有下一页 === %@",list,haveNextPage);
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];包括:被踢出、被禁言的用户
- (void)getLimitUserListWithPageNum:(NSInteger)pageNum
pageSize:(NSInteger)pageSize
success:(void(^)(NSArray <VHRoomMember *> *list,BOOL haveNextPage))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| pageNum | 是 | 1 | 页码,第一页从 1 开始 |
| pageSize | 是 | 10 | 每页条数 |
| success | 请求成功返回参数 | ||
| fail | 请求失败返回参数 |
[self.inavRoom getLimitUserListWithPageNum:pageNum pageSize:pageSize success:^(NSArray<VHRoomMember *> *list, BOOL haveNextPage) {
NSLog(@"受限成员列表 === %@ 是否有下一页 === %@",list,haveNextPage);
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];- (void)getDocListWithPageNum:(NSInteger)pageNum
pageSize:(NSInteger)pageSize
success:(void(^)(NSArray <VHRoomDocumentModel *> *list,BOOL haveNextPage))success
fail:(void(^)(NSError *error))fail;| 参数名称 | 是否必须 | 示例 | 备注 |
|---|---|---|---|
| pageNum | 是 | 1 | 页码,第一页从 1 开始 |
| pageSize | 是 | 10 | 每页条数 |
| success | 请求成功返回参数 | ||
| fail | 请求失败返回参数 |
| 参数名称 | 备注 |
|---|---|
| size | 文件大小 字节数:size/(1024*1024.0)为 M |
| created_at | 创建时间 |
| updated_at | 修改时间 |
| ext | 文档类型扩展名 |
| document_id | 文档 ID |
| file_name | 文件名 |
[self.room getDocListWithPageNum:pageNum pageSize:10 success:^(NSArray<VHRoomDocumentModel *> *list, BOOL haveNextPage) {
NSLog(@"文档列表 === %@ 是否有下一页 === %@",list,haveNextPage);
} fail:^(NSError *error) {
NSLog(error.localizedDescription);
}];- (void)room:(VHRoom *)room enterRoomWithError:(NSError *)error;| 参数名称 | 备注 |
|---|---|
| error | 错误信息,如果 error 存在,则进入房间失败 |
- (void)room:(VHRoom *)room didConnect:(NSDictionary *)roomMetadata;| 参数名称 | 备注 |
|---|---|
| roomMetadata | 互动直播间数据 (可能为 nil,暂时无用) |
- (void)room:(VHRoom *)room didError:(VHRoomErrorStatus)status reason:(NSString *)reason;| 参数名称 | 备注 |
|---|---|
| status | VHRoomErrorUnknown VHRoomErrorClient VHRoomErrorClientFailedSDP VHRoomErrorSignaling VHRoomErrorKickout : 观看被踢出 |
| reason | 错误描述 |
- (void)room:(VHRoom *)room didChangeStatus:(VHRoomStatus)status;| 参数名称 | 备注 |
|---|---|
| status | 房间状态 |
- (void)room:(VHRoom *)room didPublish:(VHRenderView *)cameraView;| 参数名称 | 备注 |
|---|---|
| cameraView | 当前推流 |
- (void)room:(VHRoom *)room didUnpublish:(VHRenderView *)cameraView;| 参数名称 | 备注 |
|---|---|
| cameraView | 当前推流 cameraView |
流类型包括音视频、共享屏幕、插播等
- (void)room:(VHRoom *)room didAddAttendView:(VHRenderView *)attendView;| 参数名称 | 备注 |
|---|---|
| attendView | 该成员对应视频画面 |
流类型包括音视频、共享屏幕、插播等
- (void)room:(VHRoom *)room didRemovedAttendView:(VHRenderView *)attendView;| 参数名称 | 备注 |
|---|---|
| attendView | 该成员对应视频画面 |
主动下麦/被下麦都会触发此回调
- (void)leaveInteractiveRoomByHost:(VHRoom *)room;主动操作/被操作都会触发此回调,收到此回调后不需要再主动设置麦克风状态
- (void)room:(VHRoom *)room microphoneClosed:(BOOL)isClose;| 参数名称 | 备注 |
|---|---|
| isClose | YES:关闭 NO:开启 |
主动操作/被操作都会触发此回调,收到此回调后不需要再主动设置摄像头状态
- (void)room:(VHRoom *)room screenClosed:(BOOL)isClose;| 参数名称 | 备注 |
|---|---|
| isClose | YES:关闭 NO:开启 |
- (void)room:(VHRoom *)room iskickout:(BOOL)iskickout;| 参数名称 | 备注 |
|---|---|
| iskickout | 是否被踢出 |
- (void)room:(VHRoom *)room forbidChat:(BOOL)forbidChat;| 参数名称 | 备注 |
|---|---|
| forbidChat | 是否被禁言 |
- (void)room:(VHRoom *)room allForbidChat:(BOOL)allForbidChat;| 参数名称 | 备注 |
|---|---|
| allForbidChat | 是否已全体禁言 |
- (void)room:(VHRoom *)room liveOver:(BOOL)liveOver;| 参数名称 | 备注 |
|---|---|
| liveOver | 是否结束 |
- (void)room:(VHRoom *)room receiveRoomMessage:(VHRoomMessage *)message;| 参数名称 | 备注 |
|---|---|
| message | 消息相关信息 |
目前仅支持真实人数改变触发此回调
- (void)onlineChangeRealNum:(NSUInteger)online_real virtualNum:(NSUInteger)online_virtual;| 参数名称 | 备注 |
|---|---|
| online_real | 真实在线用户数 |
| online_virtual | 虚拟在线用户数 |
- (void)room:(VHRoom *)room announcement:(NSString *)content publishTime:(NSString *)time;| 参数名称 | 备注 |
|---|---|
| content | 公告内容 |
| time | 公告时间 |