SDK集成

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

alt

整体实现流程
整体业务流程图

alt

核心功能实现
创建/加入房间模块
时序图

alt

示例代码
public void joinRoom(String roomId, String token, String userId, boolean isHost) {
    // 初始化 RTCVideo 对象
    mRTCVideo = RTCVideo.createRTCVideo(applicationContext, appId,
            mRTCVideoEventHandler, null, null);

    // 初始化 RTCRoom 对象
    mRTCRoom = mRTCVideo.createRTCRoom(roomId);
    mRTCRoom.setRTCRoomEventHandler(mRTCRoomEventHandler);

    // 主播开启麦克风采集,观众关闭麦克风采集
    if (isHost) {
        mRTCVideo.startAudioCapture();
    } else {
        mRTCVideo.stopAudioCapture();
    }

    // 设置音频路由模式
    mRTCVideo.setDefaultAudioRoute(AudioRoute.AUDIO_ROUTE_SPEAKERPHONE);

    // 开启发言者音量监听
    AudioPropertiesConfig config = new AudioPropertiesConfig(300);
    mRTCVideo.enableAudioPropertiesReport(config);

    // 设置主播为可见状态,设置观众为隐身状态
    mRTCRoom.setUserVisibility(isHost);

    // 加入房间,开始连麦需要申请AppId和Token
    UserInfo userInfo = new UserInfo(userId, null);
    RTCRoomConfig roomConfig = new RTCRoomConfig(ChannelProfile.CHANNEL_PROFILE_INTERACTIVE_PODCAST,
            true, true, false);
    mRTCRoom.joinRoom(token, userInfo, roomConfig);
}
java
private final IRTCRoomEventHandler mRTCRoomEventHandler = new IRTCRoomEventHandler() {

    /**
     * 收到 RTC 加入房间结果
     */
    @Override
    public void onRoomStateChanged(String roomId, String uid, int state, String extraInfo) {
        super.onRoomStateChanged(roomId, uid, state, extraInfo);
    }

};

private final IRTCVideoEventHandler mRTCVideoEventHandler = new IRTCVideoEventHandler() {
    
    /**
          * 本地用户音量回调        
          *  
          *  @param audioPropertiesInfos 本地音频信息
          */
    @Override
    public void onLocalAudioPropertiesReport(LocalAudioPropertiesInfo[] audioPropertiesInfos) {
        super.onLocalAudioPropertiesReport(audioPropertiesInfos);
    }

    /**
     * 远端用户音量回调
     *
     * @param audioPropertiesInfos 远端音频信息,其中包含音频流属性、房间 ID、用户 ID
     * @param totalRemoteVolume 订阅的所有远端流的总音量
     */
    @Override
    public void onRemoteAudioPropertiesReport(RemoteAudioPropertiesInfo[] audioPropertiesInfos, int totalRemoteVolume) {
        super.onRemoteAudioPropertiesReport(audioPropertiesInfos, totalRemoteVolume);
    }
};
java
上麦模块
时序图

alt

示例代码
// 观众上麦/下麦
public void makeCoHost(boolean isCoHost) {
    Log.d(TAG, String.format("makeCoHost: %b", isCoHost));
    if (mRTCVideo != null) {
        if (isCoHost) {
            mRTCVideo.startAudioCapture();
            if (mRTCRoom != null) {
                mRTCRoom.setUserVisibility(true);
                mRTCRoom.publishStream(MediaStreamType.RTC_MEDIA_STREAM_TYPE_AUDIO);
            }
        } else {
            mRTCVideo.stopAudioCapture();
            if (mRTCRoom != null) {
                mRTCRoom.setUserVisibility(false);
                mRTCRoom.unpublishStream(MediaStreamType.RTC_MEDIA_STREAM_TYPE_AUDIO);
            }
        }
    }
}
java
背景音乐
时序图

alt

示例代码
/**
  * 设置背景音乐
  *  @param filePath 混音文件路径
  */
public void startBackgroundMusic(String filePath) {
    if (mRTCVideo == null) {
        return;
    }
    // 获取 IAudioMixingManager 对象
    IAudioMixingManager audioMixingManager = mRTCVideo .getAudioMixingManager();
    if (audioMixingManager == null) {
        return;
    }
    // 开启混音播放
    audioMixingManager.preloadAudioMixing(audioMixingId, filePath);
    AudioMixingConfig config = new AudioMixingConfig(AUDIO_MIXING_TYPE_PLAYOUT_AND_PUBLISH, -1);
    audioMixingManager.startAudioMixing(audioMixingId, filePath, config);
}

/**
  * 设置音频采集音量
  *  @param volume 采集的音量值和原始音量的比值。范围为 `[0, 400]`,建议范围是 `[0, 100]`。
  */
public void setRecordingVolume(int volume) {
    if (mRTCVideo == null) {
        return;
    }
    // 设置麦克风采集音量
    mRTCVideo.setCaptureVolume(StreamIndex.STREAM_INDEX_MAIN, volume);
}

/**
  * 设置混音音量
  *  @param volume 混音音量相对原音量的比值。范围为 `[0, 400]`,建议范围是 `[0, 100]`。
  */
public void setMusicVolume(int volume) {
    if (mRTCVideo == null) {
        return;
    }
    // 获取 IAudioMixingManager 对象
    IAudioMixingManager audioMixingManager = mRTCVideo .getAudioMixingManager();
    if (audioMixingManager == null) {
        return;
    }
    audioMixingManager.setAudioMixingVolume(audioMixingId, volume, AUDIO_MIXING_TYPE_PLAYOUT_AND_PUBLISH);
}
java
核心功能 API 与回调参考
API
技术逻辑API
创建 ByteRTCVideo 实例createRTCVideo
创建 ByteRTCRoom 实例createRTCRoom
开启麦克风采集startAudioCapture
关闭麦克风采集stopAudioCapture
设置音频路由模式setDefaultAudioRoute
开启发言者音量监听enableAudioPropertiesReport
设置用户可见性setUserVisibility
加入 RTC 房间joinRoom
离开 RTC 房间leaveRoom
销毁房间对象destroy
混音管理接口创建getAudioMixingManager
开启混音播放startAudioMixing
关闭混音播放stopAudioMixing
暂停混音播放pauseAudioMixing
恢复混音播放resumeAudioMixing
设置混音音量setAudioMixingVolume
设置麦克风采集音量setCaptureVolume
回调
技术逻辑CallBack
本地用户加入 RTC 回调onRoomStateChanged
远端用户加入 RTC 回调onUserJoined
本地用户音量回调onLocalAudioPropertiesReport
远端用户音量回调onRemoteAudioPropertiesReport