RTC Room Engine
SDK 实现 视频开播与观看功能。RTC Room Engine
实现语聊开播核心步骤需要4步:创建并加入直播间、上麦推流、开启媒体设备、设置本地预览画面,下面将对齐进行详细介绍。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
由很多的字段构成,但通常您只需要关心如下几个字段的填写:参数名称 | 字段含义 | 补充说明 | 数据类型 | 填写示例 |
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 |
TUIRoomInfo
后,就可以调用 createRoom
和 enterRoom
接口函数创建并加入直播间了。import RTCRoomEnginelet roomInfo = TUIRoomInfo()roomInfo.roomId = "video_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 = "video_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) {// 创建直播间失败}});
takeSeat
接口上麦并开始推流。import RTCRoomEnginelet index = -1 // 请将这里替换成您想要申请的麦位号,填写-1时表示无须关注麦位索引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 = -1; // 请将这里替换成您想要申请的麦位号,填写-1时表示无须关注麦位索引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) {// 上麦失败}});
openLocalMicrophone
和 openLocalCamera
接口开启麦克风和摄像头,确保观众可以看到您的画面和听到您的声音。openLocalMicrophone
接口需要传入音频质量参数 quality
。quality
是TUIAudioQuality
类型的枚举。枚举值类型 | 含义 |
speech | 人声模式。单声道;音频裸码率:18kbps;适合语音通话为主的场景。 |
default | 默认模式。单声道;音频裸码率:50kbps;SDK 默认的音频质量,如无特殊需求推荐选择之。 |
music | 音乐模式。双声道 + 全频带;音频裸码率:128kbps;适合需要高保真传输音乐的场景,比如在线K歌、音乐直播等。 |
openLocalCamera
接口需要传入 选择前后置摄像头 isFront
和 视频质量 quality
两个参数。isFront
是一个布尔值,true为打开前置摄像头,false为打开后置摄像头。quality
是 TUIVideoQuality
类型的枚举。枚举值类型 | 含义 |
quality360P | 低清360P |
quality540P | 标清540P |
quality720P | 高清720P |
quality1080P | 超清1080P |
default
,打开前置摄像头并且视频质量为 quality1080P
为例,打开本地麦克风和摄像头。openLocalMicrophone
和 openLocalCamera
接口开启麦克风和摄像头,确保观众可以看到您的画面和听到您的声音。openLocalMicrophone
接口需要传入音频质量参数 quality
。quality
是AudioQuality
类型的枚举。枚举值类型 | 含义 |
SPEECH | 人声模式。单声道;音频裸码率:18kbps;适合语音通话为主的场景。 |
DEFAULT | 默认模式。单声道;音频裸码率:50kbps;SDK 默认的音频质量,如无特殊需求推荐选择之。 |
MUSIC | 音乐模式。双声道 + 全频带;音频裸码率:128kbps;适合需要高保真传输音乐的场景,比如在线K歌、音乐直播等。 |
openLocalCamera
接口需要传入 选择前后置摄像头 isFront
和 视频质量 quality
两个参数。isFront
是一个布尔值,true 为打开前置摄像头,false 为打开后置摄像头。quality
是 VideoQuality
类型的枚举。枚举值类型 | 含义 |
Q_360P | 低清360P |
Q_540P | 标清540P |
Q_720P | 高清720P |
Q_1080P | 超清1080P |
DEFAULT
,打开前置摄像头并且视频质量为 Q_1080P
为例,打开本地麦克风和摄像头。import RTCRoomEngine// 打开本地麦克风let audioQuality: TUIAudioQuality = .defaultTUIRoomEngine.sharedInstance().openLocalMicrophone(audioQuality) {// 打开麦克风成功} onError: { code, message in// 打开麦克风失败}// 打开前置摄像头let isFrontCamera = truelet videoQuality: TUIVideoQuality = .quality1080PTUIRoomEngine.sharedInstance().openLocalCamera(isFront: isFrontCamera, quality: videoQuality) {// 打开前置摄像头成功} 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) {// 打开麦克风失败}});// 打开前置摄像头boolean isFrontCamera = true;TUIRoomDefine.VideoQuality videoQuality = TUIRoomDefine.VideoQuality.Q_1080P;TUIRoomEngine.sharedInstance().openLocalCamera(isFrontCamera, videoQuality, new TUIRoomDefine.ActionCallback() {@Overridepublic void onSuccess() {// 打开前置摄像头成功}@Overridepublic void onError(TUICommonDefine.Error error, String message) {// 打开前置摄像头失败}});
setLocalVideo
接口实现。import RTCRoomEnginelet videoView = UIView()// ...将 viewoView 添加到您的视图上并对其进行布局TUIRoomEngine.sharedInstance().setLocalVideoView(view: videoView)
TUIVideoView videoView = new TUIVideoView(context);// ...将 viewoView 添加到您的视图上并对其进行布局TUIRoomEngine.sharedInstance().setLocalVideoView(videoView);
enterRoom
接口成功进房即可收听到视频主播的声音,若您还想观看主播的视频画面,请确保进房成功后执行了步骤2。enterRoom
进房语聊房时,房间类型需要传入 live
。import RTCRoomEnginelet roomId = "video_100001"let roomType = .liveTUIRoomEngine.sharedInstance().enterRoom(roomId, roomType: roomType) { roomInfo in// 进房成功} onError: { code, message in// 进房失败}
String roomId = "video_100001";TUIRoomDefine.RoomType roomType = TUIRoomDefine.RoomType.LIVE;TUIRoomEngine.sharedInstance().enterRoom(roomId, roomType, new TUIRoomDefine.GetRoomInfoCallback() {@Overridepublic void onSuccess(TUIRoomDefine.RoomInfo roomInfo) {// 进房成功}@Overridepublic void onError(TUICommonDefine.Error error, String message) {// 进房失败}});
setRemoteVideoView
设置远端视频观看视图,传入三个参数: 观看的用户的用户Id、播放的视频流类型和用来播放视频的视图对象。TUIVideoStreamType
类型的枚举值。枚举值类型 | 含义 |
cameraStream | 高清摄像头视频流 |
screenStream | 屏幕分享视频流 |
cameraStreamLow | 低清摄像头视频流 |
setRemoteVideoView
设置远端视频观看视图,传入三个参数: 观看的用户的用户Id、播放的视频流类型和用来播放视频的视图对象。VideoStreamType
类型的枚举值。枚举值类型 | 含义 |
CAMERA_STREAM | 高清摄像头视频流 |
SCREEN_STREAM | 屏幕分享视频流 |
CAMERA_STREAM_LOW | 低清摄像头视频流 |
import RTCRoomEnginelet videoView = UIView()// ...将 viewoView 添加到您的视图上并对其进行布局let ownerId = "" // 请将其替换成您加入的直播间的房主用户Idlet streamType = TUIVideoStreamType.cameraStreamTUIRoomEngine.sharedInstance().setRemoteVideoView(userId: ownerId,streamType: streamType,view: videoView)
TUIVideoView videoView = new TUIVideoView(context);// ...将 viewoView 添加到您的视图上并对其进行布局String ownerId = ""; // 请将其替换成您加入的直播间的房主用户IdTUIRoomDefine.VideoStreamType streamType = TUIRoomDefine.VideoStreamType.CAMERA_STREAM;TUIRoomEngine.sharedInstance().setRemoteVideoView(ownerId, streamType, videoView);
startPlayRemoteVideo
需要传入两个视频参数: 观看的用户的用户Id和播放的视频流类型。import RTCRoomEnginelet ownerId = "" // 请将其替换成您加入的直播间的房主用户Idlet streamType = TUIVideoStreamType.cameraStreamTUIRoomEngine.sharedInstance().startPlayRemoteVideo(userId: ownerId,streamType: streamType) { userId in// 播放视频画面中} onLoading: { userId in// 视频画面加载中} onError: { userId, code, message in// 视频画面播放失败}
String ownerId = ""; // 请将其替换成您加入的直播间的房主用户IdTUIRoomDefine.VideoStreamType streamType = TUIRoomDefine.VideoStreamType.CAMERA_STREAM;TUIRoomEngine.sharedInstance().startPlayRemoteVideo(ownerId, streamType, new TUIRoomDefine.PlayCallback() {@Overridepublic void onPlaying(String userId) {// 播放视频画面中}@Overridepublic void onLoading(String userId) {// 视频画面加载中}@Overridepublic void onPlayError(String userId, TUICommonDefine.Error error, String message) {// 视频画面播放失败}});
本页内容是否解决了您的问题?