分析:FreeSWITCH 作为信令 B2BUA 时处理 G.729 的场景
当 FreeSWITCH 作为纯信令 B2BUA(不处理媒体流)时,G.729 编解码器的使用是否会导致错误取决于以下关键因素:
1. 核心逻辑与结果
场景 | FreeSWITCH 行为 | G.729 是否可用 | 潜在问题 |
---|---|---|---|
纯信令透传(媒体绕过) | FreeSWITCH 仅转发 SDP 信息,不修改编解码器列表,不参与媒体处理。 | 是(终端间直接协商) | 无(只要终端支持 G.729) |
编解码器过滤 | FreeSWITCH 主动移除或限制 G.729(如安全策略要求)。 | 否 | 呼叫失败(终端协商无共同编解码器)。 |
媒体代理意外启用 | FreeSWITCH 错误开启媒体代理(enable-media-proxy=true )但未加载 mod_g729 。 | 否 | 媒体协商失败(FreeSWITCH 无法处理 G.729 转码)。 |
2. 详细场景说明
(1) 正常媒体绕过(无错误)
- 配置:
<!-- 禁用媒体代理 --> <param name="enable-media-proxy" value="false"/> <!-- 允许媒体绕过 --> <param name="disable-media-path" value="true"/>
- 流程:
- 终端 A 发送 SDP 包含
G729
。 - FreeSWITCH 透传 SDP 到终端 B。
- 终端 B 回复支持
G729
。 - 媒体流直接在 A 和 B 间传输,无需 FreeSWITCH 处理。
- 终端 A 发送 SDP 包含
- 结果:通话正常建立,使用 G.729。
(2) 编解码器过滤(导致错误)
- 配置:
<!-- 强制过滤 G.729 --> <param name="inbound-codec-prefs" value="OPUS,PCMU,PCMA"/>
- 流程:
- 终端 A 发送 SDP 包含
G729
。 - FreeSWITCH 移除
G729
,转发修改后的 SDP 到终端 B。 - 若终端 B 仅支持 G.729,则协商失败。
- 终端 A 发送 SDP 包含
- 结果:返回
488 Not Acceptable Here
错误。
(3) 媒体代理误启用(导致错误)
- 配置:
<!-- 错误启用媒体代理 --> <param name="enable-media-proxy" value="true"/> <!-- 未加载 mod_g729 -->
- 流程:
- 终端协商结果为
G729
。 - FreeSWITCH 尝试代理媒体流,但因缺少 G.729 模块无法转码。
- 终端协商结果为
- 结果:媒体流中断,单通或无声。
3. 验证与解决方案
步骤 1:确认媒体绕过配置
<!-- conf/sip_profiles/internal.xml -->
<settings>
<param name="enable-media-proxy" value="false"/>
<param name="disable-media-path" value="true"/>
</settings>
步骤 2:检查编解码器过滤策略
<!-- 确保未过滤 G.729 -->
<param name="inbound-codec-prefs" value="OPUS,G729,PCMU,PCMA"/>
<param name="outbound-codec-prefs" value="OPUS,G729,PCMU,PCMA"/>
步骤 3:验证终端支持
- 终端 A/B:通过抓包(Wireshark)检查 SDP 中是否包含
G729
。 - 示例 SDP:
a=rtpmap:18 G729/8000
步骤 4:排查媒体代理误启用
- 日志检查:
grep 'Media Proxy' /usr/local/freeswitch/log/freeswitch.log # 出现 "Media Proxy enabled" 表示配置错误。
4. 高级场景:G.729 许可证问题
-
问题本质:
- FreeSWITCH 无需处理媒体时:即使未购买 G.729 许可证,只要终端支持,媒体绕过仍可正常使用。
- FreeSWITCH 处理媒体时:必须购买许可证并加载
mod_g729
,否则转码失败。
-
结论:
纯信令 B2BUA 场景下,G.729 使用与 FreeSWITCH 许可证无关。
总结
- 正常媒体绕过:G.729 可正常工作,无需 FreeSWITCH 编解码支持。
- 错误配置:若意外启用媒体代理或过滤 G.729,将导致通话失败。
- 验证要点:
- 确保
enable-media-proxy=false
且disable-media-path=true
。 - 检查编解码器白名单是否包含 G.729。
- 终端抓包确认 SDP 协商正确。
- 确保
在 FreeSWITCH 作为 B2BUA(Back-to-Back User Agent) 且 不参与媒体处理(媒体绕过) 的场景中,编解码器协商的逻辑会发生显著变化。以下是详细分析:
1. B2BUA 的两种媒体处理模式
(1) 媒体代理(默认行为)
- 特点:
FreeSWITCH 作为媒体中间节点,接收并转发 RTP 流(可能涉及转码)。 - 编解码协商:
- 必须参与:FreeSWITCH 需要与双方终端协商共同的编解码器,否则媒体无法处理。
- 示例配置:
<!-- 默认启用媒体代理 --> <param name="enable-media-proxy" value="true"/>
(2) 媒体绕过(B2BUA 无媒体处理)
- 特点:
FreeSWITCH 仅处理信令(SIP),媒体流直接在终端间传输(P2P)。 - 编解码协商:
- 不参与:终端自行协商编解码器,FreeSWITCH 仅透传 SDP 信息。
- 示例配置:
<!-- 禁用媒体代理 --> <param name="enable-media-proxy" value="false"/> <!-- 允许媒体绕过 --> <param name="disable-media-path" value="true"/>
2. 媒体绕过场景下的编解码器协商
(1) 协商流程
- 终端 A → FreeSWITCH:发送 INVITE 请求,携带 SDP(编解码器列表:
OPUS, G722, PCMU
)。 - FreeSWITCH → 终端 B:透传 SDP(不修改编解码器列表)。
- 终端 B → FreeSWITCH:回复 200 OK,携带支持的编解码器(如
PCMU, G722
)。 - FreeSWITCH → 终端 A:透传最终协商结果(
PCMU
或G722
)。
(2) FreeSWITCH 的角色
- 信令透传:不修改 SDP 中的
a=rtpmap
或编解码器优先级。 - 无转码:媒体流直接通过终端间传输,无需编解码器兼容性检查。
(3) 配置验证
<!-- conf/sip_profiles/internal.xml -->
<settings>
<!-- 禁用媒体代理 -->
<param name="enable-media-proxy" value="false"/>
<!-- 允许媒体绕过 -->
<param name="disable-media-path" value="true"/>
</settings>
3. 需要编解码器协商的特殊场景
即使媒体绕过,以下情况仍需要 FreeSWITCH 干预编解码器协商:
(1) 编解码器过滤
- 需求:限制终端使用特定编解码器(如禁用低安全性编解码器)。
- 配置示例:
<!-- 强制移除 G.711 编解码器 --> <param name="inbound-codec-negotiation" value="strict"/> <param name="inbound-codec-prefs" value="OPUS,G722"/>
(2) SDP 修正
- 需求:修复终端 SDP 错误(如错误的载荷号映射)。
- 配置示例:
<param name="sip-correct-uas-ports" value="true"/>
(3) NAT 穿透支持
- 需求:在媒体绕过时处理 ICE/STUN/TURN 信息。
- 配置示例:
<param name="rtp-enable-ice" value="true"/> <param name="rtp-stun-ip" value="stun.freeswitch.org"/>
4. 生产环境建议
(1) 纯信令 B2BUA(推荐配置)
<!-- 禁用媒体处理 -->
<param name="enable-media-proxy" value="false"/>
<param name="disable-media-path" value="true"/>
<!-- 透传所有 SDP 参数 -->
<param name="inbound-codec-negotiation" value="accept"/>
<param name="outbound-codec-negotiation" value="accept"/>
(2) 编解码器黑名单(安全加固)
<!-- 移除不安全的编解码器(如 G.729 未授权版本) -->
<param name="inbound-codec-prefs" value="OPUS,G722,PCMU,PCMA"/>
<param name="outbound-codec-prefs" value="OPUS,G722,PCMU,PCMA"/>
(3) 日志监控
通过 fs_cli
监控媒体协商结果:
# 查看呼叫的 SDP 信息
sofia global siptrace on
总结
- 媒体绕过时:FreeSWITCH 不参与编解码器协商,终端自行协商。
- 需干预的场景:编解码器过滤、SDP 修正、NAT 穿透。
- 关键配置:
enable-media-proxy=false
+disable-media-path=true
。
通过合理配置,FreeSWITCH 可作为高效的信令 B2BUA,同时完全剥离媒体处理职责,降低服务器负载并提升系统扩展性。