相親交友原始碼中語音連麥的實現方式,值得一看
在
相親交友原始碼中,語音連麥是異性使用者之間進行交流的主要方式之一,為了提升使用者體驗,在相親交友原始碼開發時不僅需要採用延時更低的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在相親交友原始碼中實現視訊連麥直播需要哪些步驟?原始碼
- 相親交友原始碼中,音訊AAC解碼的實現程式碼原始碼音訊
- 相親交友原始碼開發中,Redis的三種限流方式原始碼Redis
- 語音交友app開發中連線資料庫的方式,值得一看APP資料庫
- 在相親原始碼的多人音視訊聊天中插入現場直播的實現方式原始碼
- 相親交友原始碼實現相親直播間,移動終端的優化方案原始碼優化
- 相親交友原始碼開發,前端如何實現水印功能?原始碼前端
- 如何在相親交友原始碼中實現正方形驗證碼輸入框?原始碼
- 相親交友原始碼中的事件循壞,你瞭解多少?原始碼事件
- 如何實現相親交友原始碼的CPU效能優化?解決方案梳理原始碼優化
- 相親交友原始碼實現程式內快取,提升高併發能力!原始碼快取
- 搭建相親交友原始碼 ,API 介面統一格式返回的實現原始碼API
- 10種相親交友原始碼客戶端儲存方式,各有優缺點原始碼客戶端
- 開發相親交友原始碼,需要熟練掌握的音視訊基礎知識原始碼
- 相親交友原始碼開發中會用到的幾種日期處理方法原始碼
- 相親交友原始碼的架構設計,實現合成複用原則需要如何做?原始碼架構
- 相親交友原始碼開發,前端API如何請求快取?原始碼前端API快取
- 相親交友原始碼前端效能優化,通常使用哪些手段?原始碼前端優化
- 如何解決相親交友原始碼中Redis快取擊穿、雪崩問題?原始碼Redis快取
- 相親交友原始碼第三方登入的實現及易擴充套件的達成原始碼套件
- 語音交友app開發,點選按鈕出現彈窗的實現方式APP
- 相親原始碼中移動支付的實現,沒有想象中那麼難原始碼
- 相親交友原始碼開發,演算法的定義及複雜度分析原始碼演算法複雜度
- 編寫相親交友原始碼,註釋方面應該重視哪些問題?原始碼
- 在相親原始碼開發中,如何實現圓角及特殊圓角的使用?原始碼
- 如何實現直播連麥?音視訊SDK不可缺少!
- 如何用前端實現麥克風語音喚醒前端
- 一文解讀伊對相親交友app原始碼功能特色、應用場景APP原始碼
- 微信語音連播的實現思路
- 語音社交原始碼開發,兩個執行緒按照指定方式有序相交的實現原始碼執行緒
- 一篇文章簡析伊對影片相親交友app原始碼功能贏利點APP原始碼
- 陪玩系統原始碼實現音訊編碼的相關步驟原始碼音訊
- 影片相親交友系統開發,引領婚戀交友新玩法
- 相親交友原始碼開發,關於分散式快取應該瞭解的一些事原始碼分散式快取
- 相親原始碼的效能為何這麼重要,該怎樣實現優化?原始碼優化
- 實現一個簡單的語音聊天室(原始碼)原始碼
- 用連結串列的方式實現大數相減-Java實現Java
- 婚戀交友原始碼開發,採用連線複用實現效能優化原始碼優化