1.1、實時音頻、實時視頻均通過相同的接口進行調用,遵循相同的業務流程。不同的業務通過呼叫接口參數CallType進行區分,CallType一共有2種類型:CallType.VIDEO(視頻),CallType.VOICE(音頻)。
注意:5.0以上的SDK集成的客戶端,測試音視頻功能,音視頻,會議,群組等操作需要,先將在我們控制臺創建的應用上線,才可測試(控制臺提供的測試demo中的應用id和應用token,不能用來測試,需要使用自己在官網控制臺創建的應用的id和應用token)。
1.2、接口邏輯:
接口調用是采取異步調用的方式。所有的呼叫相關接口的調用結果通過回調接口OnVoipListener中的方法OnCallEvents來接受服務端返回的各種狀態。
1.3、業務流程
(1)客戶A呼叫客戶B發起請求
(2)云通訊服務端收到A請求并把請求轉發給B
(3)客戶B收到請求并應答
(4)云通訊服務端收到B應答并轉發A
(5)A收到應答,通話建立
? 音頻呼叫 — 我們假設Tony音頻呼叫John,則代碼如下:
String mCurrentCallId = ECDevice.getECVoIPCallManager().makeCall(ECVoIPCallManager.CallType.VOICE, "john的賬號"); 說明:mCurrentCallId如果返回空則代表呼叫失敗,可能是參數錯誤引起。否則返回是一串數字,是當前通話的標識。
? 視頻呼叫 — 我們假設Tony視頻呼叫John,此時代碼和音頻呼叫相同,區別是呼叫類型需要傳入CallType.VIDEO,并且在呼叫前需要設置本地和對方的視頻view,代碼如下:
//view 顯示遠端視頻的surfaceview //localView本地顯示視頻的view ECDevice.getECVoIPSetupManager().setVideoView(view, localView); String mCurrentCallId = ECDevice.getECVoIPCallManager().makeCall(ECVoIPCallManager.CallType.VIDEO, "john的賬號"); 說明:mCurrentCallId如果返回空則代表呼叫失敗,可能是參數錯誤引起。否則返回是一串數字,是當前通話的標識。
? 獲取來電參數 — 被叫John接到Tony的呼叫,John同意接聽該呼入,John側的呼入activity的設置已經在sdk初始化的回調onInitialized中設置過。Sdk底層收到呼入請求后,會自動彈出該Activity.在Activity的onCreate中取出相關的參數。
1、 在呼入調起的界面中,獲取到呼入的類型是音頻或者視頻呼叫,然后來設置對應UI布局,代碼如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle extras = savedInstanceState; //或者 Bundle extras = getIntent().getExtras(); if (extras == null) { finish(); return; } //獲取是否是呼入還是呼出 mIncomingCall = !(getIntent().getBooleanExtra(EXTRA_OUTGOING_CALL, false)); //獲取是否是音頻還是視頻 mCallType = (ECVoIPCallManager.CallType) getIntent().getSerializableExtra(ECDevice.CALLTYPE); //獲取當前的callid mCallId = getIntent().getStringExtra(ECDevice.CALLID); //獲取對方的號碼 mCallNumber = getIntent().getStringExtra(ECDevice.CALLER); } }
2、假設John側調起來音頻或者視頻呼入的界面,界面上有“接受”和“拒絕”兩個按鈕;
(1)John點擊“接受”按鈕,則調用的代碼:
//如果視頻呼叫,則在接受呼叫之前,需要先設置視頻通話顯示的view ECDevice.getECVoIPSetupManager().setVideoView(view, localView); //view 顯示遠端視頻的surfaceview //localView本地顯示視頻的view ECDevice.getECVoIpCallManager().acceptCall(mCurrentCallId);
(2)John點擊“拒絕”按鈕,音視頻拒絕的代碼是一致的,調用的代碼是:
ECDevice.getECVoIpCallManager().rejectCall(mCurrentCallId,”拒絕的原因,傳入整形值”);
? 處理回調事件 — Tony在呼叫John的過程中,會有若干狀態返回,都在回調onCallEvents中處理,其監聽的設置已經在sdk初始化的回調onInitialized中設置過。代碼示例如下:
注意:在集成音視頻通話的時候,當結束當前通話的時候,需要在處理回調事件的onCallEvents中調用一下releaseCall方法,以保證當前通話占用的資源都釋放了,避免在下次呼叫的時候出現線路被占用現象。(android、ios均需這樣操作),Android的調用地方,onCallEvents中的 ECCALL_RELEASED:
@Override protected void onCallEvents(ECVoIPCallManager.VoIPCall voipCall) { if(voipCall==null) return; switch(voipCall. callState){ case ECCALL_ALERTING: Log(” 對方振鈴”); break; case ECCALL_PROCEEDING: Log(” 呼叫中”); break; case ECallAnswered: Log(” John接受了呼叫應答”); break; case ECCALL_FAILED:// Log(” 呼叫失敗”); break; case ECCALL_RELEASED: //無論是Tony還是John主動結束通話,雙方都會進入到此回調 Log(” 結束當前通話”); break; default: break; } } }
? 處理回調事件 — Tony和John的通話過程中,任何一方想結束呼叫,則都可以調用如下代碼:
ECDevice.getECVoIpCallManager().releaseCall(mCurrentCallId);
(1)設置揚聲器狀態
ECDevice. getECVoIPSetupManager().enableLoudSpeaker( boolean on); 功能: 設置揚聲器的狀態; 參數:on:true是開啟,false則為關閉。
(2)獲取揚聲器狀態
ECDevice. getECVoIPSetupManager().getLoudSpeakerStatus(); 功能:獲取當前揚聲器的狀態 參數:無 返回值:true是開啟,false則為關閉。
(3)設置靜音
ECDevice. getECVoIPSetupManager().setMute(boolean on); 功能:設置通話靜音狀態 參數:on:傳入true則對方聽不到說話,false則對方可以聽到說話。 返回值:無
(4)獲取靜音的狀態
ECDevice.getECVoIPSetupManager().getMuteStatus(); 功能:獲取當前通話靜音狀態 參數:無 返回值:返回true則是靜音狀態,false則不是靜音狀態.
(5)設置視頻通話顯示的窗口
ECDevice.getECVoIPSetupManager().setVideoView( SurfaceView view, SurfaceView localView); 功能:設置視頻通話過程中顯示的視圖 參數:view對方顯示的視圖,localView本地顯示的視圖。 返回值:無
(6)創建一個用于繪制視頻圖像的ECOpenGlView控件
ECOpenGlView mGlView = new ECOpenGlView(this); // 設置預覽類型為本地預覽、可以顯示于其他SurfaceView之上 mGlView.setGlType(ECOpenGlView.RenderType.RENDER_PREVIEW); // 或者設置為遠端繪制 mGlView.setGlType(ECOpenGlView.RenderType.RENDER_REMOTE); // 設置當前圖像填充方式(根據中心區域顯示,填充屏幕并剪切) mSelfGlView.setAspectMode(ECOpenGlView.AspectMode.CROP); // 按照圖像的比例顯示(分辨率和圖像分辨率不等時上下、左右會出現一種黑邊情況) mSelfGlView.setAspectMode(ECOpenGlView.AspectMode.FIT); // 按照View的寬高拉伸圖像 mSelfGlView.setAspectMode(ECOpenGlView.AspectMode.FILL);
(7)設置遠端視頻圖像顯示View為ECOpenGlView
ECVoIPSetupManager setUpMgr = ECDevice.getECVoIPSetupManager(); if(setUpMgr != null) { setUpMgr.setVideoView(mGlView , mCaptureView); }
(8)設置本地/遠端視頻圖像顯示View為ECOpenGlView
// 創建一個本地圖像顯示控件 ECOpenGlView mSelfGlView = new ECOpenGlView(this); // 設置預覽類型為本地預覽、可以顯示于其他SurfaceView之上 mSelfGlView.setGlType(ECOpenGlView.RenderType.RENDER_PREVIEW); // 設置當前圖像填充方式(根據中心區域顯示,填充屏幕并剪切) mSelfGlView.setAspectMode(ECOpenGlView.AspectMode.CROP); // 創建一個遠端圖像顯示控件 ECOpenGlView mRemoteGlView = new ECOpenGlView(this); // 設置預覽類型為遠端、可以顯示于其他SurfaceView之下 mRemoteGlView.setGlType(ECOpenGlView.RenderType.RENDER_PREVIEW); // 設置當前圖像填充方式(根據中心區域顯示,填充屏幕并剪切) mRemoteGlView.setAspectMode(ECOpenGlView.AspectMode.CROP); // 調用SDK接口設置圖像顯示View ECVoIPSetupManager setUpMgr = ECDevice.getECVoIPSetupManager(); if(setUpMgr != null) { // 設置圖像采集 setUpMgr.setCaptureView(new ECCaptureView(this)); // 設置本地遠端圖像顯示View setUpMgr.setGlDisplayWindow(mSelfGlView , mRemoteGlView); }
(9)動態切換本地/遠端圖像(對換本地遠端圖像顯示位置)
mSelfGlView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ECVoIPSetupManager setUpMgr = ECDevice.getECVoIPSetupManager(); if(setUpMgr != null) { // 設置當前遠端圖像顯示為全屏/小屏幕 mMaxSizeRemote = !mMaxSizeRemote; // 調用接口對換View位置 if(mMaxSizeRemote) { setUpMgr.setGlDisplayWindow(mSelfGlView , mRemoteView); } else { setUpMgr.setGlDisplayWindow(mRemoteView , mSelfGlView); } } } });
(10)視頻會議使用ECOpenGlView顯示成員圖像
// 創建一個圖像顯示控件View ECOpenGlView mGlView = new ECOpenGlView(this); mGlView.setGlType(ECOpenGlView.RenderType.RENDER_REMOTE); mSelfGlView.setAspectMode(ECOpenGlView.AspectMode.CROP); // 獲取會議管理API接口 ECMeetingManager meetMgr = ECDevice.getECMeetingManager(); // 使用接口設置圖像顯示View meetMgr.requestMemberVideoInVideoMeeting("conf0000", null, "yuntx", mGlView , "ip", 8080, null);
(11)獲取手機攝像頭參數
ECDevice.getECVoIPSetupManager().getCameraInfos(); 功能: 獲取手機攝像頭參數信息(攝像頭個數,名稱、以及攝像頭所持有的分辨率) 參數:無。 返回值:手機攝像頭參數信息
(12)切換前置和后置攝像頭
/** * 選擇攝像頭。可以在通話過程中選擇;如果不調用,底層將使用系統默認攝像頭 * @param cameraIndex CameraInfo的index值 * @param capabilityIndex CameraCapability的index值。范圍[0,capabilityCount-1] * @param fps 最大幀數 * @param rotate 旋轉的角度( {ROTATE_AUTO,ROTATE_0,ROTATE_90,ROTATE_180,ROTATE_270};中的值) * @param force 是否強制啟動本SDK調用的攝像頭。默認選false * @param scale 縮放 * @return 是否成功 0:成功; 非0失敗 */ ECDevice.getECVoIPSetupManager().selectCamera(int cameraIndex, int capabilityIndex, int fps, Rotate rotate, boolean force,float scale);
(13)設置VoIP呼叫透傳信息
// 創建一個個人信息參數對象 VoIPCallUserInfo mUserInfo = new VoIPCallUserInfo(); mUserInfo.setNickName("nickname"); mUserInfo.setPhoneNumber("PhoneNumber"); // 調用VoIP設置接口注入VoIP呼叫透傳參數 ECVoIPSetupManager setupManager = ECDevice.getECVoIPSetupManager(); setupManager.setVoIPCallUserInfo(mUserInfo);
(14)設置是否啟用來去電鈴聲播放
// 獲取一個VoIP設置接口對象 ECVoIPSetupManager setupManager = ECDevice.getECVoIPSetupManager(); // 設置來電響鈴(v5.1.8r版本以及以前) setupManager.setIncomingSoundEnabled(true); // 查詢是否來電響鈴(v5.1.8r版本以及以前) setupManager.isIncomingSoundEnabled(); // 設置VoIP呼叫是否播放回鈴音(v5.1.8r版本以及以前) setupManager.setOutgoingSoundEnabled(true); // 查詢是否啟用呼叫播放回鈴音(v5.1.8r版本以及以前) setupManager.isOutgoingSoundEnabled(); // 設置VoIP呼叫是否播放呼叫失敗提示音(v5.1.8r版本以及以前) setupManager.setDisconnectSoundEnabled(true); // 查詢是否啟用呼叫失敗提示音(v5.1.8r版本以及以前) setupManager.isDisconnectSoundEnabled(); v5.1.9r版本開始通過如下接口設置: // 設置VOIP 自定義鈴聲路徑 ECVoIPSetupManager setupManager = ECDevice.getECVoIPSetupManager(); if(setupManager != null) { // 目前支持下面三種路徑查找方式 // 1、如果是assets目錄則設置為前綴[assets://] setupManager.setInComingRingUrl(true, "assets://phonering.mp3"); setupManager.setOutGoingRingUrl(true, "assets://phonering.mp3"); setupManager.setBusyRingTone(true, "assets://played.mp3"); // 2、如果是raw目錄則設置為前綴[raw://] // 3、如果是SDCard目錄則設置為前綴[file://] }
(15)設置音頻處理開關,在通話前調用
// 獲取一個VoIP設置接口對象 ECVoIPSetupManager setupManager = ECDevice.getECVoIPSetupManager(); // 比如設置開啟回音消除模式 setupManager.setAudioConfigEnabled(ECVoIPSetupManager.AudioType.AUDIO_EC , true , ECVoIPSetupManager.AudioMode.EC_Conference);
(16)查詢相關的音頻處理參數
// 獲取一個VoIP設置接口對象 ECVoIPSetupManager setupManager = ECDevice.getECVoIPSetupManager(); // 比如是否啟用回音消除 setupManager.getAudioConfig(ECVoIPSetupManager.AudioType.AUDIO_EC); // 查詢回音消除模式 setupManager.getAudioConfigMode(ECVoIPSetupManager.AudioType.AUDIO_EC);
(17)設置視頻通話碼流(需要在通話前使用)
// 獲取一個VoIP設置接口對象 ECVoIPSetupManager setupManager = ECDevice.getECVoIPSetupManager(); // 比如:將視頻通話碼流設置成150 setupManager.setVideoBitRates(150);
(18)設置SDK支持的編解碼方式,默認全部支持
// 獲取一個VoIP設置接口對象 ECVoIPSetupManager setupManager = ECDevice.getECVoIPSetupManager(); // 比如:設置當前通話使用 G729編碼傳輸 setupManager.setCodecEnabled(ECVoIPSetupManager.Codec.Codec_G729 , true); // 查詢制定編解碼是否支持 setupManager.getCodecEnabled(ECVoIPSetupManager.Codec.Codec_G729);
(19)實時獲取通話中的統計數據
// 獲取一個VoIP設置接口對象 ECVoIPSetupManager setupManager = ECDevice.getECVoIPSetupManager(); // 比如:獲取音頻通話信息 // 具體參數信息可以參考API文檔CallStatisticsInfo CallStatisticsInfo statistics = setupManager.getCallStatistics("callId", false);
(20)獲取VoIP、視頻、實時對講、聊天室、會議上下行流量
// 獲取一個VoIP設置接口對象 ECVoIPSetupManager setupManager = ECDevice.getECVoIPSetupManager(); // 具體參數信息可以參考API文檔NetworkStatistic NetworkStatistic networkStatistic = setupManager.getNetworkStatistic("callId");
(21)獲取服務器callSid,建議通話建立后獲取。代碼示例如下:
private Map map = new HashMap(); private void get(){ String s = ECDevice.getECVoIPCallManager().getUserData(3,mCallId); if(!TextUtils.isEmpty(s)){ if(s.contains(";")) { String[] arr = s.split("\\;"); if (arr != null) { for (String item : arr) { if (!TextUtils.isEmpty(item) && item.startsWith("servercallid")){ String[] arr2 = item.split("\\="); if (arr2 != null && arr2.length == 2) { map.put("sid", arr2[1]); } } } } }else { if(s.startsWith("servercallid=")){ String [] arr = s.split("\\="); if(arr!=null&&arr.length==2){ map.put("sid",arr[1]); } } } } }
(22)獲取用戶在線狀態
ECDevice.getUsersState(new String[]{userId}, new OnGetUsersStateListener() { @Override public void onGetUsersState(ECError error, ECUserState... userState) { //查詢多個用戶狀態回調 可變數組 userState } });
(23)單應用多證書
/** * ECDevice類 * 多證書設置 * @param pushCerKey 推送證書標識,與服務器上傳證書保持一致 */ ECDevice.setPushCerKey("xxxx");
(24)設置網絡代理
/** * ECDevice類 * 設置網絡代理。需要走代理時登錄前設置,不支持ssl;socks5代理支持im和點對點(底層將關閉媒體流內網打洞),http代理支持im * @param proxyHost 代理服務器地址,最大長度255。當設置空時,取消代理 * @param proxyPort 代理端口 * @param authType 鑒權類型。 目前支持 0 不鑒權;2 用戶名密碼鑒權 * @param userName 用戶名,最大長度255。authType=2時有效 * @param userPass 用戶名密碼,最大長度255。authType=2時有效 * @param proxyType 代理類型。 目前支持 0 socks5代理;1 http代理 * @return */ ECDevice.setNetworkProxy(proxyHost,proxyPort,authType,userName,userPass,proxyType);
文檔更新時間:2017年12月4日