Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1243356
  • 博文数量: 76
  • 博客积分: 1959
  • 博客等级: 上尉
  • 技术积分: 2689
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-19 12:07
个人简介

樽中酒不空

文章分类

全部博文(76)

文章存档

2020年(4)

2019年(1)

2017年(2)

2016年(2)

2015年(7)

2014年(11)

2013年(13)

2012年(18)

2011年(2)

2010年(16)

分类: C/C++

2013-04-19 17:53:55

有个需求,就是从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 里面)。

流程先说到这,有时间再整理一下代码发上来。



阅读(4893) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

sxcong2013-04-19 17:57:27

为了这个破流程,整整痛苦了一周的时间,最后总算调通了。唯一的感想就是 "Ni Da Ye的Adobe"。