概述

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时重码的问题。

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

空空如常

求真得真

freeswitch两个DTMF转换接口的区别的更多相关文章

  1. 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?

    当你看见这个标题的时候,你可能会下意识的去想一下,这两种方式到底有什么样的区别呢? 且看下面的demo,自然便区分开了 /** * */ package com.b510.test; /** * Pr ...

  2. UI:字典的两种取值的区别

    字典的两种取值的区别 (objectForKey: 和 valueForKey )参考 一般来说 key 可以是任意字符串组合,如果 key 不是以 @ 符号开头,这时候 valueForKey: 等 ...

  3. Android(java)学习笔记227:服务(service)之服务的生命周期 与 两种启动服务的区别

    1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...

  4. form表单中get和post两种提交方式的区别

    一.form表单中get和post两种提交方式的区别? 1.get提交表单中的内容在链接处是可见的.post不可见 2.post相比于get是安全的 3.post不收限制大小,get有限制大小(黑马视 ...

  5. iOS学习——UITableViewCell两种重用方法的区别

    今天在开发过程中用到了UITableView,在对cell进行设置的时候,我发现对UITableViewCell的重用设置的方法有如下两种,刚开始我也不太清楚这两种之间有什么区别.直到我在使用方法二进 ...

  6. Python 中格式化字符串 % 和 format 两种方法之间的区别

    Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...

  7. 网站开发进阶(六)JSP两种声明变量的区别

    JSP两种声明变量的区别 在JSP中用两种声明变量的方法,一种是在<%! %>内,一种是在<% %>内.他们之间有什么区别呢?我们直接看一个JSP文件来理解. 代码如下: &l ...

  8. nuxt框架Universal和Spa两种render mode的区别

    如下图,官网上对于Universal 和 Spa 两种render mode的区别,并没有加以说明,相信大多数人跟我一样有点懵,不知道选什么好.虽然两个模式创建的项目看不出区别. 先给出推荐选项: U ...

  9. Java中String对象两种赋值方式的区别

    本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...

  10. LR两种录制模式的区别

    loadrunner的录制模式分为如下两种录制模式: HTML-based script,也称为高层录制: URL-based script,也称为底层录制. 两种录制模式的区别:1)脚本不同:高层录 ...

随机推荐

  1. 写入数据或者通过EXCEl批量导入到数据库时报类型转换异常问题

    报错日志如下(此处我用的是达梦,实际MySQL和oracle也会有类似的问题): Cause: org.apache.ibatis.type.TypeException: Error setting ...

  2. vue-project-------(模板语法,属性绑定)

    <template> <h3>模板语法</h3> <p>{{msg}}</p> <p>{{number+1}}</p> ...

  3. 记录一个MySQL中order by 和 limit 连用导致分页查询不生效的坑

    具体现象和这位同学的一致,具体的解决办法也是参考这位同学的做法 参考文章地址:https://www.cnblogs.com/yuluoxingkong/p/10681583.html

  4. 'parent.relativePath' of POM com.qbb:log_record_elegant:1.0-SNAPSHOT points at com.qbb:qiu_code instead of org.springframework.boot:spring-boot-starter-parent

    完整的错误: 'parent.relativePath' of POM com.qbb:log_record_elegant:1.0-SNAPSHOT (F:\QbbCode\qiu_code\log ...

  5. JMeter变量和调试取样器

    变量 可以在测试计划中定义变量 可以通过${变量名}进行调用 调试取样器可以看到变量参数

  6. ElasticSearch之cat master API

    命令样例如下: curl -X GET "https://localhost:9200/_cat/master?v=true&pretty" --cacert $ES_HO ...

  7. Skywalking(8.7)安装以及docker镜像打包

    Skywalking安装以及docker镜像打包 Skywalking版本:apache-skywalking-apm-es7-8.7.0 ES版本:7.17.2 一.下载Skywalking的安装包 ...

  8. 盘点华为云GaussDB(for Redis)六大秒级能力

    摘要:盘点高斯Redis的秒级能力,包括扩容.备份.删除.启动等. 本文分享自华为云社区<华为云GaussDB(for Redis)揭秘第20期:六大秒级能力盘点>,作者: 高斯Redis ...

  9. AOC萌新探索:搭建和体验在线AOC环境

    摘要:AOC是一个做网络设备自动化运维以及三方设备纳管的一个能力平台. 本文分享自华为云社区<AOC萌新探索之旅第一期--在线AOC环境初体验>,作者:oysterzz. 接触AOC没多久 ...

  10. 一文搞定Matplotlib 各个示例丨建议收藏

    摘要:Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用 ,Matplotlib也是深度学习的常用绘图库,主要是将训练的成果进行图形化,因为这样更直观,更方便发现训练中的 ...