观看一场直播

最近更新时间:2025-10-16 17:05:02

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

前提条件

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

拉取直播列表

您可以调用 TUILiveListManager 插件的 fetchLiveList 接口获取当前直播间的列表,然后选择预览或加入观看。该接口采用分页拉取的方式返回数据,需要传递以下两个参数:
cursor:分页拉取游标,首次调用请传递空字符串,后续调用请使用前一次返回的 nextCursor 值。
count:建议将每次分页请求的条数设置为20。
Swift
Java
import RTCRoomEngine

guard let liveListManager = TUIRoomEngine.sharedInstance().getExtension(extensionType: .liveListManager) as? TUILiveListManager else {
return
}

let cursor = "" // 分页拉取游标,首次调用请传递空字符串,后续调用请使用前一次返回的 nextCursor
let count = 20 // 推荐每次分页拉取 20 条记录

liveListManager.fetchLiveList(cursor: cursor, count: count) { nextCursor, liveInfoList in
// 拉取直播间列表成功
// nextCursor:续拉游标
// liveInfoList:直播间列表
} onError: { code, message in
// 拉取直播间列表失败
}
String cursor = ""; // 分页拉取游标,首次调用请传递空字符串,后续调用请使用前一次返回的 nextCursor,即 result.cursor
int count = 20; // 推荐每次分页拉取 20 条记录

TUILiveListManager liveListManager = (TUILiveListManager)TUIRoomEngine.sharedInstance().getExtension(TUICommonDefine.ExtensionType.LIVE_LIST_MANAGER);
liveListManager.fetchLiveList(cursor, count, new TUILiveListManager.LiveInfoListCallback() {
@Override
public void onSuccess(TUILiveListManager.LiveInfoListResult result) {
// 拉取直播间列表成功
// result.cursor:续拉游标
// result.liveInfoList:直播间列表
}
@Override
public void onError(TUICommonDefine.Error error, String message) {
// 拉取直播间列表失败
}
});

预览直播间画面

在获取直播间列表后,您可以在加入前预览直播画面,选择感兴趣的直播间后再正式进入。

开始预览

要预览直播间画面,可以调用 TUILiveListManager 插件的 startPreloadVideoStream 接口,该接口需要传递以下 3 个参数:
roomId:您可以直接从获取的直播间列表中找到直播间 roomId。
isMuteAudio:是否静音,预览直播间画面时,通常关闭音频播放,建议您设置为 true。
videoView: 请提前创建视频预览控件,并将其添加到界面中,同时完成布局设置。
Swift
Java
import RTCRoomEngine

guard let liveListManager = TUIRoomEngine.sharedInstance().getExtension(extensionType: .liveListManager) as? TUILiveListManager else {
return
}

let roomId = "video_100001" // 请替换成您自己的房间 ID
let muteAudio = true // 预览直播间画面时,通常关闭音频播放,建议您设置为 true

let preloadVideoView = UIView()
// ...将 preloadVideoView 添加到您的视图上并对其进行布局

liveListManager.startPreloadVideoStream(roomId: roomId, isMuteAudio: muteAudio, view: preloadVideoView) { roomId in
// 开始预览播放
} onLoading: { roomId in
} onError: { roomId, code, message in
// 预览失败
}
String roomId = "video_100001"; // 请替换成您自己的房间 ID
boolean muteAudio = true; // 预览直播间画面时,通常关闭音频播放,建议您设置为 true

TUIVideoView preloadVideoView = new TUIVideoView(context);
// ...将 preloadVideoView 添加到您的视图上并对其进行布局

TUILiveListManager liveListManager = (TUILiveListManager)TUIRoomEngine.sharedInstance().getExtension(TUICommonDefine.ExtensionType.LIVE_LIST_MANAGER);
liveListManager.startPreloadVideoStream(roomId, muteAudio, preloadVideoView, new TUIRoomDefine.PlayCallback() {
@Override
public void onPlaying(String roomId) {
// 开始预览播放
}
@Override
public void onLoading(String roomId) {
}
@Override
public void onPlayError(String roomId, TUICommonDefine.Error error, String message) {
// 预览失败
}
});

关闭预览

您可以调用 TUILiveListManager 插件的 stopPreloadVideoStream 并传入直播间 ID 来结束直播间画面预览。
Swift
Java
import RTCRoomEngine

guard let liveListManager = TUIRoomEngine.sharedInstance().getExtension(extensionType: .liveListManager) as? TUILiveListManager else {
return
}

let roomId = "video_100001" // 请替换成您自己的房间 ID
liveListManager.stopPreloadVideoStream(roomId);
String roomId = "video_100001"; // 请替换成您自己的房间 ID

TUILiveListManager liveListManager = (TUILiveListManager)TUIRoomEngine.sharedInstance().getExtension(TUICommonDefine.ExtensionType.LIVE_LIST_MANAGER);
liveListManager.stopPreloadVideoStream(roomId);

进入直播间

请调用 TUILiveListManager插件的 joinLive接口并传入直播间 ID 加入直播间。加入成功后,请调用 TUIRoomEnginemuteRemoteAudioStream 接口开启主播音频播放。
Swift
Java
import RTCRoomEngine

let roomId = "video_100001"

