美文网首页iOS音视频开发iOS Developer
如何搭建视频通信系统之iOS篇

如何搭建视频通信系统之iOS篇

作者: Tucodec图鸭科技 | 来源:发表于2018-01-19 14:46 被阅读179次

音视频通信是近几年互联网应用的一个新领域,其应用极其广泛,我们常见的视频电话、会议系统和连麦直播等都是视频通信的具体应用。在移动互联网飞速发展的今天,各种应用都渴望加入视频通信的功能,实现用户与企业,用户与用户之间的音视频交流。

于是问题出现了,开发一个视频通信系统需要什么技术储备?市场上又有哪些可以免费使用的iOS视频通信系统呢

一、搭建视频通信系统所需技术储备:

构建视频通信系统是一项综合了数据采集、处理和显示技术,数据压缩编解码技术和网络传输技术的系统性工程。而一个基础的视频通信系统过程主要包含以下几点:

1. 数据采集技术:高效及时地获取到高质量的原始数据

例如:在实时视频通话应用中,对采集到的音频一般要经过预处理,主要有滤除背景杂音、检测并消除回音等。

2. 数据压缩技术:整个视频通信系统中的核心技术

由于原始视频的数据量非常大,如果不经过压缩,将会给传输和存储带来极大的压力,这就需要高效的视频编码技术在传输带宽限制下尽可能保持高质量,或者在质量相等情况下,获得尽可能高的压缩率

在低延时的业务中,对压缩速度的要求也非常高。比如要达到每秒20帧的帧率,就要求压缩每一帧的时间低于50毫秒,同时还要兼顾到压缩的性能。目前主流的视频编码标准H.264/AVC,可以获得不错的性能与速度的折中。

3. 网络传输技术:视频通信系统的关键技术

压缩后的数据需要根据合适的网络传输协议打包,再经过网络传输到接收端,接收端再根据网络协议解析出压缩数据。根据业务类型以及传输数据的类型,需要选取不同的传输协议。最常用的两种是传输控制协议TCP和用户数据包协议UDP:TCP是面向连接的可靠传输协议,但是延时相对较大;UDP是无连接、不可靠的传输协议,但是延时相对较小

在实际的使用中,不同的业务有不同的需求,需要结合业务本身进行合理设计。

4. 多媒体数据的解码播放:视频通信系统的最后一步

保证音画同步,避免花屏是视频解码的关键。因此解码时,需要根据解码标准检测是否丢失了数据,对解码失败的视频帧采取不予显示或请求重发等措施,避免出现不完整解码帧,也就是花屏。同时对音视频的播放,要根据时间戳进行同步播放,否则会极大地影响用户体验。对于解码得到的音频,往往要经过滤波、自动增益等处理,从而得到圆润而不刺耳的声音效果。当然,在多人通信中,首先还要对多路音频进行混音。

说完所需技术后,接下来,我们就来介绍一下目前市场上两家免费的音视频通信系统,以及利用他们如何搭建属于自己的音视频通信。

二、免费的音视频通信系统

 Webrtc 

webrtc是谷歌在2011年开源的网页实时通信协议,现已成为实时通信行业标准,阿里云七牛云等都以webrtc为基础,搭建了自己的实时通信协议。若想要webrtc搭建一套ios音视频通信,步骤如下:

首先我们需要去官网下载iOS版本的源码,并且对其进行编译,源码大小差不多在6个多G,编译的过程也会遇到许多困难,最终形成的webrtc的.a库大概有300多M。

1.安装环境

系统环境:Mac OS

网络环境:准备好稳定的VPN工具

2.安装git

http://www.cnblogs.com/ccdev/archive/2012/09/12/2682098.html

3.安装depot_tools

创建一个目录专门来存放项目编译工具和项目代码仓库等,确保该目录所在磁盘可用空间至少有8~10G.打开系统的终端工具:

mkdir webrtc_build

在执行下面命令之前,请确保你已经连上VPN已经FQ了,或者你已经给git单独配置了有效的socksFQ代理。开始安装depot_tools,这是一套Google用来编译Chromium或者WebRTC的构建工具,在我们后续的编译过程中也将使用它。

a. cd webrtc_build

b.  git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

c.  把depot_tools 设置到PATH中:echo "export PATH=$PWD/depot_tools:$PATH" > $HOME/.bash_profile

d.  使PATH设置生效:source $HOME/.bash_profile

e.  echo $PATH查看设置是否生效。

4、获取WebRTC源码

在我们的编译工作目录webrtc_build下创建一个webrtc子目录来存放代码:

mkdir webrtc

cd webrtc

开始把WebRTC项目的代码仓库下载一份到本地来,由于其仓库之大,大约一共需要下载6G+的东西,所以这一步非常需要有耐心,而且需要有稳定无障碍的互联网

a. 设置要编译的平台到环境变量中:export GYP_DEFINES="OS=ios"

b.  fetch --nohooks webrtc_ios

