开启一场直播

最近更新时间:2025-09-29 21:31:02

我的收藏
本文档主要介绍如何使用 RoomEngine SDK 开启一场直播。

前提条件

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

开播准备

为确保直播效果达到预期,建议您在正式开播前完成以下准备工作:首先打开本地摄像头预览,检查画面构图是否合理,确保镜头角度适宜;接着打开麦克风采集,调整合适的拾音距离。全部做好准备之后,正式开始直播。

打开摄像头预览

1. 首先,请您创建本地摄像头视频预览控件,将其添加到界面中,并完成布局设置,然后调用 setLocalVideoView 设置好本地视频预览控件。
2. 然后,请您调用 openLocalCamera 接口开启摄像头预览,该接口需要传入 isFrontquality 两个参数。
isFront 选择前后摄像头,是一个布尔值,true 为打开前置摄像头,false 为打开后置摄像头。
quality 视频质量。该参数是 TUIVideoQuality 类型的枚举,建议您选择 quality720P 或者 quality1080P
下面以打开前置摄像头、视频质量为 1080P为例,打开本地摄像头预览。
Swift
Java
import RTCRoomEngine

// 第一步:设置本地视频预览控件
let videoView = UIView()
// ...将 videoView 添加到您的视图上并对其进行布局
TUIRoomEngine.sharedInstance().setLocalVideoView(view: videoView)

// 第二步:打开前置摄像头预览
let isFrontCamera = true
let videoQuality: TUIVideoQuality = .quality1080P
TUIRoomEngine.sharedInstance().openLocalCamera(isFront: isFrontCamera, quality: videoQuality) {
// 打开前置摄像头成功
} onError: { code, message in
// 打开前置摄像头失败
}
// 第一步:设置本地视频预览控件
TUIVideoView videoView = new TUIVideoView(context);
// ...将 videoView 添加到您的视图上并对其进行布局
TUIRoomEngine.sharedInstance().setLocalVideoView(videoView);

// 第二步:打开前置摄像头预览
boolean isFrontCamera = true;
TUIRoomDefine.VideoQuality videoQuality = TUIRoomDefine.VideoQuality.Q_1080P;
TUIRoomEngine.sharedInstance().openLocalCamera(isFrontCamera, videoQuality, new TUIRoomDefine.ActionCallback() {
@Override
public void onSuccess() {
// 打开前置摄像头成功
}
@Override
public void onError(TUICommonDefine.Error error, String message) {
// 打开前置摄像头失败
}
});
说明:
开启摄像头预览后,您还可以进一步调整美颜参数,具体操作请参阅美颜相关

打开麦克风采集

请您调用 openLocalMicrophone 接口打开麦克风采集,该接口需要传入音频质量参数 quality 。该参数是TUIAudioQuality 类型的枚举值,建议您选择 default 模式。下面以音频质量为 default为例,打开本地麦克风采集。
Swift
Java
import RTCRoomEngine

// 打开本地麦克风
let audioQuality: TUIAudioQuality = .default
TUIRoomEngine.sharedInstance().openLocalMicrophone(audioQuality) {
// 打开麦克风成功
} onError: { code, message in
// 打开麦克风失败
}
// 打开本地麦克风
TUIRoomDefine.AudioQuality audioQuality = TUIRoomDefine.AudioQuality.DEFAULT;
TUIRoomEngine.sharedInstance().openLocalMicrophone(audioQuality, new TUIRoomDefine.ActionCallback() {
@Override
public void onSuccess() {
// 打开麦克风成功
}
@Override
public void onError(TUICommonDefine.Error error, String message) {
// 打开麦克风失败
}
});
说明:
打开麦克风采集之后,您还可以进一步设置音效参数,具体操作请参阅 音效设置

开启 unlimitedRoom 参数

视频直播场景中,我们强烈建议您开启 unlimitedRoom参数,视频预览、秒开、混流多模板等直播高级功能,均需在开启该参数后才能使用。
Swift
Java
var jsonObject = [String: Any]()
jsonObject["api"] = "enableUnlimitedRoom"
var params = [String: Any]()
params["enable"] = true
jsonObject["params"] = params
if let jsonData = try? JSONSerialization.data(withJSONObject: jsonObject, options: []),
let jsonString = String(data: jsonData, encoding: .utf8) {
TUIRoomEngine.callExperimentalAPI(jsonStr: jsonString)
}
JSONObject jsonObject = new JSONObject();
JSONObject params = new JSONObject();
try {
jsonObject.put("api", "enableUnlimitedRoom");
params.put("enable", true);
jsonObject.put("params", params);
TUIRoomEngine.sharedInstance().callExperimentalAPI(jsonObject.toString());
} catch (JSONException e) {
}
注意:
通过上述示例代码开启 unlimitedRoom 参数后,您还需开通 TUILiveKit 服务才能生效。请参考 开通指引 完成 TUILiveKit 服务开通。

创建直播间

