Administrator
发布于 2026-11-09 / 1 阅读
0
0

FreeSWITCH 配置实战 12|媒体怎么走,断流多久才挂断

English
中文

先给一通电话做个可观察的实验

这期用 7101 拨一个独立测试号码 7812,由 FS 呼叫 7102。先验证普通媒体经过 FS、双方有声,再观察一侧停止发 RTP 后会发生什么。实验值设为正常通话 30 秒、保持状态 90 秒,它们只是为了方便观察。实际项目要结合话机、线路和业务等待要求确定阈值。

沿用第 11 期的测试 Profile、目录域和共同编码,两台话机先放在可直接互通的测试内网。准备配置备份、抓包权限和能控制单条测试话路的终端工具。示例核对了 v1.11.2 模板、媒体处理源码及当前官方手册,未在运行实例中测试。agent、queue、tier 继续用原来的对象,本期入口直接呼叫目录分机,便于把派单因素排除在实验之外。

三种模式分别能在 FS 上看到什么

普通媒体模式下,FS 终结两条腿的 RTP,可以对音频做处理。上一期的两种编码转换,以及后续要用的录音、放音等功能,都需要按业务要求保留这种媒体处理能力。代理媒体 proxy_media 会让 RTP 继续经过 FS,但主要转发媒体包,无法按普通模式做转码。绕过媒体 bypass_media 会通过 SDP 让两端直接交换媒体,FS 继续处理信令。

先从双方 SDP 的地址和端口推导媒体该去哪里,再抓实际的包。代理媒体和普通媒体都可能在 FS 网卡上看到 RTP,仅看“包经过服务器”还分不清二者。绕过模式下若两台话机隔着无法互通的 NAT,SIP 仍可能建立,但音频到不了对方。公网场景先沿用第 10 期已验证的媒体路径。

新增一个只用于实验的号码

在 fs_cli 运行 eval $${conf_dir} 找配置根目录。确认认证后的 7101 实际进入 default,上期若使用其他受控 context,就在那个 context 下配置。把下面完整内容保存为 dialplan/default/00_training_media_12.xml。检查 default.xml 确实包含这个目录,再查本机已有的 7812 规则以及更早匹配的宽泛规则。文件名有 00 也无法保证比所有规则先执行,以实际加载顺序和命中日志为准。

本期把设置放进一条受控路由,便于单独恢复。先检查 training-internal 有没有 inbound-proxy-media 或 inbound-bypass-media 等 Profile 级设置,以及应用是否在 bridge 前又覆盖变量。保持前一期的普通媒体前提,再执行本期配置。

<include>
  <extension name="fs_media_lab_12">
    <condition field="destination_number" expression="^7812$">
      <!-- 本实验使用普通媒体,先关闭两种特殊模式 -->
      <action application="set" data="bypass_media=false"/>
      <action application="set" data="proxy_media=false"/>
      <!-- 当前腿与随后建立的被叫腿都使用毫秒单位 -->
      <action application="export" data="media_timeout=30000"/>
      <!-- 保持时的实验值为90秒,实际处理还受协商影响 -->
      <action application="export" data="media_hold_timeout=90000"/>
      <!-- 接通后的被叫腿结束后,结束本次主叫通话 -->
      <action application="set" data="hangup_after_bridge=true"/>
      <!-- 复用现有目录里的7102,域沿用本次认证呼叫 -->
      <action application="bridge" data="user/7102@${domain_name}"/>
    </condition>
  </extension>
</include>

7812 是用户拨入的测试目的号码,7102 是实际被叫分机。domain_name 必须与现有目录域一致,跨域部署按已验证的目录查找方式替换。认证和外呼权限仍由原有入口与路由管理。

set 的 bypass_media、proxy_media 控制当前呼叫的媒体处理方式,两项在本例都为 false。export 把超时值设置在当前腿,并传给随后创建的被叫腿,两边的接收方向都需要检查。30000 毫秒就是 30 秒,90000 毫秒就是 90 秒。hangup_after_bridge=true 用来在被叫腿正常结束后结束主叫腿,避免实验路由继续执行后面的业务动作。

加载后验证值,再观察断流

下面命令在 fs_cli 执行。reloadxml 让新路由进入配置,新建一通 7101 到 7812 的电话后再查。UUID 换成 show channels 中这通测试的标识,两条腿分别执行后四行。音频专用的 media_timeout_audio、media_hold_timeout_audio 若已被其他逻辑赋值,还会影响通用值,空值也要如实记录。

