为了保证最佳体验效果,本场景需要集成火山引擎的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);
}
Javaprivate 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);
}
}
Java房主发起一起看直播,观众侧同步进入一起看直播。房主、观众各自通过直播播放器拉取同一个直播流观看。
注意:播放器接入及详细使用,请参考视频直播拉流 SDK

/**
* 开启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);
}
Java
/**
* 打开/关闭音量闪避功能。
* 开启该功能后,当检测到远端人声时,本地的媒体播放音量会自动减弱,从而保证远端人声的清晰可辨;当远端人声消失时,本地媒体音量会恢复到闪避前的音量水平。
* @param enable 是否开启音量闪避
*/
public void enablePlaybackDucking(boolean enable) {
mRTCVideo.enablePlaybackDucking(enable);
}
/**
* 调节混音的音量大小,包括音频文件混音和 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);
}
Java| 功能点 | API |
|---|---|
| 创建 RTCVideo 对象 | createRTCVideo |
| 创建 RTCRoom 对象 | createRTCRoom |
| 设置用户可见性 | setUserVisibility |
| 设置本地渲染和编码镜像 | setLocalVideoMirrorType |
| 设置本地视频渲染视图 | setLocalVideoCanvas |
| 设置音频场景类型 | setAudioScenario |
| 启用音频信息提示 | enableAudioPropertiesReport |
| 开启本地音频采集 | startAudioCapture |
| 开启本地视频采集 | startVideoCapture |
| 加入RTC 房间 | joinRoom |
| 设置远端用户视频渲染视图 | setRemoteVideoCanvas |
| 开启PCM 音频数据混音 | enableAudioMixingFrame |
| 推送 PCM 音频帧数据用于混音 | pushAudioMixingFrame |
| 调节混音的音量大小 | setAudioMixingVolume |
| 关闭PCM 混音 | disableAudioMixingFrame |
| 调节远端用户用通话音量 | setPlaybackVolume |
| 打开音量闪避功能 | enablePlaybackDucking |
| 离开房间 | leaveRoom |
| 销毁 RTCRoom 对象 | destroy |
| 关闭内部音频采集 | stopAudioCapture |
| 关闭内部视频采集 | stopVideoCapture |
| 销毁 RTCVideo 对象 | destroy |
| 功能点 | 回调 |
|---|---|
| 本地用户加入 RTC 房间回调 | onRoomStateChanged |
| 音频播放路由变化回调 | onAudioRouteChanged |
| 本地音频的相关信息回调 | onLocalAudioPropertiesReport |
| 订阅的远端用户的音频信息回调 | onRemoteAudioPropertiesReport |
| 远端用户加入 RTC 房间回调 | onUserJoined |
| 房间内新增远端摄像头/麦克风采集的媒体流回调 | onUserPublishStream |