分类: IT业界
2010-11-01 15:29:35
voip是voice over ip的缩写(废话),用通俗的话来说就是通过互联网来打电话(仍然是废话,汗),用更加通俗的话来说就是一种“不花钱”打电话的技术(恩,有点意思了)。这项技术从诞生开始就充满了争议,就被各国电信运营商们视若豺狼猛兽。要弄明白voip的工作原理,先要看看电信运营商的“生财之道”:拿手机来说,对于很多人都是很神奇的────那么小的一盒子,也没个线啥的,结果就能让人们互相说话。实际上,所谓的无线仅仅是手机到基站之间那么1-2公里的范围内是无线的(对于用户密度不大的地方一个基站最大可以覆盖35公里),剩下就全部是有线的数据传输了。偶们使用互联网的时候,甲在上海,乙在北京,那么甲乙之间用qq聊天可以说是近乎“免费”的,但是如果甲和乙用手机聊天,由于使用了运营商们铺设的网络,那就要支付昂贵的长途电话费了。这恰恰是运营商的生财之道,他们把明明成本很低的异地数据通信加收了很高的费用美其名曰“长途电话费”,异地传百十来个字节的文本也变成了一条一毛五分钱的短消息。。。(其实长途电话内部的原理肯定要比这几句话复杂得多,但是为了简单起见,姑且这样理解好了)。voip技术就是想办法让语音在传输过程中不使用电信运营商的网络,直接通过几乎免费的面向大众的互联网传输。能够进行voip通信的软件很多,其中最著名的一个就是skype了,可以通过互联网让两台计算机后面的用户免费交谈,即使远隔重洋,也一样流畅和清晰。请注意,这一切都是免费的。
眼看着3G已经在国内如火如荼地发展(至于为何要并行运行那么多的 3G制式,搞那么多地重复性建设,偶在此不便妄加评论。。。国家的GDP增长了就是好事)。3G到来之后,就意味着无线上网的速度会有一个质的飞跃,普通偶们用来打电话的数据通道(gsm语音编码的声音)需要大概7-9k B/s的数据传输率就可以达到双方直接通话。在2G,2.5G的网络中,偶们可以用gprs尝试全双工的语音通信。很遗憾的是,一来gprs的速度太不稳定时快时慢(尤其是上行速度慢,下行速度快,非常不均匀);二来,移动的ggsn网关大多采用的是symmetric nat的网络地址转换类型,很难使用传统的方式进行p2p的打洞操作(呵呵,这只是困难一些,但是不代表完全不可能,感兴趣的朋友可以参考基于“端口预测 “原理的NAT打洞技术)。只有在这一点上,新联通要比移动强一点,cdma手机上网的外部地址都是类似full cone或者port restricted的nat类型,采用常规技术都可以进行p2p连接操作。
进入3G以后,手机终端处理能力和续航能力越来越强,无线上网资费不断下调,所有的迹象都表明,手机领域的voip并不是遥不可及的设想了。曾经在pc上的voip软件,为了”落地“(通俗地讲就是把互联网的 voip接入传统的固话网或移动网,再通俗一点就是用电脑里面的voip软件拨打真实世界里的电话)付出了”血“的代价,无数的voip公司死在这个上面(换位思考一下,这些公司动到了运营商们赖以生存的”蛋糕“下场自然是遭到全面封杀的下场,即使skype也难逃此劫)。voip公司希望能够做到从电脑上拨打手机、固话;那么再进一步,就是手机与手机,固话与固话通信的时候完全通过互联网,而不通过运营商的网络,成为所谓的”虚拟运营商“。这个梦做的很大,很疯狂,但由于传统的固话网络的接入限制(当然有些”能量“强大的公司,可以小规模的搞一下,但是规模绝对做不大,因为一旦被发现,就是毫无悬念的封杀),最终都是无疾而终。但是现在时代不同了(呵呵,男女都一样),进入3G以及未来的3.5G/4G以后是一个无线网络和以ip网络为主的骨干通信网络。自从手机可以上网以后,运营商对手机的控制能力已经越来越弱势,沦为”管道提供者“的下场已经不可避免(这一点可以参考目前的互联网接入服务提供商的现状,以及free wap联盟的不断发展壮大可以看出来)。当然,运营商们也不会”自甘堕落“(尽管已经很腐败很堕落了,哈哈),已经开始竭尽全力加强自己的控制力度(例如传说中的中移动主持的android项目”ophone“,以及各个运营商分别在手机终端开发上的不断发力,都反映了希望加强对手机,对用户的控制能力)。利用手机上网这个突破口,手机可以直接访问到互联网的服务器以及资源,那么传统的仅限于pc与pc之间的voip技术应用到手机上会有什么样的后果呢?是否会解决voip运营商们一直烦恼的”落地“问题呢?”虚拟运营商“的梦想是否能够实现呢?记得”狐狸“先生有句名言”二十一世纪最值钱的是什么?────人才“,哈哈,这些问题就有待it行业的人才们来解答了。
偶做了一些关于上述想法的实验,现在把结果发布在博客上,希望能够对技术的发展和进步贡献自己的一份力量。偶的实验是android上面做的(至于win mobile, symbian必然也是可以实现的,在此不再赘述),只做了一个voip的原理性验证,源代码公开所以不在做过多解释,只在必须要注意的地方点一下,点到为止。
(1)voip原理评估要做到什么?
voip是通话双方都通过网络说话的技术,因此,第一步,一定是验证“全双工”的可行性。手机是否支持一边录音,一边播放,二者同时进行;第二步,应该验证手机是否支持内存中的经过gsm编码的数据流或者直接的pcm16的数据流直接播放(因为,双方语音数据一定是在内存中保存的,如果不能够支持内存数据流直接播放,只能播放语音文件的话,那voip就肯定没戏,充其量做点简单的 ptt────push to talk类的应用罢了)。经过测试目前的主流智能手机系统(win mobile、symbian、android)都支持上述两个功能。iphone没有测试过,没舍得买。。。望有米又有技术的朋友们测试一下,把结果告诉偶一声。因此,呵呵,目前的智能手机系统都具有voip的潜力。
(2)voip实现过程中可能会遇到的问题是什么?
主要分三类,
第一类是呼叫问题,必须保持“长时间”在线,类似qq或msn之类的im一样,这样才能做到随时拨打,随时响零,在这当中的连接建立、超时、拒绝接听(不在服务区?)甚至铃声(彩铃?哈哈)。第一类问题会导致手机续航能力下降。
第二类是网络问题,无线网络不比互联网那么稳定,虽然从理论上“蜂窝”通信系统是可以实现“无缝”切换的,但是实际上对于gprs或者其它的无线网络来说(尤其是国内目前的状况,时而edge时而gprs的),不甚稳定,会有语音数据堆积问题,以及断断续续不连续的问题。这种断续的问题或许不会影响到手机上网看个网页啥的,但是一定会影响实时性较强的voip程序。
第三类是稳定问题,程序必须做到────就像我们军训教官说的“铁板一块”,呵呵,必须十分稳定,因为请记住,这个程序的目的是要取代原有的通信手段的,如果时不时死掉,导致用户的一些重要电话漏掉了,后果可是很严重喔。
(3)这篇文章希望告诉大家什么?
偶只是介绍了一下voip技术,以及偶个人的一些想法和理解。偶在android上实现了一个简单的voip可行性评估,实现了(1)中所说的那两点,全双工和内存播放。算是为android平台的voip探索开了个头,但是由于时间很紧张无法再利用jni技术把语音编码器以及相关的网络模块加上去,因此,希望我的文章可以起到抛砖引玉的作用,让对此感兴趣的朋友节省一些时间。
(4)对于源代码的一些评论?
事先声明────偶不懂java,所以这些代码只是简单扫了一眼语法胡乱写出来的。不过幸运的是还可以工作。
里面几点需要注意的地方是:
a)权限问题
AndroidManifest.xml中必须要添加:
这个权限是允许偶们录音的先决条件,大爷的,只前做实验的时候没有加,血泪教训阿。。。
b)代码结构
太简单了,三个类,一个是AudioTest.java是基本的一个activity;AudPly.java用于播放音频数据;AudRec.java用于播放音频数据,这些都是线程类,需要同时开始的,有AudioTest.java统一进行协调和管理,例如初始化啥的。基本思路是打开两个线程,一个线程采集音频pcm16数据,把数据保存在一个队列里面,另外一个线程负责播放音频数据,只要队列里面有数据就给播放出去。java中什么都是对象。。。偶用的比较笨拙一些,不过能够工作就不管那么多了。运行程序的时候最好佩带上耳机,否则播放出来的声音又会被马上录制回手机,导致回音问题以及噪声放大。
实实在在做人,踏踏实实做事。