You need to enable JavaScript to run this app.
导航

场景搭建(Android)

最近更新时间2023.12.28 20:05:12

首次发布时间2022.11.15 15:46:49

SDK集成

如下是一个总体接入流程,详细细节请参见 RTC服务开通指南

alt

整体实现流程

主播与主播连麦pk

alt

主播与观众连麦互动

alt

核心功能实现

主播开启直播和观众进房

时序图

alt

示例代码

/**
 * 加入RTC房间并初始化参数
 * @param token 加入 RTC 房间的 token
 * @param roomId 加入 RTC 房间的 id
 * @param userId 加入 RTC 房间的 userId
 * @param isHost true:业务上主播 false:业务上观众
 */
public void joinRTCRoom(String token, String roomId, String userId, boolean isHost) {
    // 初始化 RTCVideo 对象
    mRTCVideo = RTCVideo.createRTCVideo(applicationContext, appId, mRTCVideoEventHandler, null, null);
    // 初始化 RTCRoom 对象
    mRTCRoom = mRTCVideo.createRTCRoom(roomId);
    mRTCRoom.setRTCRoomEventHandler(mRTCRoomEventHandler);
    // 设置主播为可见,观众为隐身
    mRTCRoom.setUserVisibility(isHost);
    // 加入房间时主播需要开启麦克风、相机,观众需要关闭麦克风、相机
    if (isHost) {
        mRTCVideo.startVideoCapture();
        mRTCVideo.startAudioCapture();
        // 设置本地渲染和编码镜像
        mRTCVideo.setLocalVideoMirrorType(MirrorType.MIRROR_TYPE_RENDER_AND_ENCODER);
    } else {
        mRTCVideo.stopVideoCapture();
        mRTCVideo.stopAudioCapture();
    }
    // 设置音频路由模式
    mRTCVideo.setDefaultAudioRoute(AudioRoute.AUDIO_ROUTE_SPEAKERPHONE);
    // 开启发言者音量监听
    AudioPropertiesConfig audioPropertiesConfig = new AudioPropertiesConfig(300);
    mRTCVideo.enableAudioPropertiesReport(audioPropertiesConfig);
    // 加入房间,开始连麦,需要申请AppId和Token
    UserInfo userInfo = new UserInfo(userId, null);
    RTCRoomConfig roomConfig = new RTCRoomConfig(ChannelProfile.CHANNEL_PROFILE_INTERACTIVE_PODCAST,
            true, true, true);
    mRTCRoom.joinRoom(token, userInfo, roomConfig);
}
private final IRTCVideoEventHandler mRTCVideoEventHandler = new IRTCVideoEventHandler(){
    @Override
    public void onLocalAudioPropertiesReport(LocalAudioPropertiesInfo[] audioPropertiesInfos) {
        super.onLocalAudioPropertiesReport(audioPropertiesInfos);
        // 本地用户音量回调
    }
    @Override
    public void onRemoteAudioPropertiesReport(RemoteAudioPropertiesInfo[] audioPropertiesInfos, int totalRemoteVolume) {
        super.onRemoteAudioPropertiesReport(audioPropertiesInfos, totalRemoteVolume);
        // 远端用户音量回调
    }
};
private final IRTCRoomEventHandler mRTCRoomEventHandler = new IRTCRoomEventHandler() {
    @Override
    public void onRoomStateChanged(String roomId, String uid, int state, String extraInfo) {
        // 收到 RTC 加入房间结果
    }
}

主播与主播连麦 PK

时序图

alt

示例代码

/**
 * 开启跨房间转推
 * @param roomId 对方 RTC 房间的 id
 * @param token 加入对方 RTC 房间所需的 token,由业务服务器生成并下发
 */
public void startForwardStream(String roomId, String token) {
    ForwardStreamInfo forwardStreamInfo = new ForwardStreamInfo(roomId, token);
    mRTCRoom.startForwardStreamToRooms(Collections.singletonList(forwardStreamInfo));
}

