Audio Broadcasting and Listening

本文档主要介绍如何使用 RTC Room Engine SDK 实现语聊开播与收听功能。

前提条件

在使用 RTC Room Engine SDK 前,您需要先调用 登录 SDK,以便后续功能正常使用。

音频开播

使用 RTC Room Engine 实现语聊开播核心步骤需要3步:创建并加入直播间、上麦推流、开启媒体设备,下面将对齐进行详细介绍。

步骤1: 创建并加入直播间

iOS
Android
在开播前您需要填写关键参数 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 后,就可以调用 createRoomenterRoom 接口函数创建并加入直播间了。
在开播前您需要填写关键参数 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 后,就可以调用 createRoomenterRoom 接口函数创建并加入直播间了。
iOS
Android
import RTCRoomEngine

let roomInfo = TUIRoomInfo()
roomInfo.roomId = "voice_100001" // 请替换成您自己的房间ID
roomInfo.name = "denny`s room" // 请替换成您自己的房间名称
roomInfo.seatMode = .applyToTake // 也可根据您的需求替换为.freeToTake
roomInfo.maxSeatCount = 10 // 请替换成您购买的Live套餐包的最大麦位数
roomInfo.isSeatEnabled = true // 如果您不需要麦位控制,可以将isSeatEnabled置为false
roomInfo.roomType = .live // 房间类型请确保是直播(live)类型

TUIRoomEngine.sharedInstance().createRoom(roomInfo) { [weak self] in
guard let self = self else { return }
TUIRoomEngine.sharedInstance.enterRoom(self.roomId, roomType: .live) { [weak self] roomInfo in
guard let self = self else { return }
// 加入直播间成功
} onError: { code, message in
// 加入直播间失败
}
} onError: { code, message in
// 创建直播间失败
}
TUIRoomDefine.RoomInfo roomInfo = new TUIRoomDefine.RoomInfo();
roomInfo.roomId = "voice_100001"; // 请替换成您自己的房间ID
roomInfo.name = "denny`s room"; // 请替换成您自己的房间名称
roomInfo.seatMode = TUIRoomDefine.SeatMode.APPLY_TO_TAKE; // 也可根据您的需求替换为.freeToTake
roomInfo.maxSeatCount = 10; // 请替换成您购买的Live套餐包的最大麦位数
roomInfo.isSeatEnabled = true; // 如果您不需要麦位控制,可以将isSeatEnabled置为false
roomInfo.roomType = TUIRoomDefine.RoomType.LIVE; // 房间类型请确保是直播(live)类型

TUIRoomEngine.sharedInstance().createRoom(roomInfo, new TUIRoomDefine.ActionCallback() {
@Override
public void onSuccess() {
TUIRoomEngine.sharedInstance().enterRoom(roomInfo.roomId, TUIRoomDefine.RoomType.LIVE, new TUIRoomDefine.GetRoomInfoCallback() {
@Override
public void onSuccess(TUIRoomDefine.RoomInfo roomInfo) {
// 加入直播间成功
}
@Override
public void onError(TUICommonDefine.Error error, String message) {
// 加入直播间失败
}
});
}
@Override
public void onError(TUICommonDefine.Error error, String message) {
// 创建直播间失败
}
});

步骤2:上麦推流

只有上麦后才能推流,因此在您成功创建房间后,您需要调用 takeSeat 接口上麦并开始推流。
iOS
Android
import RTCRoomEngine

let 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() {
@Override
public void onAccepted(String requestId, String userId) {
// 上麦成功
}
@Override
public void onRejected(String requestId, String userId, String message) {
// 上麦请求被拒绝
}

@Override
public void onCancelled(String requestId, String userId) {
// 上麦请求被取消
}
@Override
public void onTimeout(String requestId, String userId) {
// 上麦请求已超时
}
@Override
public void onError(String requestId, String userId, TUICommonDefine.Error error, String message) {
// 上麦失败
}
});

步骤3:开启媒体设备

iOS
Android
在开播后,您还需要调用 openLocalMicrophone 连个接口开启麦克风,传入一个 TUIAudioQuality 类型的参数 quality ,确保观众可以听到您的声音。
TUIAudioQuality 是一个枚举。
参数名称
字段含义
speech
人声模式。单声道;音频裸码率:18kbps;适合语音通话为主的场景。
default
默认模式。单声道;音频裸码率:50kbps;SDK 默认的音频质量,如无特殊需求推荐选择之。
music
音乐模式。双声道 + 全频带;音频裸码率:128kbps;适合需要高保真传输音乐的场景,比如在线K歌、音乐直播等。
在开播后,您还需要调用 openLocalMicrophone 连个接口开启麦克风,传入一个 AudioQuality 类型的参数 quality ,确保观众可以听到您的声音。
AudioQuality 是一个枚举。
参数名称
字段含义
SPEECH
人声模式。单声道;音频裸码率:18kbps;适合语音通话为主的场景。
DEFAULT
默认模式。单声道;音频裸码率:50kbps;SDK 默认的音频质量,如无特殊需求推荐选择之。
MUSIC
音乐模式。双声道 + 全频带;音频裸码率:128kbps;适合需要高保真传输音乐的场景,比如在线K歌、音乐直播等。
下面以音乐模式为例,打开本地麦克风。
iOS
Android
import RTCRoomEngine

let audioQuality: TUIAudioQuality = .music // 请根据您对音质的场景需求选择对应的模式
TUIRoomEngine.sharedInstance().openLocalMicrophone(audioQuality) {
// 打开麦克风成功
} onError: { code, message in
// 打开麦克风失败
}
TUIRoomDefine.AudioQuality audioQuality = TUIRoomDefine.AudioQuality.MUSIC; // 请根据您对音质的场景需求选择对应的模式
TUIRoomEngine.sharedInstance().openLocalMicrophone(audioQuality, new TUIRoomDefine.ActionCallback() {
@Override
public void onSuccess() {
// 打开麦克风成功
}
@Override
public void onError(TUICommonDefine.Error error, String message) {
// 打开麦克风失败
}
});

音频收听

您仅需要调用 enterRoom 接口成功进房即可收听到语聊房主播的声音。
enterRoom 您需要传入两个参数:想要收听的主播所在房间的房间 Id 和房间类型。
说明:
房间类型有两种:会议(conference)和直播(live),语聊房属于直播房间,因此您在调用 enterRoom 进房语聊房时,房间类型需要传入 live
iOS
Android
import RTCRoomEngine

let roomId = "voice_100001" // 收听的房间Id
let roomType = .live // 此处需设置为.live

TUIRoomEngine.sharedInstance().enterRoom(roomId, roomType: roomType) { roomInfo in
// 进房成功
} onError: { code, message in
// 进房失败
}
String roomId = "voice_100001"; // 收听的房间Id
TUIRoomDefine.RoomType roomType = TUIRoomDefine.RoomType.LIVE; // 此处需设置为.live

TUIRoomEngine.sharedInstance().enterRoom(roomId, roomType, new TUIRoomDefine.GetRoomInfoCallback() {
@Override
public void onSuccess(TUIRoomDefine.RoomInfo roomInfo) {
// 进房成功
}
@Override
public void onError(TUICommonDefine.Error error, String message) {
// 进房失败
}
});