guard let liveListManager = TUIRoomEngine.sharedInstance().getExtension(extensionType: .liveListManager) as? TUILiveListManager else {
return
}
liveListManager.joinLive(roomId: roomId, onSuccess: { liveInfo in
// 加入直播间成功
let sdkAppId = "xxxx" // 请替换成您自己 App 的 sdkAppID
let userId = "livekit_" + sdkAppId + "_feedback_" + roomId // 固定格式:"livekit_sdkAppId_feedback_roomId"
TUIRoomEngine.sharedInstance().muteRemoteAudioStream(userId, isMute: false)
}, onError: { code, message in
// 加入直播间失败
})
String roomId = "video_100001";

TUILiveListManager liveListManager = (TUILiveListManager)TUIRoomEngine.sharedInstance().getExtension(TUICommonDefine.ExtensionType.LIVE_LIST_MANAGER);
liveListManager.joinLive(roomId , new TUILiveListManager.LiveInfoCallback() {
@Override
public void onSuccess(TUILiveListManager.LiveInfo liveInfo) {
// 加入直播间成功,
String sdkAppId = "xxxx"; // 请替换成您自己 App 的 sdkAppID
String userId = "livekit_" + sdkAppId + "_feedback_" + roomId;// 固定格式:"livekit_sdkAppId_feedback_roomId"
TUIRoomEngine.sharedInstance().muteRemoteAudioStream(userId, false);
}

@Override
public void onError(TUICommonDefine.Error error, String message) {
// 加入直播间失败
}
});
注意:
如果您在预览直播间时已开启音频播放,加入直播间成功后无需再次调用 muteRemoteAudioStream
调用 muteRemoteAudioStream时,第一个参数 userId的格式为 livekit_sdkAppId_feedback_roomId,其中 sdkAppId 需替换为您当前应用的 SDK AppID,roomId为当前直播间的房间 ID。

离开直播间

您可以通过调用 TUILiveListManager 插件的 leaveLive 接口,传入直播间 ID 来离开直播间并结束观看。
Swift
Java
import RTCRoomEngine

guard let liveListManager = TUIRoomEngine.sharedInstance().getExtension(extensionType: .liveListManager) as? TUILiveListManager else {
return
}
liveListManager.leaveLive { TUILiveStatisticsData in
print("success")
} onError: { code, message in
print("failure, code:\\(code), message:\\(message)")
}
TUILiveListManager liveListManager = (TUILiveListManager)TUIRoomEngine.sharedInstance().getExtension(TUICommonDefine.ExtensionType.LIVE_LIST_MANAGER);
liveListManager.leaveLive(new TUILiveListManager.StopLiveCallback() {
@Override
public void onSuccess(TUILiveListManager.LiveStatisticsData statisticData) {
Log.i("sdk", "success");
}

@Override
public void onError(TUICommonDefine.Error error, String message) {
Log.i("sdk", "failure code:" + error + ",message:" + message);
}
});
注意:
离开直播间不会自动结束视频画面的预览。请您按照 关闭预览 里的步骤,调用 TUILiveListManager 插件的 stopPreloadVideoStream 接口,结束直播画面的预览。

如何实现滑动播放?

滑动播放是直播类 App 中备受欢迎的功能,能显著提升用户体验。滑动播放的前提条件有两个:
您已通过调用 TUILiveListManager 插件的 fetchLiveList 接口获取到当前活跃的直播间列表 liveInfoList
您已按照前述步骤成功加入一个直播间。
如下图所示,典型的滑动播放流程可分为三个阶段:开始滑动、滑动中、滑动完成。实现滑动播放,您需要在 App 的界面层监听用户的滑动事件。下面以从当前播放的直播间 A 滑动切换到直播间 B 为例,详细介绍滑动播放的接入流程。
直播间滑动播放流程图
直播间滑动播放流程图


开始滑动

开始滑动时,直播间 A 的界面向上滑动开始移出可视区域,直播间 B 的界面向上滑动开始移入可视区域。在此阶段,请完成下面两步操作,加载直播间 B 的视频画面,提前开始预览。
从直播间列表 liveInfoList 里获取到下一个直播间 B 的 TUILiveInfo房间信息;
按照前述 “预览直播间画面” 里的步骤,调用 TUILiveListManager 插件的 startPreloadVideoStream 接口,传入直播间 B 的 roomId,加载预览直播间 B 的视频画面。

滑动中

滑动过程中,直播间 B 的视频画面已开始播放预览。在此阶段,您需要在界面层继续完成滑动动画。

滑动完成

滑动完成时,直播间 A 的界面已经完全移出可视区域,请您执行以下两步操作,完全退出直播间 A;
按照 “结束预览直播间画面” 里的步骤, 调用 TUILiveListManager 插件的 stopPreloadVideoStream 接口,传入直播间 A 的 roomId,结束直播间 A 的预览;
按照 “离开直播间” 里的步骤,调用 TUILiveListManager 插件的 leaveLive 接口,传入直播间 A 的 roomId,退出直播间 A;
同时,直播间 B 的界面已经完全移入可视区域,请您按照 “加入直播间” 里的步骤,加入直播间 B ,并打开音频的播放。
调用 TUILiveListManager 插件的 joinLive 接口,传入直播间 B 的 roomId,加入直播间 B;
调用 TUIRoomEnginemuteRemoteAudioStream 接口,开启主播音频播放。