写点什么

怎么和小伙伴语音连麦,你造吗?

发布于: 2021 年 02 月 03 日

前段时间开发出一个语音连麦的小功能 demo,平常自己玩玩,和小伙伴语音连麦,很好用,哈哈哈。使用的也是 anyRTC 的 API 功能。废话少说,开整!


不知道 anyRTC 的,可以点击这里了解官网Android文档!

demo 下载

  • 点击下载

  • 代码还没有上传到 GitHub,日后上传更新 demo。

demo 演示

看波视频~ 省的给大家截图,视频来的实在,简单明了

主播端:点击观看

游客端:点击观看

掘金还没有线上展示视频功能,希望赶快支持 @掘金酱

代码实现

这个是结合 anyRTC 的后台服务的,这个也是服务也是对外开放的

1.注册登录

我这边使用的杨振杰封装的 HTTP:

implementation 'com.yanzhenjie:okalle:0.1.7'                                       
复制代码
  • 注册

  • 登录

2.主播创建和获取房间

  • 创建房间

a.首先需要初始化 Rtc 和 Rtm 实例

//创建RTC实例,appid 可以去anyRTC官网注册mRtcEngine =RtcEngine.create(mContext, appId,mEventHandler);
//创建RTM实例,appid同上mRtmClient =RtmClient.createInstance(mContext, appId,mClientListener);
复制代码

b.然后登录 AR RTM

public void login(String rtmToken,String userId, final ResultCallback<Void> callback){	if (mRtmClient !=null){		if (mIsLogin) {			if (callback != null)				callback.onSuccess(null);			return;		}		mRtmClient.login(rtmToken, String.valueOf(userId), new ResultCallback<Void>() {			@Override			public void onSuccess(Void aVoid) {				Log.d(TAG, "rtm login success");				mIsLogin = true;				if (callback != null)					callback.onSuccess(aVoid);			}
@Override public void onFailure(ErrorInfo errorInfo) { Log.e(TAG, String.format("rtm join %s", errorInfo.getErrorDescription())); mIsLogin = false; if (callback != null) callback.onFailure(errorInfo); } }); }}
复制代码

c.然后主播加入房间

加入 RTC 和 RTM 频道

RTC:音视频通话

RTM:实时消息

//加入RTM频道,完成主播和游客实时消息的发送public void joinChannel(final String channelId, ResultCallback<Void> callback) {	if (mRtmClient != null) {		leaveChannel();		Log.w(TAG, String.format("joinChannel %s", channelId));		try {			final RtmChannel rtmChannel = mRtmClient.createChannel(channelId, mChannelListener);			if (rtmChannel == null) return;			rtmChannel.join(new ResultCallback<Void>() {				@Override				public void onSuccess(Void aVoid) {					Log.d(TAG, "rtm join success");					mRtmChannel = rtmChannel;					getMembers();				}
@Override public void onFailure(ErrorInfo errorInfo) { Log.e(TAG, String.format("rtm join %s", errorInfo.getErrorDescription())); //AlertUtil.showToast("RTM login failed, see the log to get more info"); mRtmChannel = rtmChannel; } }); } catch (Exception ex) { ex.printStackTrace(); } }}
//加入RTC频道,实现主播和游客语音连麦public void joinChannel(String rtcToken,String channelId, String userId) { if (mRtcEngine != null){ mRtcEngine.setClientRole(Constants.CLIENT_ROLE_BROADCASTER); mRtcEngine.joinChannel(rtcToken, channelId, null, userId); mRtcEngine.muteLocalAudioStream(false); //mRtcEngine.setEnableSpeakerphone(true); createStreamingInstance(); }}
复制代码
  • 获取房间列表

注:上面展示语音连麦的部分功能,创建房间的是主播,下拉刷新出来加入房间的是游客

3.游客加入房间

加入房间第一步就是加入 RTM 频道,然后申请上麦后,主播同意后,再加入 RTC 频道,进行语音通话。


  • 加入房间

然后进行 RTM 加入房间,和上面主播加入房间一样。

  • 申请上麦流程

a.游客点击上麦,给主播发一条 RTM 消息,通知主播“我要上麦”

//点击按钮事件,进行发送消息try {	jsonObject.put("cmd","apply");} catch (JSONException e) {	e.printStackTrace();}mChatRoomManager.getRtmManager().sendMessageToPeer(mAnchorId,jsonObject.toString(),null);
//发送P to P消息public void sendMessageToPeer(final String userId, final String content, final ResultCallback<Void> callback) { if (TextUtils.isEmpty(userId)) return;
if (mRtmClient != null) { RtmMessage message = mRtmClient.createMessage(content); mRtmClient.sendMessageToPeer(userId, message, null, new ResultCallback<Void>() { @Override public void onSuccess(Void aVoid) { Log.d(TAG, String.format("sendMessageToPeer %s %s", userId, content));
if (callback != null) callback.onSuccess(aVoid); }
@Override public void onFailure(ErrorInfo errorInfo) { Log.e(TAG, String.format("sendMessageToPeer %s", errorInfo.getErrorDescription()));
if (callback != null) callback.onFailure(errorInfo); } }); }}
复制代码

