看到好多网友问到这个问题。一般我们在打电话时会听到“您拨的电话正在通话中,请稍后再拨....”,或“电话无应答...”之类的提示,我们在 freeswitch 里也可以这样做。

其实很简单,默认的配置在呼叫失败时会转到 voicemail (语音信箱),我们只需要在这里修改,让他播放一个语音提示,然后再进入语音信箱(或直接挂 断也行)。

找到 <extension name="Local_Extension">部分的最后几行

<action application="bridge" data="user/${dialed_extension}@${domain_name}"/>
<action application="answer"/>
<action application="sleep" data="1000"/>
<action application="bridge" data="loopback/app=voicemail:default ${domain_name} ${dialed_extension}"/>

其中,第一个 bridge 是说明去呼叫被叫号码,如果呼叫失败,则 dialplan 继续往下走,依次是

  • 应答
  • 睡一会
  • 进入 voicemail

OK, 我们只需要把最后一个bridge那行改成

<action application="playback" data="${originate_disposition}.wav"/>

重新打电话试一下吧,如果被叫忙,则 originate_disposition 变量就是 USER_BUSY ,用户没注册就是 USER_NOT_REGISTERED 之类的,你只需要保证相关目录下有相对应的声音文件即可(如果LOG中提示找不到声音文件的话试试自己录一个)。

当然,呼不通的原因可能有很多,你总不可能录上所有的声音文件是吧,有两种方法:

1) 使用一个 lua (或其它语言) 的脚本

<action appliction="lua" data="/tmp/xxx.lua"/>

在 lua 脚本中可以拿到这个 originate_disposition 变量,从而可以使用 if then else 之类的逻辑播放各种声音文件。

2) 当然,如果你脚本也不想编辑的话,实现上 FreeSWITCH 的 dialplan 功能是非常强大的,你只需要将呼叫转到播放不同声音文件的 dialplan:

<action application="transfer" data="play-cause-${originate_disposition}"/>

然后创建如下 dialplan extension:

  <condition field="destination_number" expression="^play-cause-USER_BUSY$"><action application="playback" "/tmp/sounds/user-busy.wav"/></condition>
  <condition field="destination_number" expression="^play-cause-USER_NOT_REGISTERED$"><action application="playback" "/tmp/sounds/user-not-registered.wav"/></condition>
  <condition field="destination_number" expression="^play-cause0(.*)$"><!-- for all other reasons, play this file --><action application="log" data="WARNING hangup cause: $1"/><action application="playback" "/tmp/sounds/unknown-error.wav"/></condition>

小结:

当然,能播放上面的声音文件还有一个前提,就是在第一个 bridge 前面要有以下两行:

<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="continue_on_fail=true"/>

第一行的作用是,如果第一个 bridge 成功了,被叫挂断电话后我们就没有必要再播放该声音了,因此直接挂机。当然这一行可以没有,那么你在后面的 originate_disposition 里如果发现值是 "NORMAL_CLEARING" (正常挂机)的情况再决定是否播放相关语音。

第二行的作用是,如果呼叫失败(空号,拒接等),继续往下走,否则(值为 false 的情况)到这里就挂机了。该变量的值还可以有以下几种,表示只有遇到这几种情况才播放语音,其它的就直接挂机。

<action application="set" data="continue_on_fail=NORMAL_TEMPORARY_FAILURE,USER_BUSY,NO_ANSWER,TIMEOUT,NO_ROUTE_DESTINATION"/>

