从模拟信号变成数字信号的过程称为模数转换(Analog Digital Convert,AD)。AD转换要经过采样、量化、编码三个过程。编码(Code)就是指按照一定的规则将采样所得的信号用一组二进制或者其他进制的数来表示。经过编码后的数据便于在数字网络上传输,到达对端以后,再通过解码(Decode)过程变成原始信号,进而经过数模转换(Digital Analog Convert,DA)再恢复为模拟量,即转换为人们能够感知的信号。
一般来说,编码与解码过程都是成对出现的,所以习惯上人们把它们合起来说,称为编解码(Codec),即Co(de)与Dec(ode)的合成写法,但有时候为了方便,也简称为编码,如我们常说的音频编码或视频编码。
在FreeSWITCH中,编码名称的格式为“名称@xxh@yyi”。其中h代表Hz,即采样频率;i则代表ptime,即打包间隔;xx和yy分别代表实际的数值,如speex@16000h@20i表示16000Hz、20ms的Speex编码。
以下编码由于专利原因,只支持透传
查看freeSWITCH支持的编码
1 | freeswitch> show codec |
音频编码最基本的两个技术参数就是采样频率和打包周期。
采样频率越高,声音就越清晰,保留的细节就越多,当然它会占用更大的带宽。对于普通“人声”通话来讲,8000Hz就够了,但对于高品质的音乐来讲,就需要更高的采样率才能保证“悦耳”,比如我们通常说的CD音质的声音使用的就是44.1kHz的采样率。
打包周期跟传输有关,打包周期超短,延迟越小,相对而言传输开销就会越多,因而需要更大的带宽;打包周期超长,带来的延迟就越大,如果传输过程中有丢包,对语音质量的影响也就越大。大部分编码都支持多种打包周期,最常见的是20ms,iLBC、G.723等默认使用30ms,更长的打包周期如60~120ms,通常用于卫星链路等高延迟、低带宽的场合。
协商时机与策略
FreeSWITCH的协商可分为早协商和晚协商。当呼叫到达一个SIP Profile时,即某端口收到INVITE请求而未到达路由阶段时,就先行协商的,称为早协商。而如果等到路由阶段,到达拨号计划时再进行协商的,称为晚协商(Later Negotiation)。通过使用晚协商,用户可以有更多的自由去确定协商策略。
系统默认为晚协商,如果要使用早协商,可以在SIP Profile中设置以下参数
1 | <param name="inbound-late-negotiation" value="false"/> |
这里需要注意的是,如果启用了inbound-zrtp-passthru(默认),则隐含设置inbound-late-negotiation为true。
FreeSWITCH支持如下协商策略:generous、greedy和scrooge。
我们先看generous(普通的),它是默认的协商策略。假设客户端提供的编码列表为PCMA、G729,而FreeSWITCH支持的列表优先顺序为G729、PCMU、PCMA。那么当FreeSWITCH收到请求时将优先考虑客户端的感受,因而优先使用PCMA编码。
如果协商策略设为greedy(贪婪的),则上面的例子中FreeSWITCH会优先考虑自己的编码,因而会选择G729。
如果设置成scrooge(吝啬的),则FreeSWITCH会更加强势,它除了具有greedy所有的特性外,还将强制使用自己的采样率。
上面提到的是UA跟FreeSWITCH进行单腿协商的情况。我们总是提到FreeSWITCH是一个B2BUA。在预计通话会有两条腿的情况下,启用晚协商会得到更好的效果。比如,在SIP Profile中设置disable-transcoding为true时,FreeSWITCH将首先呼叫bleg,并仅Offer aleg提供的编码,从而可以避免转码,以节约CPU资源。
RTP和RTCP
RTP协议的全称是Real-time Transport Protocol,即实时传输协议,它是由IETF的多媒体传输工作小组在RFC 3550 中定义的。RTP协议详细说明了在互联网上传递音频和视频的标准数据包格式。它一开始被设计为一个多播协议,但后来被用在很多单播应用中。RTP协议是建立在UDP协议之上的,常用于流媒体系统、视频会议和一键通(Push to Talk)系统(配合H.323或SIP),它已成为IP电话产业的技术基础。
实时传输控制协议(Real-time Transport Control Protocol或RTP Control Protocol,RTCP)是实时传输协议(RTP)的一个姊妹协议,前者由RFC 3551定义。RTP使用一个偶数UDP端口,而RTCP则使用RTP的下一个相邻的奇数端口。RTCP除为RTP媒体流提供信道外(out-of-band)的控制。RTCP本身并不传输数据,但会和RTP一起协作将多媒体数据打包并发送出去。RTCP定期在多媒体会话参加者之间传输控制数据。RTCP的主要功能是为RTP提供的服务的质量(Quality of Service)提供反馈信息。RTCP收集相关媒体连接的统计信息,例如传输字节数、传输分组数、丢失分组数及拉动(jitter)、单向和双向网络延迟等等,网络应用程序即可利用RTCP的统计信息来控制传输的品质,比如当网络拥塞比较严重时,可以限制信息流量或改用压缩率较高的编解码器。
NAT穿越
NAT的全称是Network Address Translation(网络地址转换),它最初是为了克服IPv4网络地址不足出现的一项技术。
NAT种类
静态NAT(Static NAT)
动态地址NAT(Pooled NAT)
网络地址端口转换(Network Address Port Translation,NAPT)
Full Cone NAT(全锥型NAT)
内部主机向外打了一个洞,外网的任何主机都可以利用这个洞与它通信。
Restricted Cone NAT(限制锥型NAT)
内部主机向某一外部主机打了一个洞后,只有该外部主机才能利用这个洞 。
Port Restricted Cone NAT(端口限制锥型NAT)
内部主机向外部主机上一某一程序(一个端口)打了一个洞,则只有该程序可以利用这个洞,其他的不行 。
Symmetric NAT(对称型NAT)
对同一内部主机联系不同的外部主机时都需要打不同的洞。