类名 | 类描述 |
---|---|
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 | 公告时间 |