freeswitch两个DTMF转换接口的区别

 

概述

freeswitch支持三种模式的DTMF传输方式,分别时inband、INFO、2833。

在传统的PSTN网络中,所有的DTMF码都是inband模式,所以VOIP网络和PSTN网络对接中,需要将DTMF码做格式转换,通常是2833和inband之间的转换。

环境

centos:CentOS  release 7.0 (Final)或以上版本

freeswitch:v1.10.7

GCC:4.8.5

inband到2833的两个接口

freeswitch中有两个inband到2833格式的转换接口,分别是“start_dtmf”和“spandsp_start_dtmf”。

两个接口的功能是一样的,都是检测inband中的DTMF按键波形。

<action application="start_dtmf" />

<action application="spandsp_start_dtmf"/>

 

fs官方的描述中已经有明确说明,“start_dtmf”接口为老版本接口,尽量使用“spandsp_start_dtmf”来实现业务。

那么,这两个接口有什么区别呢。

start_dtmf测试

配置dialplan拨号计划如下。

<include>

       <context name="out2in">

              <extension name="sbc-out2in" continue="true">

                     <condition field="destination_number" expression="^(\d+)$">

                            <action application="export" data="nolocal:execute_on_media=start_dtmf" />

                            <action application="bridge" data="{sip_invite_call_id=${sip_call_id}

                                 }sofia/external5066/sip:${destination_number}@10.55.55.138:5090"/>

                     </condition>

              </extension>

       </context>

</include>

  

 

从截图中,可以看出。

start_dtmf接口有识别出inband中的DTMF码,并转换为2833到A路。

但是红框中的媒体流中的DTMF波形并没有任何变化。

A路收到的媒体流中,既有inband的DTMF波形,也有2833的DTMF码。

spandsp_start_dtmf测试

配置dialplan拨号计划如下。

<include>

       <context name="out2in">

              <extension name="sbc-out2in" continue="true">

                     <condition field="destination_number" expression="^(\d+)$">

                            <action application="export" data="min_dup_digit_spacing_ms=40"/>

                            <action application="export" data="spandsp_dtmf_rx_threshold=-42"/>

                            <action application="export" data="spandsp_dtmf_rx_twist=8"/>

                            <action application="export" data="spandsp_dtmf_rx_reverse_twist=6"/>

                            <action application="export" data="spandsp_dtmf_rx_filter_dialtone=true"/>

                            <action application="export" data="nolocal:execute_on_media=spandsp_start_dtmf" />

                            <action application="bridge" data="{sip_invite_call_id=${sip_call_id}

                                 }sofia/external5066/sip:${destination_number}@10.55.55.138:5090"/>

                     </condition>

              </extension>

       </context>

</include>

  

 

从截图中,可以看出。

spandsp_start_dtmf接口有识别出inband中的DTMF码,并转换为2833到A路。

同时,红框中的媒体流中的DTMF波形被过滤掉了大部分,遗留部分的波形大概有30ms左右,当A路设备(如TG)会同时检测2833和inband时,仍然有概率会发生重码的问题。

A路收到的媒体流中,有2833的DTMF码,和少量inband的DTMF码波形。

总结

freeswitch的“spandsp_start_dtmf”接口,表现更好,功能性更完整。

freeswitch的DTMF从inband转换为2833的功能仍然有缺陷,表现为inband中的波形过滤不完全,会造成后续节点识别DTMF时重码的问题。

后续我们再研究如何解决该问题。

 

空空如常

求真得真

posted @ 2023-05-11 17:30  求真得真  阅读(269)  评论(0编辑  收藏  举报