從0開始,搭建一個完整的iOS音視頻通訊系統

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

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

1、準備:

首先在圖鴨官網:http://tucodec.com 進行註冊,得到SDK中所須要的AppKey、AppSecret,註冊登陸後以下圖所示:
圖片描述框架

其次到開發者裏選擇下載iOS中所需SDK。
圖片描述ide

最後解壓,以下圖所示:
圖片描述ui

一、解壓voipDemo.zip,如圖4所示:
圖片描述spa

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

在使用TYVoIPiOSSDK.framework庫的時候,須要導入下面這些框架:
圖片描述code

完成上述操做後,咱們的音視頻通信App所需的大致框架已經完成啦。
以後就是碼代碼,完成系統UI界面繪製和用戶之間通信的邏輯操做。視頻

在圖鴨科技提供的SDK中,咱們能夠看到對外只有兩個頭文件,可見快速集成音視頻通訊並非那麼複雜。如圖7所示:
圖片描述server

2、頭文件定義:

<1> TYVoipDarwinManager.h文件,該文件定義了對外提供的類和協議。如下3個是該文件中核心類與協議。
(1) TYVoipDarwinManager : VoIP主要功能以及管理類
(2) TYVoipVideoData : 接收以及發送視頻數據模型
(3) TYVoipDelegate : VoIP的代理

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

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

例如,甲和乙之間進行通信,假設甲的UserID爲401,乙的UserID爲402,甲登陸後向乙發送我要和你開視頻,乙登陸後向甲發送我要和你開視頻,甲開始渲染乙的視圖,乙開始渲染甲的視圖 。完成上述全部操做後,甲乙創建通信。

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

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

[[TYVoipManager share] configVoip];

<2>登陸轉發服務器(登陸一次便可):

[[TYVoipDarwinManager sharedVoip]      loginRelayServer:ip
                                       serverPort:port
                                       sessionId:sessionId
                                       userId:_401
                                       AppKey:AppKey
                                       AppSecret:AppSecret];

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

[[TYVoipDarwinManager sharedVoip] setDelegate:self];
[[TYVoipDarwinManager sharedVoip] startCallWithUserId:401];

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

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

<5>不須要通話時,中止voip:

//關閉voip
[[TYVoipDarwinManager sharedVoip] stopCall];
//清空現有的鏈接節點(再也不接收節點的數據)
[[TYVoipDarwinManager sharedVoip] clearClientNodeList];

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

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

[[TYVoipDarwinManager sharedVoip] destroy];

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

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

<1>登陸操做:

甲(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;
}

<2>鏈接操做

甲鏈接乙操做:
-(void)startVoip{
    //設置通信中所需代理涉及到實現的方法下面有解釋
    [[TYVoipDarwinManager sharedVoip] setDelegate:self];
    //甲本身加入到通信中
    [[TYVoipDarwinManager sharedVoip] startCallWithUserId:401];
    //添加節點(添加乙的USerID)
    [[TYVoipDarwinManager sharedVoip] addClientNode:402];
    //視圖渲染
    [self.preView startRendering];//渲染甲本身
    [self.otherView startRendering];//渲染乙視圖
}

<3>斷開操做

甲進行斷開通訊操做
-(void)stopVoip{
    //關閉voip
    [[TYVoipDarwinManager sharedVoip] stopCall];
    //清空現有的鏈接節點(再也不接收節點的數據)
    [[TYVoipDarwinManager sharedVoip] clearClientNodeList];
    //中止視圖渲染
    [self.preView stopRendering];
    [self.otherView stopRendering];
}

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

-(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{//其餘節點語音,混音

}

圖片描述

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

相關文章
相關標籤/搜索