付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】PigeonCall:一款AndroidVoIP网络电话App架构分析
1.概述PigeonCall,中文名“飞鸽电话”,是一款Android平台的VoIP网络电话应用,但只工作于局域网,支持给任意局域网内使用该App的其他用户拨打网络电话,可以在各大应用市场下载安装,也可以直接点击这里直接下载。本应用是我利用了断断续续将近大半年的业余时间开发出来的,目的是想研究一下Android平台的P2P语音传输技术,开发过程中重构了很多次,也尝试了很多不同的方案,本文则是对此的一个总结,从宏观上分析了整个应用的架构和所涉及到的技术,欢迎持续关注本博客,后续有时间会慢慢分享更多的细节。2.需求分析2.1
功能定义本应用支持的功能如下所示:(1)运行于Android平台(2)自动搜索和显示局域网内的其他用户(3)支持拨打电话和来电提醒(4)通话过程流畅清晰无卡顿,低延时2.2
性能指标ITU-TG.114规定,对于高质量语音可接受的时延是300ms。一般来说,如果时延在300~400ms,通话的交互性比较差,但还可以接受。时延大于400ms时,则交互通信非常困难。2.3
开发难点(1)低延迟,语音通话对延时非常敏感(2)降低噪声、回声消除,静音检测(省流量)(3)无服务器,去中心化,全双工P2P通信3
软件架构整个软件分为四大模块:AndroidUI,VoipSdk(主控模块),设备发现与通话协议,语音编解码与传输模块,语音采集与输出模块,如图所示:3.1
AndroidUI(平台相关,采用Java开发)AndroidUI主要有2个界面,一个是MainAcitivity,以列表的形式显示当前局域网内的所有其他用户,另一个则是电话拨打/接听界面,当用户点击拨打电话或者收到来电时显示。为了保证App进入后台依然能够收到来电消息,因此需要开启一个Service服务,该服务封装了整个应用最核心的逻辑和接口,包括:搜索局域网内其他用户、拨打电话、监听来电、语音传输等等。UI界面如下所示,由于没有美工,自己设计的界面不是很协调和美观,这个后期再慢慢改进吧:3.2
设备发现与通话协议(平台无关,采用C++开发)这一模块我研究和尝试过三种方案,分别介绍如下:3.2.1
成熟的UPnP框架UPnP框架天生就是为对等网络连接(P2P)的结构设计的,可用于局域网之间的设备发现、远程服务调用。官方提供了各种实现了该协议框架的第三方库,可以快速实现设备发现功能。UPnP协议规定,每个UPnP设备节点通过组播来发送设备描述、服务描述(XML文档),网络中的其他节点即可知道对方的信息,以及所提供的服务,因此,我们需要设计一套简单的通话协议的“服务描述”XML文档,包含:MakeCall、CancelCall、AcceptCall、RefuseCall、EndCall等命令,这样,其他的设备节点即可通过"RPC"远程过程调用的方式,实现通话的请求和响应过程。这就是采样UPnP方案的基本思路,我采用UPnP官网提供的"PlatinumKit"库实现了这套功能,后来发现本应用并不需要搞得如此复杂,没必要引入UPnP框架,因此又自己编写了一套更加简单的方案。3.2.2
SIP协议SIP协议被广泛用于VoIP网络通话,但是更多地用于面向广域网的语音电话应用场景,它需要一个SIP网络服务器的参与,该网络服务器负责各个SIP终端之间的会话建立、维护和终止。本应用是局域网内的P2P网络电话,去中心化,并不需要"服务器"的存在,因此并不适合采用SIP协议。3.2.3
自定义设备发现与通话协议基于上述考虑,最终我选择了自己来写一套简单且满足本应用场景的设备发现与通话协议。首先,协议的网络传输部分采用UDP组播,相比与广播包,对本地局域网的影响更小。其次,采用二进制格式的协议,相比于XML、JSON等格式,效率更高,占用带宽更少。本协议采用“T-L-V”链接格式,每个组播包由一个或多个“T-L-V”子包链接而成,示例如下:当前协议中已存在的子包如下所示:每一个Device都有一个唯一的Id值,由SourceId和TargetId的值决定该组播包的发送者和目标接受者,当TargetId==0的时候,代表该组播包是发给所有人的。由PacketId决定此包的种类,不同种类的包有着不同的optional子包,例如:DeviceInfo包是当前唯一发给所有人的组播包,用来通知局域网内其他对象自己的设备名称和IP地址,目前的设计是默认每个5秒钟发一次,超过10s未收到包则认为该设备已掉线。具体协议实现的过程中,“T-L-V”协议部分,采用了我自己编写的开源库(TLV编×××),可以快速实现多个“T-L-V”格式的序列化与反序列化,而多播的部分则可以参考我的clib库:multicast。3.3
语音编解码传输模块(平台无关,采用C++开发)3.3.1
概述一个完整的语音数据流图如下所示,从采集到远端播放,需要经过多项处理,包括:回声消除、去噪、编码、网络传输、解码等等,本模块就是负责实现音频数据的"编解码和网络传输"部分。3.3.2
编解码一套双声道数字音频若取样频率为44.1KHz,每样值按16bit量化,则其码率为:44.1kHz*16bit*2=1.411Mbit/s对于网络电话应用,语音传输是双向的,因此上述码率还要乘以2,可见其数据量还是蛮大的,因此,必须进行编码压缩之后再通过网络进行传输,这样才能达到更好的通话效果。Opus是一个有损声音编码的格式,通过诸多的对比测试,低码率下Opus完胜曾经优势明显的HEAAC,中码率就已经可以媲敌码比它率高出30%左右的AAC格式,而高码率下更接近原始音频。因此非常适合作为VoIP语音电话首选的压缩格式。其官方网站:,该网站上提供了基于C语言的编解码库,可以很容易地移植到其他平台。3.3.3
网络传输网络传输协议可以选择TCP、UDP或者RTP,像TCP这样的可靠传输协议,通过超时和重传机制来保证传输数据流中的每一个bit的正确性,从而带来了明显的延时,因此并不适合作为音视频传输的首先方案。关于TCP与UDP/RTP的讨论,网上资料很多,在此不再赘述,有兴趣的朋友也可以看看我的这篇《为什么要使用RTP》来了解一下RTP协议的种种好处。本应用中,既可以采用RTP协议,也可以简单地采样UDP来完成语音数据的网络传输,如果采样RTP协议,则可以考虑常见的RTP库,包括:Jrtplib和ortp,前者是C++开发,后者采用C语言开发,都很不错,我最后实现了两个版本,一个是采用ortp,另一个是采用udp,其实,如果不做RTCP控制的话,还是采用udp更加简单点。3.3.4
去噪和回声消除去噪和回声消除也是语音电话非常重要的一部分,必须得做,否则你会发现做出来的应用根本无法使用,噪音、嗞嗞声和回声影响实在是太大了,这也是做语音开发的难点所在,对噪声、回声、延时超级敏感,想做好,还需要下一番很大的功夫。本应用采用了著名的Speex库来完成去噪和回声消除,它接口非常简单易用,目前效果还不够好,估计它的详细配置我还研究得不够,以后还需要继续研究研究,慢慢优化通话效果。3.3.5
语音采集输出模块(平台相关)Android语音的采集和输出有两种方案,第一种方案是采用AndroidSDK提供的Java端的API,即MediaRecoder类(采集)和AudioTrack类(播放)来完成,第二种方案则是采用AndroidNDK提供的AndroidOpenSLES接口,在Native层直接完成语音的采集与输出。两种方案我都尝试过,最后决定采用AndroidOpenSLES方案,因为不需要频繁在Java和Native层直接传递数据,无论是代码的编写还是程序运行的效率,优势都非常明显。有一个老外,VictorLazzarini,封装了一套OpenSLES的API,非常好用,可以作为参考,地址点击这里。4.
小结限于篇幅,本文只是简单列出了本应用的一些关键的设计和方案,并没有完全详细地展开,真正着
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖南郴州市第一人民医院招聘58人备考题库及答案详解【网校专用】
- 2025吉林省吉林大学材料科学与工程学院郎兴友教授团队博士后招聘1人备考题库及答案详解(典优)
- 2026广东警官学院招聘事业单位人员5人备考题库带答案详解(培优b卷)
- 2026广东汕头大学医学院第一批招聘6人备考题库附答案详解(典型题)
- 2026湖北长江产业资产经营管理有限公司所属企业招聘12人备考题库及答案详解【夺冠系列】
- 2026浙江师范大学行知学院招聘辅导员9人备考题库及1套参考答案详解
- 2026广东湛江市雷州供销助禾农业科技服务有限公司招聘5人备考题库附答案详解(精练)
- 2026广东广州市白云区嘉禾街道综合事务中心合同制聘员招聘7人备考题库带答案详解(研优卷)
- 2026江苏保险公司销售人员招聘备考题库带答案详解(培优a卷)
- 2026江苏保险公司销售人员招聘备考题库附参考答案详解(达标题)
- 2026年电网大面积停电应急演练方案
- 2026 年浙江大学招聘考试题库解析
- 2026上半年北京事业单位统考大兴区招聘137人备考题库(第一批)及参考答案详解【考试直接用】
- 2026年湖南省长沙市高二下学期第一次月考化学模拟试卷02(人教版)(试卷及参考答案)
- 2026年山西经贸职业学院单招综合素质考试题库附答案详解(综合题)
- GB/T 5796.3-2022梯形螺纹第3部分:基本尺寸
- GB/T 3280-2015不锈钢冷轧钢板和钢带
- GB/T 14983-2008耐火材料抗碱性试验方法
- GA 576-2018防尾随联动互锁安全门通用技术条件
- 2023年同等学力申硕法语真题答案
- 卓越教育学管师工作标准手册
评论
0/150
提交评论