b.主播收到消息,然后弹出对话框,然后进行:确定上麦、拒绝上麦的操作!

//主播收到消息,进行的逻辑操作!applyDialog =new ApplyDialog(this, "连麦申请", mChannelData.getName(userId) + "申请连麦",		"拒绝", "确定", () -> {			try {				object.put("cmd",Constants.MIC_REJECT_LINE);			} catch (JSONException e) {				e.printStackTrace();			}			mChatRoomManager.getRtmManager().sendMessageToPeer(userId,object.toString(),null);		}, () -> {	try {		object.put("cmd",Constants.MIC_ACCEPT_LINE);	} catch (JSONException e) {		e.printStackTrace();	}	mChatRoomManager.getRtmManager().sendMessageToPeer(userId,object.toString(),null);});
applyDialog.show();
复制代码

c.主播同意上麦后,游客加入 RTC 频道,进行连麦。

//游客收到同意上麦的操作逻辑micState = MIC_STATE_DOWN;isJoinMic =true;autoTipDialog =new AutoTipDialog(this,R.drawable.success_tip,"同意上麦");autoTipDialog.show();mJoinMic.setImageResource(R.drawable.down_mic);String rtcToken = Optional.ofNullable(serverManager)		.map(ARServerManager::getJoinRoomBean)		.map(JoinRoomBean::getData)		.map(JoinRoomBean.DataBean::getRoom)		.map(JoinRoomBean.DataBean.RoomBeans::getRtcToken)		.orElse("");Log.i(TAG, "onAcceptLineUpdated: rtcToken ="+rtcToken);
mChatRoomManager.joinRtcChannel(rtcToken,roomId); //j加入RTC频道
mediaPlayerKit.mute(true);if (isMic){ mChatMic.setImageResource(R.drawable.mic_close);}else { mChatMic.setImageResource(R.drawable.mic_open);}mChatRoomManager.getRtcManager().muteLocalAudioStream(isMic);if (isSpeaker){ mSpeaker.setImageResource(R.drawable.speaker_close);}else { mSpeaker.setImageResource(R.drawable.speaker_open);}mChatRoomManager.getRtcManager().getRtcEngine().setEnableSpeakerphone(!isSpeaker);rlMusic.setVisibility(View.VISIBLE);mChatMic.setVisibility(View.VISIBLE);mSpeaker.setVisibility(View.GONE);mFrameLayout.setVisibility(View.VISIBLE);rvGuestLog.setVisibility(View.GONE);mLogList.add(new LogBean(R.drawable.circle,getDate(),"上麦成功"));
复制代码


这个时候就可以和你的小伙伴进行语音操作啦!

最后释放 RTC 和 RTM 资源,主播退出删除房间,游客退出房间就可以啦!

如有不懂的地方,欢迎大家留言。


作者:anyRTC-东慕雨


用户头像

实时交互,万物互联! 2020.08.10 加入

实时交互,万物互联,全球实时互动云服务商领跑者!

评论

发布
暂无评论
怎么和小伙伴语音连麦,你造吗?