private final IRTCRoomEventHandler mRTCRoomEventHandler = new IRTCRoomEventHandler() {

    /**
     * 房间内新增远端媒体流的回调
     * @param uid 用户的用户 ID
     * @param type 远端媒体流的类型
     */
    @Override
    public void onUserPublishStream(String uid, MediaStreamType type) {
        if (type == MediaStreamType.RTC_MEDIA_STREAM_TYPE_AUDIO) {
            // 只关心有视频的情况
            return;
        }
        TextureView textureView = new TextureView(applicationContext);
        VideoCanvas videoCanvas = new VideoCanvas(textureView,VideoCanvas.RENDER_MODE_HIDDEN);
        RemoteStreamKey streamKey = new RemoteStreamKey(roomId,uid,StreamIndex.STREAM_INDEX_MAIN);
        mRTCVideo.setRemoteVideoCanvas(streamKey,videoCanvas);
    }
};

/**
 * 结束跨房间转推
 */
public void stopForwardStream() {
    mRTCRoom.stopForwardStreamToRooms();
}

主播与观众连麦互动

时序图

alt

示例代码

/**
 * 主播和观众连麦成功
 * @param userId 上麦用户的 ID
 */
public void onReceivedJoinInteract(String userId) {
    // loginUserId 是业务上本端登录用户的 id
    if (!TextUtils.equals(userId, loginUserId)) {
        return;
    }
    VideoEncoderConfig videoEncoderConfig = new VideoEncoderConfig();
    videoEncoderConfig.width = width;
    videoEncoderConfig.height = height;
    videoEncoderConfig.frameRate = frameRate;
    videoEncoderConfig.maxBitrate = maxBitrate;
    videoEncoderConfig.minBitrate = minBitrate;
    mRTCVideo.setVideoEncoderConfig(videoEncoderConfig);
    // 观众开启相机、麦克风采集
    mRTCVideo.startVideoCapture();
    mRTCVideo.startAudioCapture();
    // 观众设置为可见状态
    mRTCRoom.setUserVisibility(true);
    // 观众开启音视频推流
    mRTCRoom.publishStream(MediaStreamType.RTC_MEDIA_STREAM_TYPE_BOTH);
}
/**
 * 收到观众下麦
 * @param userId userID 下麦用户的 ID
 */
public void onReceivedLeaveInteract(String userId) {
    // loginUserId 是业务上本端登录用户的 id
    if (!TextUtils.equals(userId, loginUserId)) {
        return;
    }
    // 观众开启相机、麦克风采集
    mRTCVideo.stopVideoCapture();
    mRTCVideo.stopAudioCapture();
    // 观众设置为隐身状态
    mRTCRoom.setUserVisibility(false);
    // 观众开启音视频推流
    mRTCRoom.unpublishStream(MediaStreamType.RTC_MEDIA_STREAM_TYPE_BOTH);
}

核心功能 API 与回调参考

API

功能点API
创建 ByteRTCVideo 实例createRTCVideo
创建 ByteRTCRoom 实例createRTCRoom
设置用户可见性setUserVisibility
开启内部视频采集startVideoCapture
关闭内部视频采集stopVideoCapture
开启内部音频采集startAudioCapture
关闭内部音频采集stopAudioCapture
设置 RTC 编码分辨率等参数SetVideoEncoderConfig
为采集到的视频流开启镜像setLocalVideoMirrorType
设置当前音频播放路由setDefaultAudioRoute
开启音量信息提示enableAudioPropertiesReport
加入 RTC 房间joinRoom
离开 RTC 房间leaveRoom
销毁房间对象destroy
在当前所在房间内发布媒体流publishStream
停止媒体流发布到当前所在房间中unpublishStream
开始跨房间转发媒体流startForwardStreamToRooms
停止跨房间转发媒体流stopForwardStreamToRooms
设置本地视频渲染setLocalVideoCanvas
设置远端视频渲染setRemoteVideoCanvas

回调

功能点回调
本地用户加入 RTC 回调onRoomStateChanged
远端用户加入 RTC 回调onUserJoined
本地用户音量回调onLocalAudioPropertiesReport
远端用户音量回调onRemoteAudioPropertiesReport
房间内新增远端媒体流回调onUserPublishStream
跨房间媒体流转发状态和错误回调onForwardStreamStateChanged