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

2、直播播放器接入流程,详细步骤请参见接入流程
您也可使用原有三方直播播放器来实现,但为保障最佳体验,需实现音频托管功能,具体可与火山技术支持同学联系;


/** * 加入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

/** * 开启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(); }

/** * 打开/关闭音量闪避功能。 * 开启该功能后,当检测到远端人声时,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 |
|---|---|
| 创建 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 |