能否通过API获取FreeSWITCH外呼通话时长?求精准获取方案
解决FreeSWITCH精准通话时长获取问题
官方认可的精准获取方式
- CDR表权威字段:fs_cdr表中的
billsec字段是FreeSWITCH官方计算的实际通话时长,统计范围是从通话接通(ANSWER)到挂断(HANGUP)的精准秒数,这是官方推荐的权威取值。若你的fs_cdr数值异常,先排查配置:- 确认
cdr_csv.conf.xml或对应CDR配置文件中,billsec字段已被启用输出 - 检查数据库写入CDR的逻辑,避免误用
duration字段(该字段统计从呼叫发起至挂断的总时长,包含振铃等待时间)
- 确认
- ESL API实时获取:通过FreeSWITCH的Event Socket Library(ESL)调用官方API获取,通话挂断后执行以下命令:
该命令返回的数值与fs_cdr表的uuid_getvar <通话UUID> billsecbillsec完全一致,也可在通话过程中用uuid_dump命令查看通道变量,实时获取更新的billsec值
时长不一致的常见排查点
- 字段混淆:误将
duration(呼叫全周期时长)当作实际通话时长使用 - 事件监听错误:通过CHANNEL_ANSWER和CHANNEL_HANGUP计算时,需取事件自带的
answer_epoch和hangup_epoch秒级时间戳差值,而非事件的接收时间(可能存在网络延迟);同时要绑定对应通道的UUID,避免转接场景下取错事件 - 时区偏差:检查FreeSWITCH服务器时区与数据库时区是否一致,时间戳转换异常会导致时长计算偏差
新手快速验证流程
- 用
fs_cli连接FreeSWITCH,发起一通测试通话 - 通话挂断后,执行
show cdr uuid <目标通话UUID>,查看billsec数值 - 同时通过ESL调用
uuid_getvar <目标通话UUID> billsec,对比两个数值是否一致 - 若不一致,检查
cdr.conf.xml中的enable-odbc/enable-csv配置,确认CDR生成逻辑未被自定义修改
内容的提问来源于stack exchange,提问作者tandathuynh148
相关产品推荐
相关产品推荐