c.  gclient sync

c步骤,也可以使用gclient sync -r eeab9ccb2417cab18ae1681c6644c25fa4eadcd3指定版本,注意:eeab9ccb2417cab18ae1681c6644c25fa4eadcd3为版本号。获取版本号方式为:

a. 进入[WebRTC](https://webrtc.org/native-code/ios/)官网

b. 点击上方About->Release Notes

c. 选择想要下载的版本,例如M59,进入如下页面

d. 点击WebRTC M59 branch后

e. 选择第一行,进入如下页面

现在即可见到版本号eeab9ccb2417cab18ae1681c6644c25fa4eadcd3

注意:fetch --nohooks webrtc_ios 和 gclient sync这一步需要等待很久。

5.编译WebRTC

源码下载好了,现在目录结构如下图:

这些源码可以编译为好几个平台,OS X、Linux、 Windows、Android、iOS等。这里我们只需要编译iOS平台的WebRTC,并制作成一个iOS的开发框架,我们需要在终端命令行环境下去搞定这一切。

5.1设置构建配置,分环境编译

a. 进入WebRTC源码文件:cd src

b.  根据需要编辑构建配置,编译iOS系统,设置为target_os="ios",编译iOS真机,target_cpu为"arm"或"arm64",编译iOS模拟器,target_cpu="x64",如:

gn gen out/ios_64 --args='target_os="ios" target_cpu="arm64"'

gn gen out/ios_sim --args='target_os="ios" target_cpu="x64"'

c.  开始编译:ninja -C out/ios_64 AppRTCMobile

编译后,得到arm64下的WebRTC.framework,目录结构如下图:

5.2使用脚本,自动编译

在我们下载的源代码中有一个编译脚本,还是以我们下载的M59版本为例,其位置在src/tools_webrtc/ios/build_ios_libs.sh,直接执行这个脚本就能编译出需要的库文件了。编译后目录结构如下图:

图中选中的WebRTC.framework为包含arm64、arm、x64环境的库,如果需要具体环境下的WebRTC.framework,进入相应文件夹选择。

6.使用WebRTC.framework注意事件

将WebRTC.framework导入工程后,运行会报错:

dyld: Library not loaded: @rpath/WebRTC.framework/WebRTC

Referenced from: /Users/MFJun/Library/Developer/CoreSimulator/Devices/4441D192-28A0-46AF-9CA9-C8945BB3442C/data/Containers/Bundle/Application/34E51961-4516-4478-AA59-579342D8D3A5/WebScoketTest.app/WebScoketTest

Reason: image not found

仔细看错误原因,是没有找到framework文件包,解决方法是:

TARGETS -> Build Phases -> New Copy Files

接着再点击下面+号,选择自定义的framework

在arm64的环境下,运行会报错

把TARGETS -> Build Settings -> Enable Bitcode设置为NO

接下来,Build Success!

(关于webrtc的编译方法来源简书MFJun,,完整链接为:https://www.jianshu.com/p/64bd7f5b18b1)

说完webrtc,接下来给大家介绍另一套免费的音视频通信系统

Tucodec

tucodec是图鸭科技开发的一套音视频通信系统。其VoIP SDK已免费提供给用户,服务器的源代码和客户端网络模块代码也已开源。我也简单介绍一下如何用其搭建iOS音视频通信:

1、准备:

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

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

最后解压,如下图所示:

1.1、解压voipDemo.zip,如图4所示:

把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库的时候,需要导入下面这些框架:

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

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

在图鸭科技提供的SDK中,我们可以看到对外只有两个头文件,可见快速集成音视频通信并不是那么复杂。如图7所示:

2、头文件定义:

2.1、TYVoipDarwinManager.h文件,该文件定义了对外提供的类和协议。以下3个是该文件中核心类与协议。

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

(2) TYVoipVideoData : 接收以及发送视频数据模型

(3) TYVoipDelegate : VoIP的代理

2.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>根据具体的业务逻辑重复步骤3、4、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{//其他节点语音,混音

}

测试效果如图:

(关于tucodec的编译方法来源简书Tucodec图鸭科技,完整链接为:https://www.jianshu.com/p/5c435b41b7e3)

Tucodec是17年才步入到观众视野的音视频通信系统,相比webrtc,其稳定性相比稍弱,但是延时更低,编译难度也更低。总之,是一款可以直接进行接入测试的音视频通信系统。

 三:两款软件的优劣

Webrtc和tucodec作为两款免费音视频通信项目,其在技术的差别没有多大,主要是实际应用中的问题,webrtc的源码太多,编译难度大;Tucodec门槛低难度小但是开发文档不够完善。

其实作为免费的音视频通信项目,存在这些瑕疵是在预期类的。大家在选择具体使用的时候,还是要根据具体的使用场景来选择。

相关文章

网友评论

    本文标题:如何搭建视频通信系统之iOS篇

    本文链接:https://www.haomeiwen.com/subject/ugvooxtx.html