如下是一个总体接入流程,详细细节请参见 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); }
/** * 开启跨房间转推 * @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(); }
/** * 主播和观众连麦成功 * @param userId 上麦用户的 ID */ public void onReceivedJoinInteract(String userId) { // loginUserId 是业务上本端登录用户的 id if (!TextUtils.equals(userId, loginUserId)) { return; } // 更新 RTC 编码分辨率、帧率、码率,具体数值可以联系技术支持。 // 参考:https://www.volcengine.com/docs/6348/70122 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); }
功能点 | 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 |