reloadxml
show channels
uuid_getvar UUID media_timeout
uuid_getvar UUID media_hold_timeout
uuid_getvar UUID media_timeout_audio
uuid_getvar UUID media_hold_timeout_audio

接听后双方各说一句,在 FS 网卡记录对应 RTP 地址和端口。随后只让一个测试终端停止向 FS 发媒体,SIP 保持在线,同时保留抓包。可以用终端的测试功能,或在隔离实验环境短时拦截这通电话已确认的单个 RTP 流。先记清恢复办法和相关五元组,再操作;断整个网络会同时影响信令和其他通话,无法用于这个对比。

正常收发期间不应仅因通话超过 30 秒而挂断。停止接收媒体达到阈值后,观察是否以 MEDIA_TIMEOUT 等对应原因结束,记录最后收包到结束的间隔。调度和检查路径会影响观察时间,验收不用卡在精确的第 30.000 秒。如果没有触发,先核对该腿是否真的断了媒体、变量是否生效及当前媒体模式,再查本机日志。

话机“静音”常常仍发送 RTP,部分终端静默时还有舒适噪声包。用抓包确认发生了什么,别把不说话当成断流。测试结束马上恢复过滤规则,并重打一通验证恢复后的双向语音。

保持状态需要单独验收

保持测试在恢复正常通话后另做。让话机按保持键,保存这一轮 re-INVITE 的 SDP,再恢复通话。RFC 3264 定义了 sendonly、recvonly、inactive 等方向属性,不同话机的处理会有区别。有的还在发送媒体,有的进入合法的单向或无媒体状态。

media_hold_timeout 是保持期间的媒体不活动阈值,并非给所有保持通话设一个固定寿命。v1.11.2 媒体源码还会在部分方向协商路径调整或清除音频超时。写了 90000 并不保证保持到 90 秒就挂断。结合双方 SDP、FS 实际识别状态和音频专用变量,记录本机行为。保持后能恢复双向通话,是本轮必须验收的一项。

另外两种模式怎么比较

只在可恢复的实验路由里逐次替换媒体模式设置,每次新建通话。两台话机先都只用一种共同编码。在原 bridge 前,把同名设置替换为下面的代理媒体片段,其余测试路由保留。

<!-- 仅在独立实验路由的bridge之前使用 -->
<action application="set" data="bypass_media=false"/>
<!-- 与上面的普通媒体配置二选一 -->
<action application="set" data="proxy_media=true"/>

代理模式里检查两条腿都把媒体送往 FS,编码是否相容,以及抓包中的实际转发。再恢复普通模式,换成下面的绕过片段。两端需媒体可直达,不带录音或需要服务端放音的业务做这个实验。

<!-- 仅在两台测试终端媒体可直达时使用 -->
<action application="set" data="proxy_media=false"/>
<!-- 与代理媒体配置二选一,替换原有同名设置 -->
<action application="set" data="bypass_media=true"/>

绕过后从两台终端抓包确认媒体是否互相直送,FS 上的普通 RTP 接收超时也无法替代端到端的媒体监测。media-option 里的 resume-media-on-hold、bypass-media-after-hold 和 bypass-media-after-att-xfer 还会在保持、恢复或咨询转接后改变媒体位置。项目用了这些选项时,把相关阶段都纳入抓包和听音验收,不能只看初次接听。

常见问题和回退

  • 设了 30 秒却立刻断。先核对单位。media_timeout 是毫秒,旧 Profile 参数 rtp-timeout-sec 才是秒。新参数填 30,和原来填 30 的含义差很多。
  • 模板里还有 rtp-timeout-sec、rtp-hold-timeout-sec。v1.11.2 源码解析它们时会提示弃用,模板保留了兼容项。新测试用 media_timeout、media_hold_timeout,检查覆盖后再迁移旧项。
  • 模式改了但行为没变。核对路由是否命中,是否有 Profile 或应用的覆盖,并用新通话比较。变量值与包路径一起看。
  • 保持后无声或录音缺段。检查保持前后的 SDP、媒体是否回到 FS,以及恢复或转接选项。按需要服务端处理音频的业务重新选择模式。

回退时等实验通话结束,把新增 XML 移出加载目录,恢复这次动过的 Profile、应用变量和终端设置,再 reloadxml。若改了 Profile 级模式,按前期方法在测试窗口重启该 Profile。清掉本次临时过滤条目,让 7101、7102 回到原来的号码互拨,最后再验一次保持恢复。

资料来源


评论