FreeSWITCH 使用指北(2)-多段音频顺序播放的设置

2023-10-29 03:15

本文主要是介绍FreeSWITCH 使用指北(2)-多段音频顺序播放的设置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 多段音频顺序播放的设置
  • 2. uuid_bridge 时机问题

1. 多段音频顺序播放的设置

在 FreeSWITCH 中涉及到放音的 APP 有不少,比较典型的是播放录音文件的 playbackplay_and_detect_speech 。这两个 APP 播放录音的功能都依赖于 switch_ivr_play_say.c#switch_ivr_play_file() 函数,而该函数可以借助 file_string 实现多段音频播放,示例如下:

originate user/1000 &playback(file_string://ivr/8000/ivr-welcome1.wav!ivr/8000/welcome2.wav)

file_string:// 前缀不能省略,这个代表的是 FreeSWITCH 中的一个文件管理模块,多个音频文件用 ! 拼起来即可。注意如果文件名中含有 ! 符号,也可以使用通道变量 playback_delimiter 来修改文件间的分隔符号

2. uuid_bridge 时机问题

在 FreeSWITCH 外呼系统中,常驻坐席拨打用户时接通双方的 uuid_bridge 命令执行时机很关键。通常如果坐席不需要听用户的早媒体,那么在收到 CHANNEL_ANSWER 事件时执行 uuid_bridge 最稳妥,几乎不会产生什么问题。 但是当坐席需要听早媒体的时候,就需要在 SIP 交互更早期 bridge 坐席和用户,比较合适的事件是 CHANNEL_PROGRESS_MEDIA

CHANNEL_PROGRESS_MEDIA 的产生时机是 FreeSWITCH 收到被叫 180/183 响应并且响应中带了 sdp 时,一般这时候已经开始拉起 RTP 传输早媒体了,但是使用这个事件也有以下几个问题:

  1. 线路商直到 200 响应才带 sdp
    生产环境发现线路商返回的 SIP 响应中偶现 180 不带 sdp,183 直接不发,直到 200 才把 sdp 带过来,这就直接导致 FreeSWITCH 根本不会发出 CHANNEL_PROGRESS_MEDIA 事件,进而导致 uuid_bridge 未执行,坐席和用户互相听不到对方的声音。对于这种情况,一个解决方案是在收到 CHANNEL_ANSWER 事件时根据相关通道变量判断当前坐席和用户是否已经 bridge 上,如果没有对接上,则兜底执行 uuid_bridge 即可
  2. 用户拒接导致坐席挂断
    在收到 CHANNEL_PROGRESS_MEDIA 事件执行 uuid_bridge 后,如果被叫拒接 FreeSWITCH 会偶现 DESTINATION_OUT_OF_ORDER 挂断异常,并导致常驻坐席也被挂断。这个问题多方查找资料未找到原因,大致猜测是 FreeSWITCH 执行 uuid_bridge 命令时会修改坐席会话状态,被叫拒接动作也会修改主叫坐席的会话状态,二者同时发生时可能有多线程操作造成坐席会话状态机流转异常,进而造成坐席会话提前挂断。这个暂时没有什么好的解决方案,一个 workaround 是在收到 CHANNEL_PROGRESS_MEDIA 事件后延时执行 uuid_bridge,可以降低问题发生的频率

这篇关于FreeSWITCH 使用指北(2)-多段音频顺序播放的设置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/297899

相关文章

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将