有个需求,就是从flash直接拨打到电话或手机上。
可以分解成几步:
1 flash之间语音通话, 这个比较简单,flex red5就可以了。
2 电话网络(pbx)和internet的连接,采用语音网关,一般使用asterisk板卡。
3 使用
使用asterisk板卡自然少不了使用asterisk。
4 使用asterisk,在internet上通话自然是用323,sip或iax2。sip使用最广,这里采用之。
5 还差一点就全通了:flash与sip之间的通话,难点也在这里。
实现这个需求的基本前提:
上面的1-4,是基础技术条件,不熟悉的先复习一下,因为资料多,只要努力,很快就能掌握。
flash与sip通话再细分,又可分两部分:一是指令,二是媒体,下面分别说一下.
一 指令:
也可以有两种方式
a sip是一组udp实现的文字描述指令,flash本身也可以进行udp编程,所以,可以直接用flash写sip, 参见开源项目red5phone。
b 采用xmpp协议。flash上有个很好的客户端,spark_xmpp(大致是这个名字),直接就可以使用。sip客户端加上一个xmpp协议支持库,就可以指令通话了。
ab两个方案比较:
a 简单,但相对不太安全,需要把sip server暴露出来。另外,sip的协议在传消息方面不如xmpp,如果用户不进行语音通话,只发消息,或发个文件,sip表示很为难。
b flash端编程简单,客户端需要写一点xmpp功能。不过采用gloox做协议栈,也就是一两天的工作量。
所以,这里选择了b方案。(sip里面增加 xmpp功能,可参考 http://blog.chinaunix.net/uid-15063109-id-3603071.html)。
指令的流程:flash呼叫用户a,在xmpp上发出指令,客户端收到后,通过sip通道呼叫到pbx外线上。
反过来,sip收到外线呼叫,再通过xmpp通知flash客户。表面上看是im通话,底层是voip了。
二
说完指令,下面再说说媒体的流程。说到媒体的流程,表示sip的指令媒体分流,实在是不太方便。sip指令是一个udp通道,媒体采用rtp传输,另启一个端口,有时还要加一个rtcp。
rtmp相对好一些,一个tcp通道传所有内容,不过,关于这个rtmp, 引用众多网友的话,统一口径"ni da ye的adobe"。rtmp复杂点没关系,你文档写清楚点不行啊。不过,在这里,建议还是多看看radobe的文档,独痛痛不如众痛痛。
不说协议了,只说实现:
sip的客户端,使用librtmp接收rtmp媒体流,这里flash 指定的是speex 8000格式,然后转码成711,a或u,然后传给rtp的媒体流。
同时,sip的客户端,收到rtp媒体流后,解码再转成speex,使用librtmp传到red5上。
虽然flash支持多种语音格式,在实际开发过程中,经过反复反复的试验,还是speex最好。另外,speex的编解码最好直接用libspeex,不要用ffmpeg了。
顺便再说一下sip的客户端实现,虽然市面上的软电话产品已经非常多了,但都藏着掖着的,当然可以理解,和通信沾边的东西都能带来直接收益。
这里推荐一下,如果是第一次开发sip客户端产品,请使用pjsip,切记,其他的看都不要看,别浪费太多时间,直接看pj,调试,绝对地磨刀不误砍柴功。
流程懂了,程序就很好做了:
1 使用pjsip开发个sip客户端,支持多账号同时登录。
2 购买语音卡,设置asterisk, 使sip客户端呼叫到外线(没这需求可以省掉这一步)。
3 sip客户端集成gloox,可以与flash进行xmpp通话。
4 sip客户端集成librtmp,可以接收和发送rtmp媒体流。
5 sip客户端集成libspeex,进行speex语音编解码。至于711的编解码,网上可以下载到文件,只有一个.c,pjsip里面也有。
rtmp和sip客户端,也可以做成两个,如果是linux,使用unix domain socket通信,windows下,就直接用udp吧。共享内存什么的也可以,就是一个简单的进程间通信。
另外再补充一下:sip客户端是直接采集声卡发送,接收到送到声卡播放。所以,要做到与rtmp对接,就要截获这两个媒体流。再次感谢pjsip,代码极其清晰,修改极其简单,找准位置,几行代码把声音传入或回调传入就可以了。(具体位置在sound port 里面)。
流程先说到这,有时间再整理一下代码发上来。
阅读(4823) | 评论(1) | 转发(0) |