You need to enable JavaScript to run this app.
导航
场景搭建(Android)
最近更新时间:2024.10.11 10:33:57首次发布时间:2022.11.15 16:06:43

SDK集成

为了保证最佳体验效果,本场景需要集成火山引擎的RTC SDK 以及火山直播播放器(建议)。您需要在 RTC、直播的控制台开通服务,相应开通指南如下:

1、RTC SDK总体接入流程,详细细节请参见 RTC服务开通指南

alt

2、直播播放器接入流程,详细步骤请参见接入流程

您也可使用原有三方直播播放器来实现,但为保障最佳体验,需实现音频托管功能,具体可与火山技术支持同学联系;

整体实现流程

整体业务流程图

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(Utilities.getApplicationContext());
    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(Utilities.getApplicationContext());
        VideoCanvas videoCanvas = new VideoCanvas(view, VideoCanvas.RENDER_MODE_HIDDEN);
        RemoteStreamKey streamKey = new RemoteStreamKey(mRoomId,uid,StreamIndex.STREAM_INDEX_MAIN);
        mRTCVideo.setRemoteVideoCanvas(streamKey, videoCanvas);
    }
}

一起看直播

房主发起一起看直播,观众侧同步进入一起看直播。房主、观众各自通过直播播放器拉取同一个直播流观看。
注意:播放器接入及详细使用,请参考视频直播拉流 SDK

时序图

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();
}

控制台

alt

示例代码

/** 
 * 打开/关闭音量闪避功能。 
 * 开启该功能后,当检测到远端人声时,RTC 的本地的媒体播放音量会自动减弱,从而保证远端人声的清晰可辨;当远端人声消失时,RTC 的本地媒体音量会恢复到闪避前的音量水平。
 * @param enable 是否开启音量闪避
 */
public void enablePlaybackDucking(boolean enable) {
    mRTCVideo.enablePlaybackDucking(enable);
}

/** 
 * 调节混音的音量大小,包括音频文件混音和 PCM 混音。
 * @param playerId 混音播放器 ID
 * @param volume 混音音量相对原音量的比值。范围为 `[0, 400]`,建议范围是 `[0, 100]`。
 */
public void setAudioMixingVolume(int playerId, int volume) {
    IMediaPlayer player = mEngine.getMediaPlayer(playerId);
    player.setVolume(volume, AudioMixingType.AUDIO_MIXING_TYPE_PLAYOUT);
}

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

核心功能 API 与回调参考

功能点API
创建 RTCVideo 对象createRTCVideo
创建 RTCRoom 对象createRTCRoom
设置用户可见性setUserVisibility
设置本地渲染和编码镜像setLocalVideoMirrorType
设置本地视频渲染视图setLocalVideoCanvas
设置音频场景类型setAudioScenario
启用音频信息提示enableAudioPropertiesReport
开启本地音频采集startAudioCapture
开启本地视频采集startVideoCapture
加入RTC 房间joinRoom
设置远端用户视频渲染视图setRemoteVideoCanvas
开启PCM 音频数据混音openWithCustomSource
推送 PCM 音频帧数据用于混音pushExternalAudioFrame
调节混音的音量大小setVolume
调节远端用户用通话音量setPlaybackVolume
打开音量闪避功能enablePlaybackDucking
离开房间leaveRoom
销毁 RTCRoom 对象destroy
关闭内部音频采集stopAudioCapture
关闭内部视频采集stopVideoCapture
销毁 RTCVideo 对象destroy
功能点回调
本地用户加入 RTC 房间回调onRoomStateChanged
音频播放路由变化回调onAudioRouteChanged
本地音频的相关信息回调onLocalAudioPropertiesReport
订阅的远端用户的音频信息回调onRemoteAudioPropertiesReport
远端用户加入 RTC 房间回调onUserJoined
房间内新增远端摄像头/麦克风采集的媒体流回调onUserPublishStream