iOS音视频接入- TRTC语音聊天室

2020-10-19 10:00:06 浏览数 (1)

语音聊天室简介

我们在之前的文章中已经了解了TRTC的1v1和多人语音聊天,本篇文章来了解下TRTC的语音聊天室。

适用场景

  1. 纯语音社交
  2. 在线KTV
  3. 连麦开黑
  4. 多人相亲
  5. 陪伴房
  6. 狼人杀、剧本杀

可提供功能

  1. 麦位管理
  2. 语音互动
  3. 文字聊天
  4. 背景音乐播放
  5. 音效设置
  6. 开关麦克风与远端音频的开关

可复用的官方Demo

TRTC SDK为我们提供了官方的语音聊天室的Demo,为了方便开发者快速接如及实现功能,其Demo内的model与UI均可复用至自己的工程内部,可按照自己功能需求在此基础上进行修改。

官方Demo位置

语音聊天室的Demo位置语音聊天室的Demo位置

可复用模块

model:可完全复用及根据自己需求删减

UI:可完全复用及根据自己需求删减

表格列出了各个 swift 文件或文件夹及其所对应的 UI 界面,可根据自己的需求二次修改

文件或文件夹

功能描述

TRTCVoiceRoomEnteryController

该文件包含所有 ViewController 的初始化获取方法,您可以通过该实例,快速获取 ViewController 对象。

NetworkRoomManager

业务后台交互相关。

TRTCCreateVoiceRoomViewController

创建语音聊天室页面逻辑。

TRTCVoiceRoomListViewController

列表页面逻辑。

TRTCVoiceRoomViewController

主房间页面,包括主播和观众两种界面。

官方Demo运行后截图

Demo运行截图Demo运行截图

集成步骤

我们以复用Demo的model模块,自定义UI的集成步骤为例。

第一步:导入所需SDK

代码语言:ruby复制
pod 'TXIMSDK_iOS'
pod 'TXLiteAVSDK_TRTC'

第二步:配置隐私权限

向系统申请使用权限,在info.plist文件中添加一下两个key和对应的描述:

key

描述

Privacy - Camera Usage Description

App需要使用摄像头权限,开启后才会有视频画面

Privacy - Microphone Usage Description

App需要使用麦克风权限,开启后才会有语音信息

第三步:复用TRTCVoiceRoom组件

将官方Demo中的model文件夹拖入自己的工程内部即可。如有头文件导入报错,请在工程内部的PCH文件导入所需SDK的头文件即可。

第四步:创建并登录组件

  1. 调用 TRTCVoiceRoomImp 的sharedInstance类方法可以创建一个遵守 TRTCVoiceRoom 协议的实例对象。也可以使用调用shared类方法,获取 TRTCVoiceRoomImp实例对象直接使用,二者在 TRTCVoiceRoom 的接口使用上没有任何区别。
  2. 调用setDelegate函数注册组件的事件回调通知。
  3. 调用login函数完成组件的登录,请参考下表填写关键参数:参数名作用sdkAppId您可以在 实时音视频控制台 中查看 SDKAppID。userId当前用户的 ID,字符串类型,只允许包含英文字母(a-z、A-Z)、数字(0-9)、连词符(-)和下划线(_)。userSig腾讯云设计的一种安全保护签名,获取方式请参考 如何计算 UserSig。callback登录回调,成功时 code 为0。
代码语言:objective-c复制
//初始化TRTCVoiceRoom
voiceRoom = [TRTCVoiceRoom sharedInstance];
//设置代理,实现代理方法接收回调
voiceRoom.delegate = self;
//登录组件
[[TRTCVoiceRoom sharedInstance] login:SDKAPPID userId:userID userSig:userSig callback:^(int32_t code, NSString * _Nonnull message) {

}];

通过官方Demo查看流程及实现

一、登录组件

1. TRTCVoiceRoom组件的登录是在PortalViewController(为功能选择页)内实现,在跳转聊天室列表控制器前调用登录组件方法

