如下是一个总体接入流程,详细细节请参见 RTC服务开通指南

主播与主播连麦pk

主播与观众连麦互动


/**
* 加入RTC房间并初始化参数
* @param token 加入 RTC 房间的 token
* @param roomId 加入 RTC 房间的 id
* @param userId 加入 RTC 房间的 userId
* @param isHost true:业务上主播 false:业务上观众
*/
public void joinRTCRoom(String token, String roomId, String userId, boolean isHost) {
// 初始化 RTCVideo 对象
mRTCVideo = RTCVideo.createRTCVideo(applicationContext, appId, mRTCVideoEventHandler, null, null);
// 初始化 RTCRoom 对象
mRTCRoom = mRTCVideo.createRTCRoom(roomId);
mRTCRoom.setRTCRoomEventHandler(mRTCRoomEventHandler);
// 设置主播为可见,观众为隐身
mRTCRoom.setUserVisibility(isHost);
// 加入房间时主播需要开启麦克风、相机,观众需要关闭麦克风、相机
if (isHost) {
mRTCVideo.startVideoCapture();
mRTCVideo.startAudioCapture();
// 设置本地渲染和编码镜像
mRTCVideo.setLocalVideoMirrorType(MirrorType.MIRROR_TYPE_RENDER_AND_ENCODER);
} else {
mRTCVideo.stopVideoCapture();
mRTCVideo.stopAudioCapture();
}
// 设置音频路由模式
mRTCVideo.setDefaultAudioRoute(AudioRoute.AUDIO_ROUTE_SPEAKERPHONE);
// 开启发言者音量监听
AudioPropertiesConfig audioPropertiesConfig = new AudioPropertiesConfig(300);
mRTCVideo.enableAudioPropertiesReport(audioPropertiesConfig);
// 加入房间,开始连麦,需要申请AppId和Token
UserInfo userInfo = new UserInfo(userId, null);
RTCRoomConfig roomConfig = new RTCRoomConfig(ChannelProfile.CHANNEL_PROFILE_INTERACTIVE_PODCAST,
true, true, true);
mRTCRoom.joinRoom(token, userInfo, roomConfig);
}
Java private final IRTCVideoEventHandler mRTCVideoEventHandler = 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 mRTCRoomEventHandler = new IRTCRoomEventHandler() {
@Override
public void onRoomStateChanged(String roomId, String uid, int state, String extraInfo) {
// 收到 RTC 加入房间结果
}
}
Java
/**
* 开启跨房间转推
* @param roomId 对方 RTC 房间的 id
* @param token 加入对方 RTC 房间所需的 token,有业务服务器生成并下发
*/
public void startForwardStream(String roomId, String token) {
ForwardStreamInfo forwardStreamInfo = new ForwardStreamInfo(roomId, token);
mRTCRoom.startForwardStreamToRooms(Collections.singletonList(forwardStreamInfo));
}
private final IRTCRoomEventHandler mRTCRoomEventHandler = new IRTCRoomEventHandler() {
/**
* 房间内新增远端媒体流流的回调
* @param uid 用户的用户 ID
* @param type 远端媒体流的类型
*/
@Override
public void onUserPublishStream(String uid, MediaStreamType type) {
if (type == MediaStreamType.RTC_MEDIA_STREAM_TYPE_AUDIO) {
// 只关心有视频的情况
return;
}
TextureView textureView = new TextureView(applicationContext);
VideoCanvas videoCanvas = new VideoCanvas(textureView,VideoCanvas.RENDER_MODE_HIDDEN);
RemoteStreamKey streamKey = new RemoteStreamKey(roomId,uid,StreamIndex.STREAM_INDEX_MAIN);
mRTCVideo.setRemoteVideoCanvas(streamKey,videoCanvas);
}
};
/**
* 结束跨房间转推
*/
public void stopForwardStream() {
mRTCRoom.stopForwardStreamToRooms();
}
Java
/**
* 主播和观众连麦成功
* @param userId 上麦用户的 ID
*/
public void onReceivedJoinInteract(String userId) {
// loginUserId 是业务上本端登录用户的 id
if (!TextUtils.equals(userId, loginUserId)) {
return;
}
VideoEncoderConfig videoEncoderConfig = new VideoEncoderConfig();
videoEncoderConfig.width = width;
videoEncoderConfig.height = height;
videoEncoderConfig.frameRate = frameRate;
videoEncoderConfig.maxBitrate = maxBitrate;
videoEncoderConfig.minBitrate = minBitrate;
mRTCVideo.setVideoEncoderConfig(videoEncoderConfig);
// 观众开启相机、麦克风采集
mRTCVideo.startVideoCapture();
mRTCVideo.startAudioCapture();
// 观众设置为可见状态
mRTCRoom.setUserVisibility(true);
// 观众开启音视频推流
mRTCRoom.publishStream(MediaStreamType.RTC_MEDIA_STREAM_TYPE_BOTH);
}
/**
* 收到观众下麦
* @param userId userID 下麦用户的 ID
*/
public void onReceivedLeaveInteract(String userId) {
// loginUserId 是业务上本端登录用户的 id
if (!TextUtils.equals(userId, loginUserId)) {
return;
}
// 观众开启相机、麦克风采集
mRTCVideo.stopVideoCapture();
mRTCVideo.stopAudioCapture();
// 观众设置为隐身状态
mRTCRoom.setUserVisibility(false);
// 观众开启音视频推流
mRTCRoom.unpublishStream(MediaStreamType.RTC_MEDIA_STREAM_TYPE_BOTH);
}
Java| 功能点 | API |
|---|---|
| 创建 ByteRTCVideo 实例 | createRTCVideo |
| 创建 ByteRTCRoom 实例 | createRTCRoom |
| 设置用户可见性 | setUserVisibility |
| 开启内部视频采集 | startVideoCapture |
| 关闭内部视频采集 | stopVideoCapture |
| 开启内部音频采集 | startAudioCapture |
| 关闭内部音频采集 | stopAudioCapture |
| 设置 RTC 编码分辨率等参数 | SetVideoEncoderConfig |
| 为采集到的视频流开启镜像 | setLocalVideoMirrorType |
| 设置当前音频播放路由 | setDefaultAudioRoute |
| 开启音量信息提示 | enableAudioPropertiesReport |
| 加入 RTC 房间 | joinRoom |
| 离开 RTC 房间 | leaveRoom |
| 销毁房间对象 | destroy |
| 在当前所在房间内发布媒体流 | publishStream |
| 停止媒体流发布到当前所在房间中 | unpublishStream |
| 开始跨房间转发媒体流 | startForwardStreamToRooms |
| 停止跨房间转发媒体流 | stopForwardStreamToRooms |
| 设置本地视频渲染 | setLocalVideoCanvas |
| 设置远端视频渲染 | setRemoteVideoCanvas |
| 功能点 | 回调 |
|---|---|
| 本地用户加入 RTC 回调 | onRoomStateChanged |
| 远端用户加入 RTC 回调 | onUserJoined |
| 本地用户音量回调 | onLocalAudioPropertiesReport |
| 远端用户音量回调 | onRemoteAudioPropertiesReport |
| 房间内新增远端媒体流回调 | onUserPublishStream |
| 跨房间媒体流转发状态和错误回调 | onForwardStreamStateChanged |