引言:《手把手教你搭建音視頻通信系統(tǒng)》專輯將推送三篇文章趟妥,分別涉及iOS炮障、Android和Windows版本的搭建宵距,涵蓋范圍廣憾股,此外用到的是現(xiàn)已開源的服務(wù)器代碼和免費的SDK岔留,感興趣的小伙伴們完全可以自己嘗試搭建呦夏哭!
現(xiàn)在市面上有許多音視頻通信軟件,比如Facetime献联。你是否想過開發(fā)一款獨屬于自己的音視頻通信軟件竖配?在iOS開發(fā)中,音視頻通訊開發(fā)一直比較困難:昂貴的開發(fā)成本里逆、較高的技術(shù)門檻讓很多開發(fā)者和公司望而卻步进胯。
今天圖鴨君就和你說一下,如何從O開始原押,搭建一個完整的IOS音視頻通信系統(tǒng)胁镐。文中涉及的服務(wù)器配置問題,可以到圖鴨官網(wǎng)查看相關(guān)文檔。
一盯漂、準(zhǔn)備
首先在圖鴨官網(wǎng):http://tucodec.com 進(jìn)行注冊颇玷,獲得SDK中所需要的AppKey、AppSecret就缆,注冊登錄后如下圖所示:
其次到開發(fā)者里選擇下載iOS中所需SDK。
最后解壓违崇,如下圖所示:
1阿弃、解壓voipDemo.zip,如圖4所示:
把TYVoIPiOSSDK.framework拿出來羞延,該framework即為圖鴨音視頻SDK,導(dǎo)入到所需的iOS項目中,有時候?qū)雈ramework工程沒有自動添加該SDK的framework路徑渣淳,檢查方法:target—>Build Settings—>Search Path,在Framework Search Path中加入TYVoIPiOSSDK.framework的路徑。由于SDK是與C++混編的,所以只要使用到SDK中文件的 .m 文件都需要改成 .mm 后綴名伴箩,如圖5所示:
在使用TYVoIPiOSSDK.framework庫的時候入愧,需要導(dǎo)入下面這些框架:
完成上述操作后,我們的音視頻通訊App所需的大體框架已經(jīng)完成啦嗤谚。
之后就是碼代碼棺蛛,完成系統(tǒng)UI界面繪制和用戶之間通訊的邏輯操作。
在圖鴨科技提供的SDK中巩步,我們可以看到對外只有兩個頭文件旁赊,可見快速集成音視頻通信并不是那么復(fù)雜。如圖7所示:
二. 頭文件定義:
<1> TYVoipDarwinManager.h文件椅野,該文件定義了對外提供的類和協(xié)議终畅。以下3個是該文件中核心類與協(xié)議。
(1) TYVoipDarwinManager : VoIP主要功能以及管理類
(2) TYVoipVideoData : 接收以及發(fā)送視頻數(shù)據(jù)模型
(3) TYVoipDelegate : VoIP的代理
<2> TYVoipRender.h文件:提供渲染用戶視圖View竟闪。
了解上述主要接口文件及其定義后离福,我們來了解SDK中的通信原理:在SDK中,所有用戶都以通訊節(jié)點的形式存在炼蛤,作為節(jié)點的用戶都擁有自己唯一的表示—— UserID 妖爷,整個SDK會根據(jù)每個用戶的UserID來進(jìn)行通訊。
例如理朋,甲和乙之間進(jìn)行通訊絮识,假設(shè)甲的UserID為401,乙的UserID為402嗽上,甲登錄后向乙發(fā)送我要和你開視頻笋除,乙登錄后向甲發(fā)送我要和你開視頻,甲開始渲染乙的視圖炸裆,乙開始渲染甲的視圖 垃它。完成上述所有操作后,甲乙建立通訊。
三. 完整的SDK使用步驟簡介:
<1>配置voip,在程序啟動的時候調(diào)用:
[[TYVoipManager share] configVoip];
<2>登錄轉(zhuǎn)發(fā)服務(wù)器(登錄一次即可):
[[TYVoipDarwinManager sharedVoip]? loginRelayServer:ip
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?serverPort:port
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?sessionId:sessionId
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?userId:_401
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AppKey:AppKey
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AppSecret:AppSecret];
<3>設(shè)置voip代理和開始voip:
[[TYVoipDarwinManager sharedVoip] setDelegate:self];
[[TYVoipDarwinManager sharedVoip] startCallWithUserId:401];
<4>根據(jù)邏輯,添加(刪除)需要通話的節(jié)點:
[[TYVoipDarwinManager sharedVoip] addClientNode:402];
//[[TYVoipDarwinManager sharedVoip] removeClientNode:402];
<5>不需要通話時,停止voip:
//關(guān)閉voip
[[TYVoipDarwinManager sharedVoip] stopCall];
//清空現(xiàn)有的連接節(jié)點(不再接收節(jié)點的數(shù)據(jù))
[[TYVoipDarwinManager sharedVoip] clearClientNodeList];
<6>根據(jù)具體的業(yè)務(wù)邏輯重復(fù)步驟3国拇、4洛史、5
<7>在程序結(jié)束時銷毀voip
[[TYVoipDarwinManager sharedVoip] destroy];
四、部分代碼解釋:(從用戶甲的實現(xiàn)代碼來解釋)
TYRenderView * preView; //渲染甲的視圖
TYRenderView * otherView;? //渲染乙的視圖
<1>登錄操作:
甲(UserID:401)登錄操作,返回值為是否登錄成功(非0即為成功):
-(BOOL)login{
? ? NSString * ip = @"**.**.**.**";//所需轉(zhuǎn)發(fā)服務(wù)器地址
? ? 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{
????//設(shè)置通訊中所需代理涉及到實現(xiàn)的方法下面有解釋
????[[TYVoipDarwinManager sharedVoip] setDelegate:self];
????//甲自己加入到通訊中
? ? [[TYVoipDarwinManager sharedVoip] startCallWithUserId:401];
? ? //添加節(jié)點(添加乙的USerID)
????[[TYVoipDarwinManager sharedVoip] addClientNode:402];
????//視圖渲染
????[self.preView startRendering];//渲染甲自己
????[self.otherView startRendering];//渲染乙視圖
}
<3>斷開操作
甲進(jìn)行斷開通信操作
-(void)stopVoip{
????//關(guān)閉voip
????[[TYVoipDarwinManager sharedVoip] stopCall];
????//清空現(xiàn)有的連接節(jié)點(不再接收節(jié)點的數(shù)據(jù))
????[[TYVoipDarwinManager sharedVoip] clearClientNodeList];
????//停止視圖渲染
????[self.preView stopRendering];
????[self.otherView stopRendering];
}
<4>代碼中出現(xiàn)代理方法詳解
- (void)localVideoImage:(TYVoipVideoData *)image{//甲畫面處理
????if ([self.preView isRenderring]){
? ? [self.preView renderVoipVideoData:image];//進(jìn)行甲畫面渲染
}
}
- (void)remoteVideoImage:(TYVoipVideoData *)image{//乙畫面處理
????if ([self.otherView isRenderring]){
? ? [self.otherView renderVoipVideoData:image]; //乙畫面渲染
}
}
- (void)previewAudio:(NSData *)data{//本地語音
}
- (void)mixedAudio:(NSData *)data{//其他節(jié)點語音,混音
}
項目中最重要的代碼介紹完啦酱吝,那測試一下也殖,看看我們的成果吧。
圖8? 測試效果圖
到這里务热,搭建一套完整的iOS音視頻通信系統(tǒng)就完成了忆嗜,圖鴨君在demo里實現(xiàn)了兩路通信。多路通信的原理與兩路一模一樣崎岂,小伙伴們思考一下捆毫,動手搭建多路通信吧~
文章來自:圖鴨科技團隊,轉(zhuǎn)載或交流請關(guān)注微信公眾號:tucodec