代码语言:objective-c复制
- (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创建房间。

代码语言:swift复制
   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中也可看到此问题,在创建聊天室和主播销毁聊天室的时候各发送了一个网络请求给后端,有后端来记录目前存在的聊天室,生成列表。

代码语言:swift复制
    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创建房间方法

代码语言:objective-c复制
/**
* 创建房间(主播调用)
*
* 主播正常的调用流程是:
* 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:));

房间创建成功后需要房主进入占座

代码语言:swift复制
    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 事件通知,更新座位状态。

代码语言:javascript复制
/// 房间座位变更回调
/// @param seatInfolist 座位列表信息
- (void)onSeatInfoChange:(NSArray<VoiceRoomSeatInfo *> *)seatInfolist

三、主播端操作

主播端主要流程

创建房间创建房间

房间创建好、主播占座后即可等待观众加入房间。当观众进入房间后主播和观众都会回调

代码语言:objective-c复制
/// 观众进房回调
/// @param userInfo 观众信息
- (void)onAudienceEnter:(VoiceRoomUserInfo *)userInfo
NS_SWIFT_NAME(onAudienceEnter(userInfo:));

邀请观众上麦

现在有已经有观众在房间内部,主播想与观众进行互动,主播可以邀请观众上麦,可调用

代码语言:objective-c复制
/**
* 向用户发送邀请
*
* - 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:));

向观众发送邀请信令。

当观众接受邀请的时候调用以下方法上麦

代码语言:objective-c复制
/**
* 抱人上麦(主播调用)
*
* 主播抱人上麦,房间内所有成员会收到`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:));

当观众接受主播邀请后房间内所有人会收到

代码语言:objective-c复制
/// 房间作为变更回调
/// @param seatInfolist 座位列表信息
- (void)onSeatInfoChange:(NSArray<VoiceRoomSeatInfo *> *)seatInfolist
NS_SWIFT_NAME(onSeatListChange(seatInfoList:));

代码语言:javascript复制
/// 主播上麦回调
/// @param index 麦位号
/// @param user 用户信息
- (void)onAnchorEnterSeat:(NSInteger)index
                              user:(VoiceRoomUserInfo *)user
NS_SWIFT_NAME(onAnchorEnterSeat(index:user:));

两个回调。

取消邀请

在主播发送邀请后想取消邀请可调用

代码语言:objective-c复制
/**
* 取消邀请
* - parameter identifier   邀请ID
* - parameter callback     接受操作的回调
*/
- (void)cancelInvitation:(NSString *)identifier callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(cancelInvitation(identifier:callback:));

踢人下麦

当主播发现上麦的观众出现违背直播间规则时可调用以下方法将其下麦。

代码语言:objective-c复制
/**
 * 踢人下麦(主播调用)
 *
 * 主播踢人下麦,房间内所有成员会收到`onSeatListChange`和`onAnchorLeaveSeat`的事件通知。
 *
 * - parameter seatIndex    需要踢下麦的麦位序号
 * - parameter callback     操作回调
 */
- (void)kickSeat:(NSInteger)seatIndex callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(kickSeat(seatIndex:callback:));

静音/解禁对应麦位的麦克风

主播发现座位上观众的麦声音有异常时可调用以下方法进行静音或解禁

代码语言:objective-c复制
/**
* 静音/解禁对应麦位的麦克风(主播调用)
*
* - 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:));

封禁/解禁某个麦位

主播需要需要禁止某个麦位的时候可以调用以下方法

代码语言:objective-c复制
/**
* 封禁/解禁某个麦位(主播调用)
*
* - 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:));

主播同意观众上麦申请

代码语言:objective-c复制
/**
* 接受邀请
*
* - parameter identifier   邀请ID
* - parameter callback     接受操作的回调
*/
- (void)acceptInvitation:(NSString *)identifier callback:(ActionCallback _Nullable)callback NS_SWIFT_NAME(acceptInvitation(identifier:callback:));

解散房间

代码语言:javascript复制
/**
* 销毁房间(主播调用)
*
* 主播在创建房间后,可以调用这个函数来销毁房间。
*/
- (void)destroyRoom:(ActionCallback _Nullable)callback NS_SWIFT_NAME(destroyRoom(callback:));

主播端麦位管理流程

  1. pickSeat传入对应的麦位和观众 userId, 可以抱人上麦,房间内所有成员会收到onSeatListChangeonAnchorEnterSeat的事件通知。
  2. kickSeat传入对应麦位后,可以踢人下麦,房间内所有成员会收到onSeatListChangeonAnchorLeaveSeat的事件通知。
  3. muteSeat传入对应麦位后,可以静音/解除静音,房间内所有成员会收到 onSeatListChangeonSeatMute 的事件通知。
  4. closeSeat传入对应麦位后,可以封禁/解禁某个麦位,封禁后观众端将不能再上麦,房间内所有成员会收到onSeatListChangeonSeatClose的事件通知。
主播端麦位管理主播端麦位管理

四、观众端操作及回调

观众在房间前的基本准备与主播端一致,主要区别在于进房时的角色是观众的角色进入房间。

观众端流程

  1. 观众端登录米块后,可以调用setSelfProfile设置自己的昵称和头像。
  2. 观众端向业务后台获取最新的语音聊天室房间列表。说明: Demo 中的语音聊天室列表仅做演示使用,语音聊天室列表的业务逻辑千差万别,腾讯云暂不提供语音聊天室列表的管理服务,请自行管理您的语音聊天室列表。
  3. 观众端调用getRoomInfoList获取房间的详细信息,该信息是在主播端调用createRoom创建语音聊天室时设置的简单描述信息。
  4. 观众选择一个语音聊天室,调用enterRoom并传入房间号即可进入该房间。
  5. 进房后会收到组件的onRoomInfoChange房间属性变化事件通知,此时可以记录房间属性并做相应改变,例如 UI 展示房间名、记录上麦是否需要请求主播同意等。
  6. 进房后会收到组件的onSeatListChange麦位表变化事件通知,此时可以将麦位表变化刷新到 UI 界面上。
  7. 进房后还会收到麦位表有主播进入的onAnchorEnterSeat的事件通知。
观众端流程观众端流程

进入房间

代码语言:javascript复制
/**
* 进入房间(观众调用)
*
* 观众观看直播的正常调用流程如下:
* 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:));

观众上麦

观众向主播发起上麦

代码语言:javascript复制
/**
* 向用户发送邀请
*
* - 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:));

当主播开启上麦验证后,主播端会回调以下方法,此时主播端可同意和拒绝该申请

代码语言:objective-c复制
/// 邀请信息接收回调
/// @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:));

观众下麦

可调用以下方法主动下麦

代码语言:objective-c复制
/**
* 主动下麦(观众端和主播均可调用)
*
* 下麦成功后,房间内所有成员会收到`onSeatListChange`和`onAnchorLeaveSeat`的事件通知。
*
* - parameter callback 操作回调
*/
- (void)leaveSeat:(ActionCallback _Nullable)callback NS_SWIFT_NAME(leaveSeat(callback:));

退出房间

代码语言:javascript复制
/**
* 退出房间
*
* - parameter callback 退出房间是否成功的结果回调
*/
- (void)exitRoom:(ActionCallback _Nullable)callback NS_SWIFT_NAME(exitRoom(callback:));

本地音频操作接口

代码语言:javascript复制
/**
* 开启麦克风采集
*/
- (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来获取音效管理类,并设置音质效果。

代码语言:objective-c复制
/**
* 获取音效管理类 TXAudioEffectManager
*
* 该模块是整个 SDK 的音效管理模块,支持如下功能:
* - 耳机耳返:麦克风捕捉的声音实时通过耳机播放。
* - 混响效果:KTV、小房间、大会堂、低沉、洪亮...
* - 变声特效:萝莉、大叔、重金属、外国人...
* - 背景音乐:支持在线音乐和本地音乐,支持变速、变调等特效、支持原生和伴奏并播放和循环播放。
* - 短音效:鼓掌声、欢笑声等简短的音效文件,对于小于10秒的文件,请将 isShortFile 参数设置为 YES。
*/
- (TXAudioEffectManager *)getAudioEffectManager;

此处有更加详细的API介绍及联动回调方法!

0 人点赞