You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Lua脚本启动的FreeSWITCH录音无法执行mask/unmask命令问题

问题分析与解决方法

核心原因

Lua脚本自动启动录音时,record_session的调用上下文、参数传递或命令时机与手动执行场景不一致,导致后续record_session_mask/unmask无法定位到目标录音会话。

具体排查与修复步骤

  • 确认record_session的UUID绑定
    Lua中调用record_session时,必须明确指定当前呼叫的session UUID,否则录音可能绑定到错误的会话上下文。正确调用格式:

    local uuid = session:getUUID()
    local full_rec_path = record_path .. "/" .. recording_filename
    session:execute("record_session", full_rec_path .. " " .. uuid)
    

    手动执行时处于当前会话上下文,默认绑定当前UUID,但Lua脚本中若不主动指定,会出现会话不匹配问题。

  • 检查uuid_broadcast的目标UUID
    执行mask/unmask时,uuid_broadcast的目标必须是启动录音的那个会话UUID,而非呼叫的其他UUID。Lua中需保存启动录音时的UUID,后续广播命令使用该值:

    -- 保存录音会话的UUID
    local rec_session_uuid = uuid
    -- 执行mask命令
    freeswitch.consoleExecute("uuid_broadcast", rec_session_uuid .. " record_session_mask::" .. full_rec_path)
    

    若目标UUID错误,命令会发送到无关会话,自然无效果。

  • 修复路径变量的解析问题
    Lua不支持shell风格的${var}变量替换,直接写${record_path}/${recording_filename}会导致路径失效,必须用Lua字符串拼接生成完整路径:

    local record_path = "/var/freeswitch/recordings"
    local recording_filename = "call_" .. os.date("%Y%m%d_%H%M%S") .. ".wav"
    local full_rec_path = record_path .. "/" .. recording_filename
    

    确保full_rec_path和手动执行时的路径完全一致,避免因路径错误导致mask命令找不到录音文件。

  • 调整命令执行时机
    不要在CHANNEL_ANSWER事件触发后立刻执行mask/unmask,录音启动需要短暂时间,可通过延迟触发:

    -- 延迟1秒执行mask,确保录音已启动
    session:execute("sleep", "1000")
    freeswitch.consoleExecute("uuid_broadcast", rec_session_uuid .. " record_session_mask::" .. full_rec_path)
    
  • 调试验证
    在Lua中添加日志输出,确认参数正确性:

    freeswitch.consoleLog("info", "Recording path: " .. full_rec_path .. "\n")
    freeswitch.consoleLog("info", "Target UUID for broadcast: " .. rec_session_uuid .. "\n")
    

    然后在FreeSWITCH控制台查看日志,对比手动执行的参数,排查差异。

内容的提问来源于stack exchange,提问作者Amjad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:35:02