Audio Broadcasting and Listening
本文档主要介绍如何使用
RTC Room Engine
SDK 实现语聊开播与收听功能。前提条件
音频开播
使用
RTC Room Engine
实现语聊开播核心步骤需要3步:创建并加入直播间、上麦推流、开启媒体设备,下面将对齐进行详细介绍。步骤1: 创建并加入直播间
在开播前您需要填写关键参数
TUIRoomInfo
,接下来进行详细介绍:参数:TUIRoomInfo
TUIRoomInfo
由很多的字段构成,但通常您只需要关心如下几个字段的填写:参数名称 | 字段含义 | 补充说明 | 数据类型 | 填写示例 |
roomId | 房间ID | 只允许包含大小写英文字母(a-z、A-Z)、数字(0-9)及下划线和连词符。 该字段为创建房间时必填参数,最大支持48个字节。 | 字符串 | "live_100001" |
name | 房间名称 | 字符串类型的房间名称。(未填写时和roomId一致) | 字符串 | "denny`s room" |
seatMode | 上麦模式 | 该字段只有开启麦位控制后生效。 分为“自由上麦模式(freeToTake)”和“申请上麦模式(applyToTake)”。自由上麦模式下台下观众可以自由上麦,无需申请。上麦模式下台下观众上麦需要房主或同意后才能上麦。 | 枚举值 | TUISeatMode.applyToTake |
maxSeatCount | 最大麦位数 | 数字类型的最大麦位数,这里指最多maxSeatCount个人同时在麦上。 | 数字 | 10 |
isSeatEnabled | 是否开启麦位控制 | 布尔类型的麦位控制使能标志符。 | 布尔值 | true |
roomType | 房间类型 | 分为“会议(conference)”和“直播(live)”两种房间类型,语聊属于直播,因此这里使用live。 | 枚举值 | TUIRoomType.live |
在准备好参数
TUIRoomInfo
后,就可以调用 createRoom
和 enterRoom
接口函数创建并加入直播间了。在开播前您需要填写关键参数
RoomInfo
,接下来进行详细介绍:参数:RoomInfo
RoomInfo
由很多的字段构成,但通常您只需要关心如下几个字段的填写:参数名称 | 字段含义 | 补充说明 | 数据类型 | 填写示例 |
roomId | 房间ID | 只允许包含大小写英文字母(a-z、A-Z)、数字(0-9)及下划线和连词符。 该字段为创建房间时必填参数,最大支持48个字节。 | 字符串 | "live_100001" |
name | 房间名称 | 字符串类型的房间名称。(未填写时和roomId一致) | 字符串 | "denny`s room" |
seatMode | 上麦模式 | 该字段只有开启麦位控制后生效。 分为“自由上麦模式(FREE_TO_TAKE)”和“申请上麦模式(APPLY_TO_TAKE)”。自由上麦模式下台下观众可以自由上麦,无需申请。上麦模式下台下观众上麦需要房主或同意后才能上麦。 | 枚举值 | SeatMode.APPLY_TO_TAKE |
maxSeatCount | 最大麦位数 | 数字类型的最大麦位数,这里指最多maxSeatCount个人同时在麦上。 | 数字 | 10 |
isSeatEnabled | 是否开启麦位控制 | 布尔类型的麦位控制使能标志符。 | 布尔值 | true |
roomType | 房间类型 | 分为“会议(CONFERENCE)”和“直播(LIVE)”两种房间类型,语聊属于直播,因此这里使用live。 | 枚举值 | RoomType.Live |
在准备好参数
RoomInfo
后,就可以调用 createRoom
和 enterRoom
接口函数创建并加入直播间了。import RTCRoomEnginelet roomInfo = TUIRoomInfo()roomInfo.roomId = "voice_100001" // 请替换成您自己的房间IDroomInfo.name = "denny`s room" // 请替换成您自己的房间名称roomInfo.seatMode = .applyToTake // 也可根据您的需求替换为.freeToTakeroomInfo.maxSeatCount = 10 // 请替换成您购买的Live套餐包的最大麦位数roomInfo.isSeatEnabled = true // 如果您不需要麦位控制,可以将isSeatEnabled置为falseroomInfo.roomType = .live // 房间类型请确保是直播(live)类型TUIRoomEngine.sharedInstance().createRoom(roomInfo) { [weak self] inguard let self = self else { return }TUIRoomEngine.sharedInstance.enterRoom(self.roomId, roomType: .live) { [weak self] roomInfo inguard let self = self else { return }// 加入直播间成功} onError: { code, message in// 加入直播间失败}} onError: { code, message in// 创建直播间失败}
TUIRoomDefine.RoomInfo roomInfo = new TUIRoomDefine.RoomInfo();roomInfo.roomId = "voice_100001"; // 请替换成您自己的房间IDroomInfo.name = "denny`s room"; // 请替换成您自己的房间名称roomInfo.seatMode = TUIRoomDefine.SeatMode.APPLY_TO_TAKE; // 也可根据您的需求替换为.freeToTakeroomInfo.maxSeatCount = 10; // 请替换成您购买的Live套餐包的最大麦位数roomInfo.isSeatEnabled = true; // 如果您不需要麦位控制,可以将isSeatEnabled置为falseroomInfo.roomType = TUIRoomDefine.RoomType.LIVE; // 房间类型请确保是直播(live)类型TUIRoomEngine.sharedInstance().createRoom(roomInfo, new TUIRoomDefine.ActionCallback() {@Overridepublic void onSuccess() {TUIRoomEngine.sharedInstance().enterRoom(roomInfo.roomId, TUIRoomDefine.RoomType.LIVE, new TUIRoomDefine.GetRoomInfoCallback() {@Overridepublic void onSuccess(TUIRoomDefine.RoomInfo roomInfo) {// 加入直播间成功}@Overridepublic void onError(TUICommonDefine.Error error, String message) {// 加入直播间失败}});}@Overridepublic void onError(TUICommonDefine.Error error, String message) {// 创建直播间失败}});
步骤2:上麦推流
只有上麦后才能推流,因此在您成功创建房间后,您需要调用
takeSeat
接口上麦并开始推流。import RTCRoomEnginelet index = 0 // 请将这里替换成您想要申请的麦位号let timeout = 30 // 请将这里替换成您申请上麦的超时时间,单位秒,如果设置为 0,SDK 不会做超时检测,也不会触发超时回调TUIRoomEngine.sharedInstance().takeSeat(index, timeout: TimeInterval(timeout)) { requestId, userId in// 上麦成功} onRejected: { requestId, userId, messagae in// 上麦请求被拒绝} onCancelled: { requestId, userId in// 上麦请求被取消} onTimeout: { requestId, userId in// 上麦请求已超时} onError: { requestId, userId, code, message in// 上麦失败}
int index = 0; // 请将这里替换成您想要申请的麦位号int timeout = 30; // 请将这里替换成您申请上麦的超时时间,单位秒,如果设置为 0,SDK 不会做超时检测,也不会触发超时回调TUIRoomEngine.sharedInstance().takeSeat(index, timeout, new TUIRoomDefine.RequestCallback() {@Overridepublic void onAccepted(String requestId, String userId) {// 上麦成功}@Overridepublic void onRejected(String requestId, String userId, String message) {// 上麦请求被拒绝}@Overridepublic void onCancelled(String requestId, String userId) {// 上麦请求被取消}@Overridepublic void onTimeout(String requestId, String userId) {// 上麦请求已超时}@Overridepublic void onError(String requestId, String userId, TUICommonDefine.Error error, String message) {// 上麦失败}});
步骤3:开启媒体设备
在开播后,您还需要调用
openLocalMicrophone
连个接口开启麦克风,传入一个 TUIAudioQuality
类型的参数 quality
,确保观众可以听到您的声音。TUIAudioQuality
是一个枚举。参数名称 | 字段含义 |
speech | 人声模式。单声道;音频裸码率:18kbps;适合语音通话为主的场景。 |
default | 默认模式。单声道;音频裸码率:50kbps;SDK 默认的音频质量,如无特殊需求推荐选择之。 |
music | 音乐模式。双声道 + 全频带;音频裸码率:128kbps;适合需要高保真传输音乐的场景,比如在线K歌、音乐直播等。 |
在开播后,您还需要调用
openLocalMicrophone
连个接口开启麦克风,传入一个 AudioQuality
类型的参数 quality
,确保观众可以听到您的声音。AudioQuality
是一个枚举。参数名称 | 字段含义 |
SPEECH | 人声模式。单声道;音频裸码率:18kbps;适合语音通话为主的场景。 |
DEFAULT | 默认模式。单声道;音频裸码率:50kbps;SDK 默认的音频质量,如无特殊需求推荐选择之。 |
MUSIC | 音乐模式。双声道 + 全频带;音频裸码率:128kbps;适合需要高保真传输音乐的场景,比如在线K歌、音乐直播等。 |
下面以音乐模式为例,打开本地麦克风。
import RTCRoomEnginelet audioQuality: TUIAudioQuality = .music // 请根据您对音质的场景需求选择对应的模式TUIRoomEngine.sharedInstance().openLocalMicrophone(audioQuality) {// 打开麦克风成功} onError: { code, message in// 打开麦克风失败}
TUIRoomDefine.AudioQuality audioQuality = TUIRoomDefine.AudioQuality.MUSIC; // 请根据您对音质的场景需求选择对应的模式TUIRoomEngine.sharedInstance().openLocalMicrophone(audioQuality, new TUIRoomDefine.ActionCallback() {@Overridepublic void onSuccess() {// 打开麦克风成功}@Overridepublic void onError(TUICommonDefine.Error error, String message) {// 打开麦克风失败}});
音频收听
您仅需要调用
enterRoom
接口成功进房即可收听到语聊房主播的声音。enterRoom 您需要传入两个参数:想要收听的主播所在房间的房间 Id 和房间类型。
说明:
房间类型有两种:会议(conference)和直播(live),语聊房属于直播房间,因此您在调用
enterRoom
进房语聊房时,房间类型需要传入 live
。import RTCRoomEnginelet roomId = "voice_100001" // 收听的房间Idlet roomType = .live // 此处需设置为.liveTUIRoomEngine.sharedInstance().enterRoom(roomId, roomType: roomType) { roomInfo in// 进房成功} onError: { code, message in// 进房失败}
String roomId = "voice_100001"; // 收听的房间IdTUIRoomDefine.RoomType roomType = TUIRoomDefine.RoomType.LIVE; // 此处需设置为.liveTUIRoomEngine.sharedInstance().enterRoom(roomId, roomType, new TUIRoomDefine.GetRoomInfoCallback() {@Overridepublic void onSuccess(TUIRoomDefine.RoomInfo roomInfo) {// 进房成功}@Overridepublic void onError(TUICommonDefine.Error error, String message) {// 进房失败}});