FreeSWITCH在呼叫失败的情况下如何播放语音提示相关推荐

  1. ios 开发 微信分享失败_一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员...

    ios 开发 微信分享失败 by Jordan LaGrone 乔丹·拉格隆(Jordan LaGrone) 一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员 (How a lost kid ...

  2. 在 iPhone 静音情况下,播放 MP3 文件的代码

    转自: http://xiongzhend.blog.163.com/blog/static/6409850120108821651530/ 在 iPhone 静音情况下,播放 MP3 文件的代码 在 ...

  3. 三网融合情况下,实时语音通信技术的研究

    随着技术和标准的不断成熟,伴随着"三网合一"的大潮,VoIP可望成为下一代电信基础设施结构的杨心,使未来各电信业务综合统一在IP网络上成为可能,导致数据的融合和未来电信市场的重组, ...

  4. 三网融合情况下,实时语音通信技术解决之道

    随着技术和标准的不断成熟,伴随着"三网合一"的大潮,VoIP可望成为下一代电信基础设施结构的杨心,使未来各电信业务综合统一在IP网络上成为可能,导致数据的融合和未来电信市场的重组, ...

  5. 电脑打开播放器提示服务器运行失败,电脑中打开WMP播放器提示服务器运行失败如何解决...

    Windows Media Player是微软操作系统中默认的播放器.有用户习惯使用WMP播放器来听音乐,不过却在电脑中打开WMP播放器时提示"服务器运行失败".这时,可以参考以下 ...

  6. 解决笔记本集成声卡在某些情况下视频、语音没有声音

    右击右下角

  7. enti下载器_短跑enti策略:如何在不破坏软件的情况下改进软件

    enti下载器 我们的代码已被破坏了几个星期. 编译器错误,测试失败,行为错误困扰着我们的团队. 为什么? 因为我们被盲目蛙跳打了. 通过对关键组件进行多次并发更改以希望对其进行改进,我们已经从其丑陋 ...

  8. 在未贴brcm4330芯片的情况下,invensense的sensor失效问题分析

    在未贴brcm4330芯片的情况下,invensense的sensor失效问题分析 结论: 启动顺序问题. sensor的上层应用会在启动过程中试图打开invensense的sys文件接口. inve ...

  9. 卡1拨打10086,呼叫失败

    问题描述 通过拨号盘拨打10086,测试10次,出现一次呼叫失败的情况 问题分析 主叫失败的原因是由于GSM900频点41的SNR值太差,导致随机接入的时候,不能正确解码AGCH信道信息,随机接入失败 ...

最新文章

  1. Java 序列化Serializable详解(附详细例子)
  2. 四线接近开关接线图_开关、电机、断路器、电热偶、电表接线图!非常齐全,快囤起来吧...
  3. 考研961数据结构c语言版真题,严蔚敏数据结构C语言版考研真题库
  4. Sass笔记(CSS 的预编译语言)
  5. 人脸检测江湖的那些事儿——从旷视说起
  6. linux主机监控命令-top
  7. wpf开源ui引用步骤_如何通过7个步骤开源您的学术作品
  8. 编码速度非常慢_有BUG?MySQL中的 utf8 居然并不是真正的UTF-8编码?
  9. “fatal: refusing to merge unrelated histories” Git error
  10. Linux 网络驱动
  11. 矩阵和向量的范式(Norms for Vectors and Matrices)
  12. R包的安装以及安装失败的解决
  13. 如何运用Microsoft Office Project 2003来做项目计划
  14. return与finally到底谁先执行
  15. Unity-Matcap材质捕捉和薄膜干涉效果
  16. 微信转盘抽奖前端源码(二):12个奖品,指针初始指向奖品中间
  17. python华为corba接口_CORBA接口用戶手册.doc
  18. 如果你看烦了常用编程字体,不如试试这一种
  19. iOS 适配iOS11、iPhone X
  20. 11、ArrayList和linkedList的区别

热门文章

  1. 需求分析说明书(四)
  2. maven的安装和环境配置的过程记录
  3. 分享一个 org.w3c.dom XML 封装
  4. Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence 栈
  5. 为jQuery写插件
  6. win 修改hosts文件权限不够,解决办法
  7. 每秒改变一次背景颜色以及由此引发的一些有趣的小事情(.net方向)
  8. WPF中触发器Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种
  9. chrome inspect 离线调试-工具包 怎么使用
  10. SpringBoot系列: 单元测试