通过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

