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

场景搭建(Android)

最近更新时间2024.02.27 19:05:55

首次发布时间2022.11.15 15:26:04

SDK集成

为了保证最佳体验效果,本场景需要集成火山引擎的RTC SDK 以及点播播放器 SDK 并且使用内容定制云服务,您需要在 RTC、点播、内容定制的控制台开通服务,相应开通指南如下:
1、RTC SDK总体接入流程,详细步骤请参看 RTC服务开通指南

alt

2、点播 SDK接入流程,详细步骤请参看点播控制台服务开通
3、内容定制接入流程,详细步骤请参看内容定制控制台服务开通

整体实现流程

整体业务流程图

alt

核心功能实现

创建/加入房间

时序图

alt

示例代码

/**
 * 加入RTC房间并初始化参数 
 * @param token 加入 RTC 房间的 token
 * @param roomId 加入 RTC 房间的 id
 * @param userId 加入 RTC 房间的 用户id
 */
public void joinRTCRoom(String token, String roomId, String userId) {
    // 初始化 RTCVideo 对象
    mRTCVideo = RTCVideo.createRTCVideo(applicationContext, appId, mIRTCVideoEventHandler, null, null);

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

    // 设置可见
    mRTCRoom.setUserVisibility(true);

    // 加入房间时需要开启麦克风、相机,观众需要关闭麦克风、相机
    mRTCVideo.startVideoCapture();
    mRTCVideo.startAudioCapture();
        
    // 设置本地渲染和编码镜像
    mRTCVideo.setLocalVideoMirrorType(MirrorType.MIRROR_TYPE_RENDER_AND_ENCODER);

    // 绑定本地预览视图
    TextureView view = new TextureView(applicationContext);
    VideoCanvas videoCanvas = new VideoCanvas(view, VideoCanvas.RENDER_MODE_HIDDEN);
    mRTCVideo.setLocalVideoCanvas(StreamIndex.STREAM_INDEX_MAIN, videoCanvas);
    
    // 设置音频场景类型
    mRTCVideo.setAudioScenario(AudioScenarioType.AUDIO_SCENARIO_COMMUNICATION);

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

    // 加入房间,开始连麦,需要申请AppId和Token
    UserInfo userInfo = new UserInfo(userId, null);
    RTCRoomConfig roomConfig = new RTCRoomConfig(ChannelProfile.CHANNEL_PROFILE_LW_TOGETHER,
            true, true, true);
    mRTCRoom.joinRoom(token, userInfo, roomConfig);
}
private final IRTCVideoEventHandler mIRTCVideoEventHandler = 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 mIRTCRoomEventHandler = new IRTCRoomEventHandler() {
    /**
     * 收到 RTC 加入房间结果
     */
    @Override
    public void onRoomStateChanged(String roomId, String uid, int state, String extraInfo) {
        super.onRoomStateChanged(roomId, uid, state, extraInfo);
    }
    
    /**
     * 远端用户加入房间回调
     */
    @Override
    public void onUserJoined(UserInfo userInfo, int elapsed) {
        super.onUserJoined(userInfo, elapsed);
    }
    
    /**
     * 房间内新增远端摄像头/麦克风采集的媒体流的回调
     */
    @Override
    public void onUserPublishStream(String uid, MediaStreamType type) {
        super.onUserPublishStream(uid, type);
        if (type == MediaStreamType.RTC_MEDIA_STREAM_TYPE_AUDIO) {
            return;
        }
        // 绑定远端用户视频视图 
        TextureView view = new TextureView(applicationContext);
        VideoCanvas videoCanvas = new VideoCanvas(view, VideoCanvas.RENDER_MODE_HIDDEN);
        RemoteStreamKey remoteStreamKey = new RemoteStreamKey(mRoomId, uid, StreamIndex.STREAM_INDEX_MAIN);
        mRTCVideo.setRemoteVideoCanvas(remoteStreamKey, videoCanvas);
    }
}

一起看抖音

时序图

alt

示例代码

/**
* 开启PCM混音
* @param mixId 混音ID。用于标识混音,保证混音 ID 唯一性。 如果使用相同的 ID 重复调用本*方法后,前一次混音会停止,后一次混音开始。
*/
public void startAudioMixing(int mixId){
    // 获取RTC混音管理器
    IAudioMixingManager mixAudioManager = mRTCVideo.getAudioMixingManager();
    // 启动 PCM 音频数据混音
    IAudioMixingManager mixAudioManager.enableAudioMixingFrame(mixId, AudioMixingType.AUDIO_MIXING_TYPE_PLAYOUT);
}

