tencent cloud

文档反馈

视频开播与观看

最后更新时间:2025-01-08 17:55:50
    本文档主要介绍如何使用 RTC Room Engine SDK 实现 视频开播与观看功能。

    前提条件

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

    视频开播

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

    步骤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
    在准备好参数 TUIRoomInfo 后,就可以调用 createRoomenterRoom 接口函数创建并加入直播间了。
    iOS
    Android
    import RTCRoomEngine
    
    let roomInfo = TUIRoomInfo()
    roomInfo.roomId = "video_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 = "video_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 = -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() {
    @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
    在开播后,您还需要调用 openLocalMicrophoneopenLocalCamera 接口开启麦克风和摄像头,确保观众可以看到您的画面和听到您的声音。
    openLocalMicrophone 接口需要传入音频质量参数 quality
    qualityTUIAudioQuality 类型的枚举。
    枚举值类型
    含义
    speech
    人声模式。单声道;音频裸码率:18kbps;适合语音通话为主的场景。
    default
    默认模式。单声道;音频裸码率:50kbps;SDK 默认的音频质量,如无特殊需求推荐选择之。
    music
    音乐模式。双声道 + 全频带;音频裸码率:128kbps;适合需要高保真传输音乐的场景,比如在线K歌、音乐直播等。
    openLocalCamera 接口需要传入 选择前后置摄像头 isFront 和 视频质量 quality 两个参数。
    isFront 是一个布尔值,true为打开前置摄像头,false为打开后置摄像头。
    qualityTUIVideoQuality 类型的枚举。
    枚举值类型
    含义
    quality360P
    低清360P
    quality540P
    标清540P
    quality720P
    高清720P
    quality1080P
    超清1080P
    下面以音频质量为 default,打开前置摄像头并且视频质量为 quality1080P为例,打开本地麦克风和摄像头。
    在开播后,您还需要调用 openLocalMicrophoneopenLocalCamera 接口开启麦克风和摄像头,确保观众可以看到您的画面和听到您的声音。
    openLocalMicrophone 接口需要传入音频质量参数 quality
    qualityAudioQuality 类型的枚举。
    枚举值类型
    含义
    SPEECH
    人声模式。单声道;音频裸码率:18kbps;适合语音通话为主的场景。
    DEFAULT
    默认模式。单声道;音频裸码率:50kbps;SDK 默认的音频质量,如无特殊需求推荐选择之。
    MUSIC
    音乐模式。双声道 + 全频带;音频裸码率:128kbps;适合需要高保真传输音乐的场景,比如在线K歌、音乐直播等。
    openLocalCamera 接口需要传入 选择前后置摄像头 isFront 和 视频质量 quality 两个参数。
    isFront 是一个布尔值,true 为打开前置摄像头,false 为打开后置摄像头。
    qualityVideoQuality 类型的枚举。
    枚举值类型
    含义
    Q_360P
    低清360P
    Q_540P
    标清540P
    Q_720P
    高清720P
    Q_1080P
    超清1080P
    下面以音频质量为 DEFAULT,打开前置摄像头并且视频质量为 Q_1080P为例,打开本地麦克风和摄像头。
    iOS
    Android
    import RTCRoomEngine
    
    // 打开本地麦克风
    let audioQuality: TUIAudioQuality = .default
    TUIRoomEngine.sharedInstance().openLocalMicrophone(audioQuality) {
    // 打开麦克风成功
    } onError: { code, message in
    // 打开麦克风失败
    }
    
    // 打开前置摄像头
    let isFrontCamera = true
    let videoQuality: TUIVideoQuality = .quality1080P
    TUIRoomEngine.sharedInstance().openLocalCamera(isFront: isFrontCamera, quality: videoQuality) {
    // 打开前置摄像头成功
    } 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) {
    // 打开麦克风失败
    }
    });
    
    
    // 打开前置摄像头
    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) {
    // 打开前置摄像头失败
    }
    });

    步骤4:设置本地预览画面

    若您需要查看本地的预览画面,可通过 调用 setLocalVideo 接口实现。
    iOS
    Android
    新选项
    import RTCRoomEngine
    
    let videoView = UIView()
    // ...将 viewoView 添加到您的视图上并对其进行布局
    TUIRoomEngine.sharedInstance().setLocalVideoView(view: videoView)
    TUIVideoView videoView = new TUIVideoView(context);
    // ...将 viewoView 添加到您的视图上并对其进行布局
    TUIRoomEngine.sharedInstance().setLocalVideoView(videoView);
    

    视频观看

    步骤1: 加入直播间

    您仅需要调用 enterRoom 接口成功进房即可收听到视频主播的声音,若您还想观看主播的视频画面,请确保进房成功后执行了步骤2。
    enterRoom 您需要传入两个参数:想要收听的主播所在房间的房间Id 和房间类型。
    说明:
    房间类型有两种:会议(conference)和直播(live),语聊房属于直播房间,因此您在调用 enterRoom 进房语聊房时,房间类型需要传入 live
    iOS
    Android
    新选项
    import RTCRoomEngine
    
    let roomId = "video_100001"
    let roomType = .live
    
    TUIRoomEngine.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() {
    @Override
    public void onSuccess(TUIRoomDefine.RoomInfo roomInfo) {
    // 进房成功
    }
    @Override
    public void onError(TUICommonDefine.Error error, String message) {
    // 进房失败
    }
    });
    

    步骤2:设置观看视图

    iOS
    Android
    您可调用 setRemoteVideoView 设置远端视频观看视图,传入三个参数: 观看的用户的用户Id、播放的视频流类型和用来播放视频的视图对象。
    若您期望观看的用户的房主,则用户 Id 为 步骤1 进房成功后的 roomInfo.ownerId。
    其中视频流类型是一个 TUIVideoStreamType 类型的枚举值。
    枚举值类型
    含义
    cameraStream
    高清摄像头视频流
    screenStream
    屏幕分享视频流
    cameraStreamLow
    低清摄像头视频流
    您可调用 setRemoteVideoView 设置远端视频观看视图,传入三个参数: 观看的用户的用户Id、播放的视频流类型和用来播放视频的视图对象。
    若您期望观看的用户的房主,则用户 Id 为 步骤1 进房成功后的 roomInfo.ownerId。
    其中视频流类型是一个 VideoStreamType 类型的枚举值。
    枚举值类型
    含义
    CAMERA_STREAM
    高清摄像头视频流
    SCREEN_STREAM
    屏幕分享视频流
    CAMERA_STREAM_LOW
    低清摄像头视频流
    以观看房主的高清摄像头视频流为例:
    iOS
    Android
    import RTCRoomEngine
    
    let videoView = UIView()
    // ...将 viewoView 添加到您的视图上并对其进行布局
    
    let ownerId = "" // 请将其替换成您加入的直播间的房主用户Id
    let streamType = TUIVideoStreamType.cameraStream
    TUIRoomEngine.sharedInstance().setRemoteVideoView(userId: ownerId,
    streamType: streamType,
    view: videoView)
    
    TUIVideoView videoView = new TUIVideoView(context);
    // ...将 viewoView 添加到您的视图上并对其进行布局
    
    String ownerId = ""; // 请将其替换成您加入的直播间的房主用户Id
    TUIRoomDefine.VideoStreamType streamType = TUIRoomDefine.VideoStreamType.CAMERA_STREAM;
    TUIRoomEngine.sharedInstance().setRemoteVideoView(ownerId, streamType, videoView);

    步骤3:观看主播视频画面

    您可调用 startPlayRemoteVideo 接口观看远端用户的视频流,播放的画面将在 步骤2 设置的视图对象上展示。
    startPlayRemoteVideo 需要传入两个视频参数: 观看的用户的用户Id和播放的视频流类型。
    以播放房主的高清视频流为例:
    iOS
    Android
    import RTCRoomEngine
    let ownerId = "" // 请将其替换成您加入的直播间的房主用户Id
    let streamType = TUIVideoStreamType.cameraStream
    TUIRoomEngine.sharedInstance().startPlayRemoteVideo(userId: ownerId,
    streamType: streamType) { userId in
    // 播放视频画面中
    } onLoading: { userId in
    // 视频画面加载中
    } onError: { userId, code, message in
    // 视频画面播放失败
    }
    String ownerId = ""; // 请将其替换成您加入的直播间的房主用户Id
    TUIRoomDefine.VideoStreamType streamType = TUIRoomDefine.VideoStreamType.CAMERA_STREAM;
    
    TUIRoomEngine.sharedInstance().startPlayRemoteVideo(ownerId, streamType, new TUIRoomDefine.PlayCallback() {
    @Override
    public void onPlaying(String userId) {
    // 播放视频画面中
    }
    @Override
    public void onLoading(String userId) {
    // 视频画面加载中
    }
    @Override
    public void onPlayError(String userId, TUICommonDefine.Error error, String message) {
    // 视频画面播放失败
    }
    });
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持