在开播前,您需要填写房间信息参数 TUILiveInfo,该结构体包含多个字段,但通常只需关注以下几个关键字段的填写。
参数名称
字段含义
补充说明
数据类型
填写示例
roomId
房间 ID
只允许包含大小写英文字母(a-z、A-Z)、数字(0-9)及下划线和连词符。
该字段为创建房间时必填参数,最大支持48个字节。
字符串
"live_100001"
name
房间名称
字符串类型的房间名称。(未填写时和 roomId 一致)
字符串
"denny's room"
isSeatEnabled
是否开启麦位控制
布尔类型的麦位控制使能标志符。
布尔值
true
seatMode
上麦模式
该字段只有开启麦位控制后生效。
分为“自由上麦模式(freeToTake)”和“申请上麦模式(applyToTake)”。自由上麦模式下台下观众可以自由上麦,无需申请。申请上麦模式下台下观众上麦需要房主的同意后才能上麦。
枚举值
.applyToTake
maxSeatCount
最大麦位数
数字类型的最大麦位数,这里指最多 maxSeatCount 个人同时在麦上。
最大麦位数和购买的套餐包连麦人数上限一致。
数字
10
isPublicVisible
直播间是否公开
设置为 true 后可以在房间列表中显示
布尔值
true
keepOwnerOnSeat
房主开播后是否自动上麦
如果您是视频直播场景, 强烈建议您将 keepOwnerOnSeat 设置为 true,否则您还需要先 takeSeat 才能正常开播。
布尔值
true
准备好房间信息参数后,就可以调用 TUILiveListManager 插件的 startLive 接口开始直播了。
Swift
Java
import RTCRoomEngine

let liveInfo = TUILiveInfo()
liveInfo.roomId = "video_100001" // 请替换成您自己的房间ID
liveInfo.name = "denny`s room" // 请替换成您自己的房间名称
liveInfo.seatMode = .applyToTake // 通常视频直播场景下连麦都采用申请上麦模式,若您的业务中观众无需申请才能上麦时,此处可改写为freeToTake
liveInfo.maxSeatCount = 10 // 请替换成您购买的 Live 套餐包的最大麦位数
liveInfo.isSeatEnabled = true // 如果您不需要麦位控制,可以将 isSeatEnabled 置为false
liveInfo.isPublicVisible = true // 控制直播间是否公开,建议您设置为 true
liveInfo.keepOwnerOnSeat = true // 如果您是视频直播场景,强烈建议您设置为 true,否则您还需要先 takeSeat 才能正常开播

guard let liveListManager = TUIRoomEngine.sharedInstance().getExtension(extensionType: .liveListManager) as? TUILiveListManager else {
return
}
liveListManager.startLive(liveInfo: liveInfo, onSuccess: { liveInfo in
// 开播成功
}, onError: { code, message in
// 开播失败
})
TUILiveListManager.LiveInfo liveInfo = new TUILiveListManager.LiveInfo();
liveInfo.roomId = "video_100001"; // 请替换成您自己的房间ID
liveInfo.name = "denny`s room"; // 请替换成您自己的房间名称
liveInfo.seatMode = TUIRoomDefine.SeatMode.APPLY_TO_TAKE; // 通常视频直播场景下连麦都采用申请上麦模式,若您的业务中观众无需申请才能上麦时,此处可改写为freeToTake
liveInfo.maxSeatCount = 10; // 请替换成您购买的 Live 套餐包的最大麦位数
liveInfo.isSeatEnabled = true; // 如果您不需要麦位控制,可以将 isSeatEnabled 置为false
liveInfo.isPublicVisible = true; // 控制直播间是否公开,建议您设置为 true
liveInfo.keepOwnerOnSeat = true; // 如果您是视频直播场景,强烈建议您设置为 true,否则您还需要先 takeSeat 才能正常开播

TUILiveListManager liveListManager = (TUILiveListManager)TUIRoomEngine.sharedInstance().getExtension(TUICommonDefine.ExtensionType.LIVE_LIST_MANAGER);
liveListManager.startLive(liveInfo, new TUILiveListManager.LiveInfoCallback() {
@Override
public void onSuccess(TUILiveListManager.LiveInfo liveInfo) {
// 开播成功
}

@Override
public void onError(TUICommonDefine.Error error, String message) {
// 开播失败
}
});

结束直播

若您想要结束直播,请您调用 TUILiveListManager 插件的 stopLive 接口来结束直播。
Swift
Java
import RTCRoomEngine

guard let liveListManager = TUIRoomEngine.sharedInstance().getExtension(extensionType: .liveListManager) as? TUILiveListManager else {
return
}
liveListManager.stopLive { TUILiveStatisticsData in
// 关播成功
} onError: { code, message in
// 关播失败
}
TUILiveListManager liveListManager = (TUILiveListManager)TUIRoomEngine.sharedInstance().getExtension(TUICommonDefine.ExtensionType.LIVE_LIST_MANAGER);
liveListManager.stopLive(new TUILiveListManager.StopLiveCallback() {
@Override
public void onSuccess(TUILiveListManager.LiveStatisticsData statisticData) {
// 关播成功
}

@Override
public void onError(TUICommonDefine.Error error, String message) {
// 关播失败
}
});