相親交友原始碼中語音連麥的實現方式,值得一看

雲豹科技程式設計師發表於2021-10-11
相親交友原始碼中,語音連麥是異性使用者之間進行交流的主要方式之一,為了提升使用者體驗,在相親交友原始碼開發時不僅需要採用延時更低的RTC傳輸協議,還需要選擇音質更高、流暢度更好的實時音視訊技術,接下來我們一起來看看在相親交友原始碼的開發中,如何實現語音連麥吧。

程式碼實現

1.註冊登入
implementation 'com.yanzhenjie:okalle:0.1.7'
  • 註冊
public void signUp(){
	JSONObject params = new JSONObject();
	try {
		params.put("sex",0);
		params.put("userName", Build.MODEL);
	} catch (JSONException e) {
		e.printStackTrace();
	}
	Kalle.post(String.format(Constants.SERVER,"user/signUp"))
			.addHeader(Constants.CONTENT_TYPE,"application/json")
			.body(new JsonBody(params.toString()))
			.perform(new SimpleCallback<String>() {
				@Override
				public void onResponse(SimpleResponse<String, String> response) {
					Log.i(TAG, "onResponse:signUp  response ="+response.succeed());
					if (response.succeed().contains("success")){
						signUpBean =gson.fromJson(response.succeed(),SignUpBean.class);
						if (signUpBean !=null){
							String uid =signUpBean.getData().getUid();
							SpUtil.putString(Constants.UID,uid);
							signIn(uid);
						}
					}
				}
    
				@Override
				public void onException(Exception e) {
					super.onException(e);
					e.printStackTrace();
				}
			});
}
  • 登入
public void signIn(String uid){
	JSONObject params = new JSONObject();
	try {
		params.put("cType",1);
		params.put("pkg",ARApplication.the().getApplicationContext().getPackageName());
		params.put("uid",uid);
	} catch (JSONException e) {
		e.printStackTrace();
	}
	Kalle.post(String.format(Constants.SERVER,"user/signIn"))
			.addHeader(Constants.CONTENT_TYPE,"application/json")
			.body(new JsonBody(params.toString()))
			.perform(new SimpleCallback<String>() {
				@Override
				public void onResponse(SimpleResponse<String, String> response) {
					Log.i(TAG, "onResponse: signIn success ="+response.succeed());
					if (response.succeed().contains("success")){
						signInBean =gson.fromJson(response.succeed(),SignInBean.class);
						getRoomList(signInBean);
						if (loginListener !=null){
							loginListener.loginSuccess(signInBean);
						}
					}
				}
    
				@Override
				public void onException(Exception e) {
					super.onException(e);
					e.printStackTrace();
				}
			});
}
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();
	}
}
  • 獲取相親交友原始碼的房間列表
//獲取房間列表
public void getRoomList(SignInBean signInBean){
	JSONObject params = new JSONObject();
	try {
		params.put("count", Integer.MAX_VALUE);
		params.put("rType", Constants.R_TYPE_LIVE);
	} catch (JSONException e) {
		e.printStackTrace();
	}
	Kalle.post(String.format(Constants.SERVER,"user/getRoomList"))
			.addHeader(Constants.CONTENT_TYPE,"application/json")
			.addHeader(Constants.AUTHORIZATION,"Bearer "+signInBean.getData().getUserToken())
			.body(new JsonBody(params.toString()))
			.perform(new SimpleCallback<String>() {
				@Override
				public void onResponse(SimpleResponse<String, String> response) {
					Log.i(TAG, "onResponse: getRoomList ="+response.succeed());
					if (response.succeed().contains("success")){
						roomListBean =gson.fromJson(response.succeed(), RoomListBean.class);
						if (roomListener !=null){
							roomListener.showRoomList(roomListBean);
						}
					}
				}
    
				@Override
				public void onException(Exception e) {
					super.onException(e);
					e.printStackTrace();
					Log.i(TAG, "onException: ===> ="+e.getMessage());
				}
			});
}
注:上面展示的是相親交友原始碼中語音連麥的部分功能,建立房間的是主播,下拉重新整理出來加入房間的是遊客
3.遊客加入房間
遊客在相親交友原始碼中加入房間第一步就是加入RTM頻道,然後申請上麥後,主播同意後,再加入RTC頻道,進行語音通話。
  • 加入房間
//呼叫服務介面,加入房間,接入有人進入房間
public void joinRoom(String roomId,String roomName,String pullRtmpUrl){
	JSONObject params = new JSONObject();
	try {
		params.put("cType",1);
		params.put("pkg",ARApplication.the().getApplicationContext().getPackageName());
		params.put("roomId",roomId);
	} catch (JSONException e) {
		e.printStackTrace();
	}
	Kalle.post(String.format(Constants.SERVER,"user/joinRoom"))
			.addHeader(Constants.CONTENT_TYPE,"application/json")
			.addHeader(Constants.AUTHORIZATION,"Bearer "+signInBean.getData().getUserToken())
			.body(new JsonBody(params.toString()))
			.perform(new SimpleCallback<String>() {
				@Override
				public void onResponse(SimpleResponse<String, String> response) {
					Log.i(TAG, "onResponse: joinRoom data ="+response.succeed());
					if (response.succeed().contains("success")){
						joinRoomBean =gson.fromJson(response.succeed(),JoinRoomBean.class);
						if (roomListener !=null){
							roomListener.joinRoom(joinRoomBean,roomId,roomName,pullRtmpUrl);
						}
					}
				}
    
				@Override
				public void onException(Exception e) {
					super.onException(e);
					e.printStackTrace();
					Log.i(TAG, "onException: e="+e.getMessage());
				}
			});
}
然後進行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資源,主播退出刪除房間,遊客退出房間就可以啦!
以上就是“相親交友原始碼是如何實現語音連麥的,你知道嗎?”的全部內容,希望對大家有幫助。
本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2795377/,如需轉載,請註明出處,否則將追究法律責任。

相關文章