FreeSWITCH回滚策略振铃组单一声铃音播放问题求助
解决FreeSWITCH Rollover振铃组铃音重复重置问题
针对你在v1.10.8版本中遇到的rollover振铃组每次桥接分机时铃音重置的问题,核心原因是每次转接新分机时,FreeSWITCH会重新触发回铃音逻辑,transfer_ringback无法覆盖这一行为。以下是几种可行的解决思路:
方案一:主叫侧独立持续播放铃音
放弃依赖系统自带的回铃音变量,直接在preAnswer后给主叫播放自定义铃音,同时后台异步处理振铃组的rollover逻辑,避免桥接操作打断铃音。
主叫侧脚本代码
-- 提前应答主叫,屏蔽运营商默认铃音 session:preAnswer(); -- 启动后台任务处理振铃组的分机桥接逻辑 session:execute("bgapi", "lua run ring_group_rollover.lua " .. session:getUuid()); -- 循环播放自定义铃音,直到呼叫被桥接或挂断 while session:ready() do session:play("sound://" .. ring_group_ringback); -- 替换为你的铃音路径 end
后台振铃组处理脚本(ring_group_rollover.lua)
local main_uuid = argv[1] local extensions = {"1001", "1002", "1003"} -- 替换为你的分机列表 local ring_timeout = 12 -- 每个分机振铃超时时间(秒) for _, ext in ipairs(extensions) do local bridge_uuid = api:executeString("create_uuid") -- 禁用分机侧的回铃音,避免干扰主叫侧播放 api:executeString("uuid_setvar " .. bridge_uuid .. " ringback ''") api:executeString("uuid_setvar " .. bridge_uuid .. " transfer_ringback ''") -- 发起桥接并设置超时 local bridge_result = api:executeString("bridge " .. bridge_uuid .. " user/" .. ext .. " timeout " .. ring_timeout) -- 检查桥接是否成功,成功则停止主叫侧铃音并退出循环 if string.find(bridge_result, "SUCCESS") then api:executeString("uuid_kill " .. main_uuid .. " PLAY") break end end -- 所有分机未接听时挂断主叫 api:executeString("uuid_hangup " .. main_uuid)
方案二:利用保持状态播放铃音
通过将主叫置于保持状态并播放铃音,后台处理振铃组呼叫,接通后取消保持并完成桥接:
session:preAnswer(); -- 保持主叫并播放自定义铃音 session:execute("hold", "local_stream://" .. ring_group_ringback); -- 后台处理振铃组逻辑(同方案一的ring_group_rollover.lua逻辑) -- 当检测到分机接通时,执行以下操作取消保持并桥接: -- api:executeString("uuid_hold " .. main_uuid .. " off") -- api:executeString("bridge " .. main_uuid .. " user/" .. answered_ext)
关于uuid_displace无法播放的排查点
如果坚持使用uuid_displace,先确认以下几点:
- 确保铃音文件路径正确,且FreeSWITCH进程有权限访问该文件
- 确认
mod_displace模块已加载(在fs_cli中执行module_exists mod_displace) - 正确调用方式:
api:executeString("uuid_displace " .. session:getUuid() .. " start sound://" .. ring_group_ringback),必须在session:preAnswer()之后执行
内容的提问来源于stack exchange,提问作者QViet
相关产品推荐
相关产品推荐

