实时互动频道
更新时间: 2024/11/21 15:43:37
实时互动频道模块,是基于圈组,在文字基础上新增的,用于提供产品能力、丰富社区运营、提升用户活跃的,适用于百万用户量级、多场景、多能力的在线实时互动的多媒体插件。
网易云信 NIM SDK 通过插件的方式引入实时互动频道模块,通过接口的融合,帮助用户在圈组中实现在线实时互动,用户无需独立对接。
实时互动频道模块(QChatMedia
)中主要包含以下三类接口,分别实现不同的功能。
NIMQChatMediaKit
接口提供实时互动频道模块的初始化等能力。NIMQChatMediaChannelManager
接口提供实时互动模块的连接、更新以及实时互动频道内多样的音视频通话能力。NIMQChatMediaChannelDelegate
接口提供实时互动频道相关事件的监听能力。
本文介绍如何在圈组中引入实时互动频道模块,并在实时互动频道中实现实时音视频通话功能。
技术原理
图中的圈组服务器并非传统意义上的服务器,它是社群本身。所有的内容、兴趣、话题、关系都是以此为基础进行发展的。在圈组的场景下,任何行为的开始前都应该先创建一个圈组服务器。圈组详细信息,请参见圈组介绍。
实时互动频道与频道的关联逻辑
实时互动频道是频道的一种类型,通过参数 NIMQChatChannelType
来区分(NIMQChatChannelTypeRTC
= 1)。
频道的管理需要在 NIMQChatChannelManager
中进行,包括创建、删除实时互动频道,以及管理权限等,具体请参见频道管理。
实时互动频道内的音视频相关功能需要在实时互动频道模块 (QChatMedia
) 中实现。
使用实时互动频道模块相关接口,需要拥有音视频权限(具体权限类型请参见NIMQChatPermissionType
),可通过更新身份组来实现。
实时互动频道可见机制
实时互动频道的可见机制与频道相同,分以下两种情况:
- 如果实时互动频道为公开频道,那么只要用户未被加入频道黑名单,实时互动频道就对其可见。
- 如果实时互动频道为私密频道,那么用户需被加入频道白名单,实时互动频道才对其可见。
频道黑白名单相关操作,请参见频道管理。
实现方法
本节以实时互动频道创建者与实时互动频道成员之间的交互为例,介绍在圈组中实现音视频通话功能的流程。
前提条件
- 已开通实时互动频道功能。实时互动频道需要在开通圈组功能的基础上额外开通后才能使用。
- 已初始化登录圈组,并创建或加入圈组服务器和身份组,具体请参见圈组服务器管理和身份组。
时序图
sequenceDiagram
用户A ->> 圈组: 初始化并登录圈组
用户B ->> 圈组: 初始化并登录圈组
用户A ->> 圈组: 创建圈组服务器(自动生成@everyone身份组)
用户B ->> 圈组: 加入圈组服务器
用户A ->> 圈组: 修改服务器身份组并设置实时互动相关权限
用户A ->> 圈组: 创建实时互动频道
note over 用户A: 频道类型为NIMQChatChannelTypeRTC
note over 圈组: 实现音视频通话功能(以共享屏幕和打开音频为例)
用户A ->> 圈组: 引入NIMQChatMedia模块
用户B ->> 圈组: 引入NIMQChatMedia模块
用户A ->> 圈组: 初始化NIMQChatMedia模块
用户A ->> 圈组: 连接已创建的实时互动频道
用户B ->> 圈组: 初始化NIMQChatMedia模块
用户B ->> 圈组: 连接实时互动频道
用户A ->> 圈组: 监听成员屏幕共享状态和成员音频状态
用户B ->> 圈组: 开启本端屏幕共享和音频
圈组 ->> 用户A: 返回成员屏幕共享状态和音频状态回调
这里主要介绍部分步骤,其余步骤请参考对应的文档。
实现流程
1.用户 A 通过调用 updateServerRole:
方法修改服务器身份组并设置实时互动相关权限(NIMQChatPermissionType)。示例代码如下:
// 连接权限
NIMQChatPermissionStatusInfo *connectPermission = [[NIMQChatPermissionStatusInfo alloc] init];
connectPermission.type = NIMQChatPermissionTypeRTCChannelConnect;
connectPermission.status = NIMQChatPermissionStatusAllow;
// 开启麦克风权限
NIMQChatPermissionStatusInfo *microPhonePermission = [[NIMQChatPermissionStatusInfo alloc] init];
microPhonePermission.type = NIMQChatPermissionTypeRTCChannelOpenMicrophone;
microPhonePermission.status = NIMQChatPermissionStatusAllow;
// 开启摄像头权限
NIMQChatPermissionStatusInfo *cameraPermission = [[NIMQChatPermissionStatusInfo alloc] init];
cameraPermission.type = NIMQChatPermissionTypeRTCChannelOpenCamera;
cameraPermission.status = NIMQChatPermissionStatusAllow;
NIMQChatUpdateServerRoleParam *param = [[NIMQChatUpdateServerRoleParam alloc] init];
param.serverId = 56435;
param.roleId = 765436;
param.commands = @[connectPermission, microPhonePermission, cameraPermission];
//修改权限
[[NIMSDK sharedSDK].qchatRoleManager updateServerRole:param completion:^(NSError * _Nullable error, NIMQChatServerRole * _Nullable result) {
//修改完成后的code
}];
修改服务器身份组权限需要拥有管理身份组的权限(NIMQChatPermissionTypeManageRole
)。具体请参见身份组。
- 用户 A 调用
createChannel:
方法创建实时互动频道。示例代码如下:
objcid<NIMQChatChannelManager> qchatChannelManager = [[NIMSDK sharedSDK] qchatChannelManager];
NIMQChatCreateChannelParam * param = [[NIMQChatCreateChannelParam alloc] init];
param.serverId = 123456;
param.name = @"云信Channel";
param.type = NIMQChatChannelTypeRTC;
//反垃圾业务id
param.antispamBusinessId = @"{\"picbid\": \"804265342b7425324f53425c343454\", \"txtbid\": \"804265342b7425324f53425c343454\"}";
[qchatChannelManager createChannel:param
completion:^(NSError *__nullable error, NIMQChatChannel *__nullable result) {
// your code
}];
- 创建实时互动频道需要拥有管理频道的权限(
NIMQChatPermissionTypeManageChannel
)。具体请参见身份组。 - 实时互动频道的类型为
NIMQChatChannelTypeRTC
。 - 创建的实时互动频道需要对用户 B 可见,后续用户 B 才能进行连接。具体请参见实时互动频道可见机制。
- 引入实时互动频道功能插件(
NIMQChatMediaKit
)。示例代码如下:
pod 'NIMQChatMediaKit'
- 调用
initWithCompletion:
方法初始化实时互动频道模块,添加相关代理监听方法。示例代如下:
[[NIMQChatMediaKit shared] initWithCompletion:^(NSError * _Nullable error) {
//初始化完成后的code
}];
[[NIMQChatMediaKit shared].channelManager addMediaChannelListener:self];
- 调用
connectChannel:ofServer:completion:
方法连接已创建的实时互动频道。示例代码如下:
[[NIMQChatMediaKit shared].channelManager connectChannel:4235654 ofServer:5325432 completion:^(NSError * _Nullable error) {
//进入实时互动频道后的code
}];
-
在实时互动频道中实现具体的音视频功能(以共享屏幕和打开音频为例)。
a. 注册成员共享屏幕状态(
onMemberScreenShareStateChangedWithMember:isSharing:operateBy:
)和成员音频状态(onMemberAudioMuteChangedWithMember:mute:operateBy:
)回调方法监听事件。b. 调用
startScreenShareWithCompletion:
和unmuteAudioWithAccId:completion:
方法开启本端屏幕共享并打开成员音频。c. 触发回调,服务器返回成员共享屏幕状态和成员音频状态信息。
// 成员共享屏幕状态回调
- (void)onMemberScreenShareStateChangedWithMember:(NSString *)memberAccId isSharing:(BOOL)isSharing operateBy:(NSString *)operateByAccId
{
}
// 成员音频状态回调
- (void)onMemberAudioMuteChangedWithMember:(NSString *)memberAccId mute:(BOOL)mute operateBy:(NSString *)operateByAccId
{
}
****
// 开启本端屏幕共享
[[NIMQChatMediaKit shared].channelManager startScreenShareWithCompletion:^(NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(),^{
if (!error) {
// 打开屏幕共享成功
} else {
// 打开屏幕共享失败
}
});
}];
// 打开成员音频
[[NIMQChatMediaKit shared].channelManager unmuteAudioWithAccId:@"zhangsan" completion:^(NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(),^{
//更新UI
});
}];
- 调用
disconnectCompletion:
方法与实时互动频道断开连接。示例代码如下:
[[NIMQChatMediaKit shared].channelManager disconnectCompletion:^(NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(),^{
if (!error) {
// 退出房间成功
}
});
}];
实时互动频道功能列表
以上流程中只针对共享屏幕和打开音频进行了具体说明,实时互动频道还支持以下功能,可参考上述示例实现用户所需的其他音视频功能。
功能 |
描述 |
---|---|
切换摄像头 | switchCamera |
打开音频 | unmuteAllAudioWithCompletion: (所有成员);unmuteMyAudio: (自己);unmuteAudioWithAccId: (指定成员) |
打开视频 | unmuteAllVideoWithCompletion: (所有成员);unmuteMyVideo: (自己); unmuteVideoWithAccId:completion: (指定成员) |
共享屏幕 | startScreenShareWithCompletion: |
订阅远端视频流/辅流视频 | subscribeRemoteVideoStreamWithAccId ;subscribeRemoteVideoSubStreamWithAccId: |
设置用户画布 | setupLocalVideoCanvas: (本端画布);setupRemoteVideoCanvas: (远端画布);setupRemoteSubStreamVideoCanvas: (远端辅流画布) |
打开扬声器 | setSpeakerphoneOn: |
启动说话者音量提示 | enableAudioVolumeIndicationWithEnable: |
API 参考
以下为本文涉及的实时互动频道相关 API。
API |
说明 |
---|---|
updateServerRole: |
修改服务器身份组 |
createChannel: |
创建实时互动频道 |
initWithCompletion: |
初始化实时互动频道模块 |
connectChannel:ofServer:completion: |
连接实时互动频道 |
disconnectCompletion: |
取消连接实时互动频道 |
addMediaChannelListener: |
添加实时互动频道事件监听 |
removeMediaChannelListener: |
移除实时互动频道监听 |
unmuteAudioWithAccId:completion: |
打开成员音频 |
muteVideoWithAccId:completion: |
关闭成员音频 |
startScreenShareWithCompletion: |
开启本端屏幕共享 |
stopScreenShareWithCompletion: |
关闭本端屏幕共享 |
onMemberScreenShareStateChangedWithMember:isSharing:operateBy: |
成员屏幕共享状态回调 |
onMemberAudioMuteChangedWithMember:mute:operateBy: |
成员音频状态回调 |
更多实时互动频道相关接口如下:
NIMQChatMediaKit
接口提供实时互动频道模块的初始化等能力。NIMQChatMediaChannelManager
接口提供实时互动模块的连接、更新以及实时互动频道内多样的音视频通话能力。NIMQChatMediaChannelDelegate
接口提供实时互动频道相关事件的监听能力。
常见问题
调用connectChannel:
方法连接已创建的实时互动频道时报错,提示需要 token。
问题原因:连接的频道不是实时互动频道,即频道类型不是 NIMQChatChannelTypeRTC
,请重新连接类型为 NIMQChatChannelTypeRTC
的频道。