You need to enable JavaScript to run this app.
导航
场景搭建(Android)
最近更新时间:2024.04.22 17:52:23首次发布时间: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混音
*/
public void startAudioMixing(int playerId){
    IMediaPlayer player = mEngine.getMediaPlayer(playerId);
    MediaPlayerCustomSource source = new MediaPlayerCustomSource(null, MediaPlayerCustomSourceMode.PUSH, MediaPlayerCustomSourceStreamType.RAW);
    player.openWithCustomSource(source, new MediaPlayerConfig(AudioMixingType.AUDIO_MIXING_TYPE_PLAYOUT_AND_PUBLISH, 1));
}


/** 
 * 播放器音频数据回调,推送音频数据到RTC
 */
public void pushAudioMixingFrame(int playerId, byte[] pcm, int samples, AudioSampleRate sampleRate, AudioChannel channel){
    // 获取RTC混音播放器
    IMediaPlayer player = mEngine.getMediaPlayer(playerId);
    // 构造音频帧
    AudioFrame frame = new AudioFrame(pcm, samples, sampleRate, channel);
    // 将播放器回调出的数据送入RTC播放
    player.pushExternalAudioFrame(frame);
}

/**
* 关闭PCM混音
*/
public void stopAudioMixing(int playerId) {
    // 获取RTC混音播放器
    IMediaPlayer player = mEngine.getMediaPlayer(playerId);
    // 关闭混音
    player.stop();
}
/**
* 发送房间广播消息
*/
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 音频数据混音openWithCustomSource
推送 PCM 音频帧数据用于混音pushExternalAudioFrame
调节混音的音量大小setVolume
给房间内的所有其他用户发送文本消息sendRoomMessage
调节远端用户用通话音量setPlaybackVolume
打开音量闪避功能enablePlaybackDucking
离开房间leaveRoom
销毁 RTCRoom 对象destroy
关闭内部音频采集stopAudioCapture
关闭内部视频采集stopVideoCapture
销毁 RTCVideo 对象destroy

回调

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