根据我们的产品,写了一个教程手把手教你搭建视频通信系统(iOS 篇) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
juice123
V2EX    分享创造

根据我们的产品,写了一个教程手把手教你搭建视频通信系统(iOS 篇)

  •  
  • &nbs; juice123 2018-01-10 20:56:04 +08:00 2570 次点击
    这是一个创建于 2838 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在市面上有许多音视频通信软件,比如 Facetime。你是否想过开发一款独属于自己的音视频通信软件?在 iOS 开发中,音视频通讯开发一直比较困难:昂贵的开发成本、较高的技术门槛让很多开发者和公司望而却步。

    今天图鸭君就和你说一下,如何从 0 开始,搭建一个完整的 iOS 音视频通信系统。文中涉及的服务器配置问题,可以到图鸭官网查看相关文档。

    一、准备:

    首先在图鸭官网: http://tucodec.com 进行注册,获得 SDK 中所需要的 AppKey、AppSecret,

    其次到开发者里选择下载 iOS 中所需 SDK。

    最后解压

    解压 voipDemo.zip:

    把 TYVoIPiOSSDK.framework 拿出来,该 framework 即为图鸭音视频 SDK,导入到所需的 iOS 项目中,有时候导入 framework 工程没有自动添加该 SDK 的 framework 路径,检查方法:target >Build Settings >Search Path,在 Framework Search Path 中加入 TYVoIPiOSSDK.framework 的路径。由于 SDK 是与 C++混编的,所以只要使用到 SDK 中文件的 .m 文件都需要改成 .mm 后缀名。

    在使用 TYVoIPiOSSDK.framework 库的时候,需要导入这些框架:

    完成上述操作后,我们的音视频通讯 App 所需的大体框架已经完成啦。

    之后就是码代码,完成系统 UI 界面绘制和用户之间通讯的逻辑操作。

    在图鸭科技提供的 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{//其他节点语音,混音

    }

    项目中最重要的代码介绍完啦,那测试一下。

    到这里,搭建一套完整的 iOS 音视频通信系统就完成了,图鸭君在 demo 里实现了两路通信。多路通信的原理与两路一模一样,小伙伴们思考一下,动手搭建多路通信吧~

    1 条回复    2018-01-11 09:58:27 +08:00
    jinly
        1
    jinly  
       2018-01-11 09:58:27 +08:00
    好像不是很难的样子,搭建一下试试~
    关于     帮助文档     自助推广系统     博客   API     FAQ     Solana     2545 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 02:20 PVG 10:20 LAX 19:20 JFK 22:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86