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时重码的问题。
后续我们再研究如何解决该问题。
空空如常
求真得真
freeswitch两个DTMF转换接口的区别的更多相关文章
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
当你看见这个标题的时候,你可能会下意识的去想一下,这两种方式到底有什么样的区别呢? 且看下面的demo,自然便区分开了 /** * */ package com.b510.test; /** * Pr ...
- UI:字典的两种取值的区别
字典的两种取值的区别 (objectForKey: 和 valueForKey )参考 一般来说 key 可以是任意字符串组合,如果 key 不是以 @ 符号开头,这时候 valueForKey: 等 ...
- Android(java)学习笔记227:服务(service)之服务的生命周期 与 两种启动服务的区别
1.之前我们在Android(java)学习笔记171:Service生命周期 (2015-08-18 10:56)说明过,可以回头看看: 2.Service 的两种启动方法和区别: (1)Servi ...
- form表单中get和post两种提交方式的区别
一.form表单中get和post两种提交方式的区别? 1.get提交表单中的内容在链接处是可见的.post不可见 2.post相比于get是安全的 3.post不收限制大小,get有限制大小(黑马视 ...
- iOS学习——UITableViewCell两种重用方法的区别
今天在开发过程中用到了UITableView,在对cell进行设置的时候,我发现对UITableViewCell的重用设置的方法有如下两种,刚开始我也不太清楚这两种之间有什么区别.直到我在使用方法二进 ...
- Python 中格式化字符串 % 和 format 两种方法之间的区别
Python2.6引入了 format 格式化字符串的方法,现在格式化字符串有两种方法,就是 % 和 format ,具体这两种方法有什么区别呢?请看以下解析. # 定义一个坐标值 c = (250, ...
- 网站开发进阶(六)JSP两种声明变量的区别
JSP两种声明变量的区别 在JSP中用两种声明变量的方法,一种是在<%! %>内,一种是在<% %>内.他们之间有什么区别呢?我们直接看一个JSP文件来理解. 代码如下: &l ...
- nuxt框架Universal和Spa两种render mode的区别
如下图,官网上对于Universal 和 Spa 两种render mode的区别,并没有加以说明,相信大多数人跟我一样有点懵,不知道选什么好.虽然两个模式创建的项目看不出区别. 先给出推荐选项: U ...
- Java中String对象两种赋值方式的区别
本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...
- LR两种录制模式的区别
loadrunner的录制模式分为如下两种录制模式: HTML-based script,也称为高层录制: URL-based script,也称为底层录制. 两种录制模式的区别:1)脚本不同:高层录 ...
随机推荐
- [CF568E] Longest Increasing Subsequence
题目描述 Note that the memory limit in this problem is less than usual. Let's consider an array consisti ...
- [ARC137E] Baker
Problem Statement Snuke runs a bakery. He is planning for the next $N$ days. Let us call these days ...
- 给祖传系统做了点 GC调优,暂停时间降低了 90%
问题描述 公司某规则引擎系统,在每次发版启动会手动预热,预热完成当流量切进来之后会偶发的出现一次长达1-2秒的Young GC(流量并不大,并且LB下的每个节点都会出现该情况) 在这次长暂停之后,每一 ...
- 自上而下的LL(1)语法分析法
LL(1)文法:从文法的开始符,向下推导,推出句子. 对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的 产生式A->α|β 满足下列条件: (1)如果α.β均 ...
- OpenFeign:Spring Cloud声明式服务调用组件
OpenFeign:Spring Cloud声明式服务调用组件 问题总结 OpenFeign? Feign VS OpenFeign? OpenFeign实现远程服务调用? OpenFeign超时控制 ...
- Pikachu漏洞靶场 敏感信息泄露
敏感信息泄露 概述 由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到. 比如: 通过访问url下的目录,可以直接列出目录下的文件列表; 输入错误的url参数后报错信息里面 ...
- 未能加载文件或程序集“*****.dll”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。(异常来自HRESULT:0x80131040)
问题描述: 未能加载文件或程序集"*****.dll"或它的某一个依赖项.找到的程序集清单定义与程序集引用不匹配.(异常来自HRESULT:0x80131040) 解决方法: 1. ...
- js-audio-pluging(录音)
安装 npm i js-audio-recorder 代码 <template> <div class="BaseRecorder"> <div cl ...
- LeetCode283移动零、11盛最多的水
283. 移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必 ...
- 华为云MVP付健权:从机械工程师到AI开发者的华丽转身
摘要:谁说AI开发难,看一个机械工程师是如何转型成为AI工程师的. 付健权,华为云MVP,企业上云导师.软通动力,售前解决方案经理,为制造业讲解华为云产品,为客户提供上云和云上解决方案.为企业提供大数 ...