我们在之前的文章中已经了解了TRTC的1v1和多人语音聊天,本篇文章来了解下TRTC的语音聊天室。
TRTC SDK为我们提供了官方的语音聊天室的Demo,为了方便开发者快速接如及实现功能,其Demo内的model与UI均可复用至自己的工程内部,可按照自己功能需求在此基础上进行修改。
model:可完全复用及根据自己需求删减
UI:可完全复用及根据自己需求删减
表格列出了各个 swift 文件或文件夹及其所对应的 UI 界面,可根据自己的需求二次修改
文件或文件夹 | 功能描述 |
---|---|
TRTCVoiceRoomEnteryController | 该文件包含所有 ViewController 的初始化获取方法,您可以通过该实例,快速获取 ViewController 对象。 |
NetworkRoomManager | 业务后台交互相关。 |
TRTCCreateVoiceRoomViewController | 创建语音聊天室页面逻辑。 |
TRTCVoiceRoomListViewController | 列表页面逻辑。 |
TRTCVoiceRoomViewController | 主房间页面,包括主播和观众两种界面。 |
我们以复用Demo的model模块,自定义UI的集成步骤为例。
pod 'TXIMSDK_iOS'
pod 'TXLiteAVSDK_TRTC'
向系统申请使用权限,在info.plist文件中添加一下两个key和对应的描述:
key | 描述 |
---|---|
Privacy - Camera Usage Description | App需要使用摄像头权限,开启后才会有视频画面 |
Privacy - Microphone Usage Description | App需要使用麦克风权限,开启后才会有语音信息 |
将官方Demo中的model文件夹拖入自己的工程内部即可。如有头文件导入报错,请在工程内部的PCH文件导入所需SDK的头文件即可。
sharedInstance
类方法可以创建一个遵守 TRTCVoiceRoom 协议的实例对象。也可以使用调用shared
类方法,获取 TRTCVoiceRoomImp实例对象直接使用,二者在 TRTCVoiceRoom 的接口使用上没有任何区别。setDelegate
函数注册组件的事件回调通知。login
函数完成组件的登录,请参考下表填写关键参数:参数名作用sdkAppId您可以在 实时音视频控制台 中查看 SDKAppID。userId当前用户的 ID,字符串类型,只允许包含英文字母(a-z、A-Z)、数字(0-9)、连词符(-)和下划线(_)。userSig腾讯云设计的一种安全保护签名,获取方式请参考 如何计算 UserSig。callback登录回调,成功时 code 为0。//初始化TRTCVoiceRoom
voiceRoom = [TRTCVoiceRoom sharedInstance];
//设置代理,实现代理方法接收回调
voiceRoom.delegate = self;
//登录组件
[[TRTCVoiceRoom sharedInstance] login:SDKAPPID userId:userID userSig:userSig callback:^(int32_t code, NSString * _Nonnull message) {
}];
1. TRTCVoiceRoom组件的登录是在PortalViewController(为功能选择页)内实现,在跳转聊天室列表控制器前调用登录组件方法
- (void)gotoVoiceRoomView {
NSString *userID = [[ProfileManager shared] curUserID];
NSString *userSig = [[ProfileManager shared] curUserSig];
//登录组件
[self.voiceRoom login:SDKAPPID userId:userID userSig:userSig callback:^(int32_t code, NSString * _Nonnull message) {
NSLog(@"login voiceroom success.");
}];
LoginResultModel *curUser = [[ProfileManager shared] curUserModel];
//设置自己的昵称和头像信息
[self.voiceRoom setSelfProfile:curUser.name avatarURL:curUser.avatar callback:^(int32_t code, NSString * _Nonnull message) {
NSLog(@"voiceroom: set self profile success.");
}];
//进入房间列表页
TRTCVoiceRoomEnteryControl* container = [[TRTCVoiceRoomEnteryControl alloc] initWithSdkAppId:SDKAPPID userId:userID];
UIViewController* vc = [container makeEntranceViewController];
[self.navigationController pushViewController:vc animated:YES];
}
2. 组件登录成功后即可进入聊天室列表,选择聊天进入或者创建一个聊天室。
1. 在创建聊天室前还需要对聊天室的房间 ID、上麦是否需要房主确认、麦位数、房间主题、昵称、房间的音质等信息进行提前组装,Demo在跳转到TRTCVoiceRoomViewController后在viewDidLoad方法内部通过TRTCVoiceRoomViewModel创建房间。
func createRoom() {
//组装创建房间前参数
let userId = ProfileManager.shared.curUserID() ?? dependencyContainer.userId
let coverAvatar = ProfileManager.shared.curUserModel?.avatar ?? ""
let roomId = getRoomId()
let roomInfo = VoiceRoomInfo.init(roomID: roomId, ownerId: userId, memberCount: 7)
roomInfo.ownerName = userName
roomInfo.coverUrl = coverAvatar
roomInfo.roomName = roomName
roomInfo.needRequest = needRequest
//跳转TRTCVoiceRoomViewController
let vc = self.dependencyContainer.makeVoiceRoomViewController(roomInfo:roomInfo, role: .anchor, toneQuality: self.toneQuality)
viewResponder?.push(viewController: vc)
}
由于腾讯云暂不提供聊天室列表管理,所以需要我们自己来管理创建的聊天室列表。在Demo中也可看到此问题,在创建聊天室和主播销毁聊天室的时候各发送了一个网络请求给后端,有后端来记录目前存在的聊天室,生成列表。
public func createRoom(toneQuality: Int = 0) {
var coverUrl = roomInfo.coverUrl
if !coverUrl.hasPrefix("http") {
coverUrl = ProfileManager.shared.curUserModel?.avatar ?? ""
}
//设置音质
voiceRoom.setAuidoQuality(quality: toneQuality)
//设置用户信息
voiceRoom.setSelfProfile(userName: roomInfo.ownerName, avatarURL: coverUrl) { [weak self] (code, message) in
guard let `self` = self else { return }
TRTCLog.out("setSelfProfile\(code)\(message)")
//向后端发送创建房间的网络请求
TRTCVoiceRoomManager.shared.createRoom(sdkAppID: SDKAPPID, roomID: "\(self.roomInfo.roomID)", success: { [weak self] in
guard let `self` = self else { return }
//真正利用TRTCVoiceRoom创建房间
self.internalCreateRoom()
}) { [weak self] (code, message) in
guard let `self` = self else { return }
if code == -1301 {
self.internalCreateRoom()
} else {
self.viewResponder?.showToast(message: "创建房间失败")
self.viewResponder?.popToPrevious()
}
}
}
}
TRTCVoiceRoom创建房间方法
/**
* 创建房间(主播调用)
*
* 主播正常的调用流程是:
* 1. 主播调用`createRoom`创建新的语音聊天室,此时传入房间 ID、上麦是否需要房主确认、麦位数等房间属性信息。
* 2. 主播创建房间成功后,调用`enterSeat`进入座位。
* 3. 主播收到组件的`onSeatListChange`麦位表变化事件通知,此时可以将麦位表变化刷新到 UI 界面上。
* 4. 主播还会收到麦位表有成员进入的`onAnchorEnterSeat`的事件通知,此时会自动打开麦克风采集。
*
* - parameter roomID 房间标识,需要由您分配并进行统一管理。
* - parameter roomParam 房间信息,用于房间描述的信息,例如房间名称,封面信息等。如果房间列表和房间信息都由您的服务器自行管理,可忽略该参数。
* - parameter callback 创建房间的结果回调,成功时 code 为0.
*/
- (void)createRoom:(int)roomID roomParam:(VoiceRoomParam *)roomParam callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(createRoom(roomID:roomParam:callback:));
房间创建成功后需要房主进入占座
private func takeMainSeat() {
//房主进入占座
voiceRoom.enterSeat(seatIndex: 0) { [weak self] (code, message) in
guard let `self` = self else { return }
if code == 0 {
self.viewResponder?.showToast(message: "房主占座成功")
} else {
self.viewResponder?.showToast(message: "房主占座失败")
}
}
}
TRTCVoiceRoom方法
* 主动上麦(观众端和主播均可调用)
*
* 上麦成功后,房间内所有成员会收到`onSeatListChange`和`onAnchorEnterSeat`的事件通知。
*
* - parameter seatIndex 需要上麦的麦位序号
* - parameter callback 操作回调
*/
- (void)enterSeat:(NSInteger)seatIndex callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(enterSeat(seatIndex:callback:));
占座成功后,收到 onSeatListChange 事件通知,更新座位状态。
/// 房间座位变更回调
/// @param seatInfolist 座位列表信息
- (void)onSeatInfoChange:(NSArray<VoiceRoomSeatInfo *> *)seatInfolist
房间创建好、主播占座后即可等待观众加入房间。当观众进入房间后主播和观众都会回调
/// 观众进房回调
/// @param userInfo 观众信息
- (void)onAudienceEnter:(VoiceRoomUserInfo *)userInfo
NS_SWIFT_NAME(onAudienceEnter(userInfo:));
现在有已经有观众在房间内部,主播想与观众进行互动,主播可以邀请观众上麦,可调用
/**
* 向用户发送邀请
*
* - parameter cmd 业务自定义指令
* - parameter userId 邀请的用户ID
* - parameter content 邀请的内容
* - parameter callback 发送结果回调
* - returns: inviteId 用于标识此次邀请ID
*/
- (NSString *)sendInvitation:(NSString *)cmd
userId:(NSString *)userId
content:(NSString *)content
callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(sendInvitation(cmd:userId:content:callback:));
向观众发送邀请信令。
当观众接受邀请的时候调用以下方法上麦
/**
* 抱人上麦(主播调用)
*
* 主播抱人上麦,房间内所有成员会收到`onSeatListChange`和`onAnchorEnterSeat`的事件通知。
*
* - parameter seatIndex 需要抱麦的麦位序号
* - parameter userId 用户id
* - parameter callback 操作回调
*/
- (void)pickSeat:(NSInteger)seatIndex userId:(NSString *)userId callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(pickSeat(seatIndex:userId:callback:));
当观众接受主播邀请后房间内所有人会收到
/// 房间作为变更回调
/// @param seatInfolist 座位列表信息
- (void)onSeatInfoChange:(NSArray<VoiceRoomSeatInfo *> *)seatInfolist
NS_SWIFT_NAME(onSeatListChange(seatInfoList:));
和
/// 主播上麦回调
/// @param index 麦位号
/// @param user 用户信息
- (void)onAnchorEnterSeat:(NSInteger)index
user:(VoiceRoomUserInfo *)user
NS_SWIFT_NAME(onAnchorEnterSeat(index:user:));
两个回调。
在主播发送邀请后想取消邀请可调用
/**
* 取消邀请
* - parameter identifier 邀请ID
* - parameter callback 接受操作的回调
*/
- (void)cancelInvitation:(NSString *)identifier callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(cancelInvitation(identifier:callback:));
当主播发现上麦的观众出现违背直播间规则时可调用以下方法将其下麦。
/**
* 踢人下麦(主播调用)
*
* 主播踢人下麦,房间内所有成员会收到`onSeatListChange`和`onAnchorLeaveSeat`的事件通知。
*
* - parameter seatIndex 需要踢下麦的麦位序号
* - parameter callback 操作回调
*/
- (void)kickSeat:(NSInteger)seatIndex callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(kickSeat(seatIndex:callback:));
主播发现座位上观众的麦声音有异常时可调用以下方法进行静音或解禁
/**
* 静音/解禁对应麦位的麦克风(主播调用)
*
* - parameter seatIndex 麦位序号
* - parameter isMute true : 静音,false : 解除静音
* - parameter callback 操作回调
*/
- (void)muteSeat:(NSInteger)seatIndex isMute:(BOOL)isMute callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(muteSeat(seatIndex:isMute:callback:));
主播需要需要禁止某个麦位的时候可以调用以下方法
/**
* 封禁/解禁某个麦位(主播调用)
*
* - parameter seatIndex 麦位序号
* - parameter isClose true : 封禁,false : 解除封禁
* - parameter callback 操作回调
*/
- (void)closeSeat:(NSInteger)seatIndex isClose:(BOOL)isClose callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(closeSeat(seatIndex:isClose:callback:));
/**
* 接受邀请
*
* - parameter identifier 邀请ID
* - parameter callback 接受操作的回调
*/
- (void)acceptInvitation:(NSString *)identifier callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(acceptInvitation(identifier:callback:));
/**
* 销毁房间(主播调用)
*
* 主播在创建房间后,可以调用这个函数来销毁房间。
*/
- (void)destroyRoom:(ActionCallback _Nullable)callback NS_SWIFT_NAME(destroyRoom(callback:));
pickSeat
传入对应的麦位和观众 userId, 可以抱人上麦,房间内所有成员会收到onSeatListChange
和onAnchorEnterSeat
的事件通知。kickSeat
传入对应麦位后,可以踢人下麦,房间内所有成员会收到onSeatListChange
和onAnchorLeaveSeat
的事件通知。muteSeat
传入对应麦位后,可以静音/解除静音,房间内所有成员会收到 onSeatListChange
和 onSeatMute
的事件通知。closeSeat
传入对应麦位后,可以封禁/解禁某个麦位,封禁后观众端将不能再上麦,房间内所有成员会收到onSeatListChange
和onSeatClose
的事件通知。观众在房间前的基本准备与主播端一致,主要区别在于进房时的角色是观众的角色进入房间。
setSelfProfile
设置自己的昵称和头像。getRoomInfoList
获取房间的详细信息,该信息是在主播端调用createRoom
创建语音聊天室时设置的简单描述信息。enterRoom
并传入房间号即可进入该房间。onRoomInfoChange
房间属性变化事件通知,此时可以记录房间属性并做相应改变,例如 UI 展示房间名、记录上麦是否需要请求主播同意等。onSeatListChange
麦位表变化事件通知,此时可以将麦位表变化刷新到 UI 界面上。onAnchorEnterSeat
的事件通知。/**
* 进入房间(观众调用)
*
* 观众观看直播的正常调用流程如下:
* 1.【观众】向您的服务端获取最新的语音聊天室列表,可能包含多个直播间的 roomId 和房间信息。
* 2. 观众选择一个语音聊天室,调用`enterRoom`并传入房间号即可进入该房间。
* 3. 进房后会收到组件的`onRoomInfoChange`房间属性变化事件通知,此时可以记录房间属性并做相应改变,例如 UI 展示房间名、记录上麦是否需要请求主播同意等。
* 4. 进房后会收到组件的`onSeatListChange`麦位表变化事件通知,此时可以将麦位表变化刷新到 UI 界面上。
* 5. 进房后还会收到麦位表有主播进入的`onAnchorEnterSeat`的事件通知。
*
* - parameter roomID 房间标识
* - parameter callback 进入房间是否成功的结果回调
*/
- (void)enterRoom:(NSInteger)roomID callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(enterRoom(roomID:callback:));
观众向主播发起上麦
/**
* 向用户发送邀请
*
* - parameter cmd 业务自定义指令
* - parameter userId 邀请的用户ID
* - parameter content 邀请的内容
* - parameter callback 发送结果回调
* - returns: inviteId 用于标识此次邀请ID
*/
- (NSString *)sendInvitation:(NSString *)cmd
userId:(NSString *)userId
content:(NSString *)content
callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(sendInvitation(cmd:userId:content:callback:));
当主播开启上麦验证后,主播端会回调以下方法,此时主播端可同意和拒绝该申请
/// 邀请信息接收回调
/// @param identifier 目标用户ID
/// @param inviter 邀请者ID
/// @param cmd 信令
/// @param content 内容
- (void)onReceiveNewInvitation:(NSString *)identifier
inviter:(NSString *)inviter
cmd:(NSString *)cmd
content:(NSString *)content
NS_SWIFT_NAME(onReceiveNewInvitation(identifier:inviter:cmd:content:));
可调用以下方法主动下麦
/**
* 主动下麦(观众端和主播均可调用)
*
* 下麦成功后,房间内所有成员会收到`onSeatListChange`和`onAnchorLeaveSeat`的事件通知。
*
* - parameter callback 操作回调
*/
- (void)leaveSeat:(ActionCallback _Nullable)callback NS_SWIFT_NAME(leaveSeat(callback:));
/**
* 退出房间
*
* - parameter callback 退出房间是否成功的结果回调
*/
- (void)exitRoom:(ActionCallback _Nullable)callback NS_SWIFT_NAME(exitRoom(callback:));
/**
* 开启麦克风采集
*/
- (void)startMicrophone;
/**
* 停止麦克风采集
*/
- (void)stopMicrophone;
/**
* 设置音质
*
* - parameter quality TRTC_AUDIO_QUALITY_MUSIC/TRTC_AUDIO_QUALITY_DEFAULT/TRTC_AUDIO_QUALITY_SPEECH
*/
- (void)setAuidoQuality:(NSInteger)quality NS_SWIFT_NAME(setAuidoQuality(quality:));
/**
* 开启本地静音
*
* - parameter mute 是否静音
*/
- (void)muteLocalAudio:(BOOL)mute NS_SWIFT_NAME(muteLocalAudio(mute:));
/**
* 设置开启扬声器
*
* - parameter useSpeaker true : 扬声器,false : 听筒
*/
- (void)setSpeaker:(BOOL)userSpeaker NS_SWIFT_NAME(setSpeaker(userSpeaker:));
可通过TRTCCloud来获取音效管理类,并设置音质效果。
/**
* 获取音效管理类 TXAudioEffectManager
*
* 该模块是整个 SDK 的音效管理模块,支持如下功能:
* - 耳机耳返:麦克风捕捉的声音实时通过耳机播放。
* - 混响效果:KTV、小房间、大会堂、低沉、洪亮...
* - 变声特效:萝莉、大叔、重金属、外国人...
* - 背景音乐:支持在线音乐和本地音乐,支持变速、变调等特效、支持原生和伴奏并播放和循环播放。
* - 短音效:鼓掌声、欢笑声等简短的音效文件,对于小于10秒的文件,请将 isShortFile 参数设置为 YES。
*/
- (TXAudioEffectManager *)getAudioEffectManager;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。