/** 
 * 播放器音频数据回调,推送音频数据到RTC
 */
public void pushAudioMixingFrame(int mixId, byte[] pcm, int samples, AudioSampleRate sampleRate, AudioChannel channel){
    // 获取RTC混音管理器
    IAudioMixingManager mixAudioManager = mRTCVideo.getAudioMixingManager();
    // 构造音频帧
    AudioFrame frame = new AudioFrame(pcm, samples, sampleRate, channel);
    // 将播放器回调出的数据送入RTC播放
    mixAudioManager.pushAudioMixingFrame(mixId, frame);
}

/**
* 关闭PCM混音
*/
public void stopAudioMixing(int mixId) {
    // 获取RTC混音管理器
    IAudioMixingManager mixAudioManager = mRTCVideo.getAudioMixingManager();
    // 关闭混音
    mixAudioManager.disableAudioMixingFrame(mixId);
}

/**
* 发送房间广播消息
*/
public void sendRoomMessage(String message) {
    // 发送同步消息
    // 房主讲当前视频的播放进度及播放状态发送给房间内所有观众
    mRTCRoom.sendRoomMessage(message);
}
private final IRTCRoomEventHandler mIRTCRoomEventHandler = new IRTCRoomEventHandler() {
    /**
     * 收到房间广播消息
     */
    @Override
    public void onRoomMessageReceived(String uid, String message) {
        super.onRoomMessageReceived(uid, message);
        // 观众收到房主发送的播放状态与本地播放状态进行对比并修正,保持同步
    }
}

控制台

alt

示例代码

/** 
 * 调节混音的音量大小,包括音频文件混音和 PCM 混音。
 * @param mixId 混音 ID
 * @param volume 混音音量相对原音量的比值。范围为 `[0, 400]`,建议范围是 `[0, 100]`。
 */
public void setAudioMixingVolume(int mixId, int volume) {
    IAudioMixingManager audioMixingManager = mRTCVideo.getAudioMixingManager();
    audioMixingManager.setAudioMixingVolume(mixId, volume, AUDIO_MIXING_TYPE_PLAYOUT);
}

/** 
 * 调节本地播放的所有远端用户音频混音后的音量,混音内容包括远端人声、音乐、音效等。播放音频前或播放音频时,你都可以使用此接口设定播放音量。
 * @param volume 音频播放音量值和原始音量的比值,范围是 [0, 400],单位为 %,自带溢出保护。
 */
 public void setPlaybackVolume(int volume) {
    mRTCVideo.setPlaybackVolume(volume);
}

核心 API 与回调参考

API

功能点API
创建 RTCVideo 对象createRTCVideo
创建 RTCRoom 对象createRTCRoom
设置用户可见性setUserVisibility
设置本地渲染和编码镜像setLocalVideoMirrorType
设置本地视频渲染视图setLocalVideoCanvas
设置音频场景类型setAudioScenario
启用音频信息提示enableAudioPropertiesReport
开启本地音频采集startAudioCapture
开启本地视频采集startVideoCapture
加入RTC 房间joinRoom
设置远端用户视频渲染视图setRemoteVideoCanvas
开启PCM 音频数据混音enableAudioMixingFrame
推送 PCM 音频帧数据用于混音pushAudioMixingFrame
调节混音的音量大小setAudioMixingVolume
关闭PCM 混音disableAudioMixingFrame:
给房间内的所有其他用户发送文本消息sendRoomMessage
调节远端用户用通话音量setPlaybackVolume
打开音量闪避功能enablePlaybackDucking
离开房间leaveRoom
销毁 RTCRoom 对象destroy
关闭内部音频采集stopAudioCapture
关闭内部视频采集stopVideoCapture
销毁 RTCVideo 对象destroy

回调

功能点回调
本地用户加入 RTC 房间回调onRoomStateChanged
音频播放路由变化时,收到该回调onAudioRouteChanged
本地用户音量回调onLocalAudioPropertiesReport
远端用户音量回调onRemoteAudioPropertiesReport
远端用户加入 RTC 回调onUserJoined
房间内新增远端媒体流回调onUserPublishStream
收到房间内广播文本消息回调onRoomMessageReceived