手把手教你,搭建一個完整的iOS音視頻通信系統 原

現在市面上有許多音視頻通信軟件,比如Facetime。你是否想過開發一款獨屬於自己的音視頻通信軟件?在iOS開發中,音視頻通訊開發一直比較困難:昂貴的開發成本、較高的技術門檻讓很多開發者和公司望而卻步。

 

今天圖鴨君就和你說一下,如何從0開始,搭建一個完整的iOS音視頻通信系統。文中涉及的服務器配置問題,可以到圖鴨官網查看相關文檔。

 

、準備:

首先在圖鴨官網:http://tucodec.com 進行註冊,獲得SDK中所需要的AppKey、AppSecret,註冊登錄後如下圖所示:

 圖1  註冊後獲取AppKey、AppSecret

 

其次到開發者裏選擇下載iOS中所需SDK。

 

圖2  SDK下載展示

 

最後解壓,如下圖所示:

圖3  SDK解壓後內容

 

解壓voipDemo.zip,如圖4所示:

 

圖4  voipDemo解壓後內容

 

把TYVoIPiOSSDK.framework拿出來,該framework即爲圖鴨音視頻SDK,導入到所需的iOS項目中,有時候導入framework工程沒有自動添加該SDK的framework路徑,檢查方法:target—>Build Settings—>Search Path,在Framework Search Path中加入TYVoIPiOSSDK.framework的路徑。由於SDK是與C++混編的,所以只要使用到SDK中文件的 .m 文件都需要改成 .mm 後綴名,如圖5所示:

 

圖5  SDK導入項目中展示圖

 

在使用TYVoIPiOSSDK.framework庫的時候,需要導入下面這些框架:

 

圖6  SDK所依賴庫展示

 

完成上述操作後,我們的音視頻通訊App所需的大體框架已經完成啦。

之後就是碼代碼,完成系統UI界面繪製和用戶之間通訊的邏輯操作。

在圖鴨科技提供的SDK中,我們可以看到對外只有兩個頭文件,可見快速集成音視頻通信並不是那麼複雜。如圖7所示:

 

圖7  SDK中頭文件展示

 

二、頭文件定義:

 

<一> TYVoipDarwinManager.h文件,該文件定義了對外提供的類和協議。以下3個是該文件中核心類與協議

(1) TYVoipDarwinManager : VoIP主要功能以及管理類

(2) TYVoipVideoData : 接收以及發送視頻數據模型

(3) TYVoipDelegate : VoIP的代理

 

<二> TYVoipRender.h文件:提供渲染用戶視圖View。

瞭解上述主要接口文件及其定義後,我們來了解SDK中的通信原理:SDK中,所有用戶都以通訊節點的形式存在,作爲節點的用戶都擁有自己唯一的表示—— UserID ,整個SDK會根據每個用戶的UserID來進行通訊。

 

例如,甲和乙之間進行通訊,假設甲的UserID爲401,乙的UserID爲402,甲登錄後向乙發送我要和你開視頻,乙登錄後向甲發送我要和你開視頻,甲開始渲染乙的視圖,乙開始渲染甲的視圖 。完成上述所有操作後,甲乙建立通訊。

 

三、完整的SDK使用步驟簡介:

<一>配置voip,在程序啓動的時候調用:

[[TYVoipManager share] configVoip];

 

<二>登錄轉發服務器(登錄一次即可):

[[TYVoipDarwinManager sharedVoip]  loginRelayServer:ip

serverPort:port

                               sessionId:sessionId

                              userId:_401

                                  AppKey:AppKey

                              AppSecret:AppSecret];

 <三>設置voip代理和開始voip:

     [[TYVoipDarwinManager sharedVoip] setDelegate:self];

  [[TYVoipDarwinManager sharedVoip] startCallWithUserId:401];

 

<四>根據邏輯,添加(刪除)需要通話的節點:

  [[TYVoipDarwinManager sharedVoip] addClientNode:402];

  //[[TYVoipDarwinManager sharedVoip] removeClientNode:402];

 

<五>不需要通話時,停止voip:

  //關閉voip

       [[TYVoipDarwinManager sharedVoip] stopCall];

  //清空現有的連接節點(不再接收節點的數據)

       [[TYVoipDarwinManager sharedVoip] clearClientNodeList];

 

 <六>根據具體的業務邏輯重複步驟三、四、五

 

<七>在程序結束時銷燬voip

  [[TYVoipDarwinManager sharedVoip] destroy];

 

部分代碼解釋:(從用戶甲的實現代碼來解釋)

TYRenderView * preView;    //渲染甲的視圖

TYRenderView * otherView;   //渲染乙的視圖

 

<一>登錄操作:

   甲(UserID:401)登錄操作,返回值爲是否登錄成功(非0即爲成功):

-(BOOL)login{

         NSString * ip = @"**.**.**.**";//所需轉發服務器地址 

        uint16_t port = 0;

         int sessionId = 0;

         uint32_t AppKey = 0;//填寫剛纔申請的AppKey與AppSecret

         uint32_t AppSecret = 0;

  int res = [[TYVoipDarwinManager sharedVoip]  loginRelayServer:ip

serverPort:port

                               sessionId:sessionId

                               userId:_401

                               AppKey:AppKey

                               AppSecret:AppSecret];

         return res;

}

<二>連接操作

甲連接乙操作:

-(void)startVoip{

//設置通訊中所需代理     涉及到實現的方法下面有解釋

     [[TYVoipDarwinManager sharedVoip] setDelegate:self];

     //甲自己加入到通訊中

  [[TYVoipDarwinManager sharedVoip] startCallWithUserId:401];

     //添加節點(添加乙的USerID)

     [[TYVoipDarwinManager sharedVoip] addClientNode:402];

     //視圖渲染

     [self.preView startRendering];//渲染甲自己

    [self.otherView startRendering];//渲染乙視圖

}

<三>斷開操作

甲進行斷開通信操作

-(void)stopVoip{

     //關閉voip

     [[TYVoipDarwinManager sharedVoip] stopCall];

//清空現有的連接節點(不再接收節點的數據)

     [[TYVoipDarwinManager sharedVoip] clearClientNodeList];

     //停止視圖渲染

     [self.preView stopRendering];

     [self.otherView stopRendering];

 }

 <四>代碼中出現代理方法詳解

- (void)localVideoImage:(TYVoipVideoData *)image{//甲畫面處理

     if ([self.preView isRenderring]){

         [self.preView renderVoipVideoData:image];//進行甲畫面渲染

     }

}

- (void)remoteVideoImage:(TYVoipVideoData *)image{//乙畫面處理

     if ([self.otherView isRenderring]){

         [self.otherView renderVoipVideoData:image]; //乙畫面渲染

     }

}

- (void)previewAudio:(NSData *)data{//本地語音

}

- (void)mixedAudio:(NSData *)data{//其他節點語音,混音

}

項目中最重要的代碼介紹完啦,那測試一下,看看我們的成果吧。

 

 

圖8  測試效果圖

 

到這裏,搭建一套完整的iOS音視頻通信系統就完成了,圖鴨君在demo裏實現了兩路通信。多路通信的原理與兩路一模一樣,小夥伴們思考一下,動手搭建多路通信吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章