Administrator
发布于 2026-11-08 / 3 阅读
0
0

FreeSWITCH 配置实战 11|编码顺序怎么选,什么时候发生转码

English
中文

这次要看见哪两个结果

沿用 7101、7102 和第 10 期的 training-internal 测试入口。本期先在两端都支持 PCMA、PCMU 的情况下,观察入站腿按哪种顺序选编码。再把 7101 设为只用 PCMA,7102 只用 PCMU,验证 FS 能否把两边的话互相转换。两组都要接听、双向说话,再正常挂断。PCMA 是 G.711 A-law,PCMU 是 G.711 μ-law,本例用它们缩小测试范围。

准备可回退的测试机、两台能编辑音频编码列表的话机,以及上一期已经互拨成功的目录与路由。FS 需要有两种编码的可用实现。示例以 v1.11.2 配置模板、Sofia 源码和当前官方手册为依据,尚未在运行实例中测试。安装包的版本和能力仍要在本机核对。队列 agent、tier 沿用已有配置,这次调整的是 SIP 媒体协商。

在哪里修改,先改多大范围

在 fs_cli 用 eval $${conf_dir} 找到配置根目录,把 sip_profiles/training-internal.xml 备份到包含目录外。下面给出本期完整实验 Profile。网卡、端口、公网映射沿用你在上期验证过的真实值,203.0.113.10 是文档地址。内网两台话机仍连各自可达的入口;本期先保持原有可达性,集中观察编码。

同时检查测试拨号路径里是否已经设置 codec_string、absolute_codec_string、inherit_codec,或者在 bridge 的拨号串里给被叫腿单独指定了编码。把相关设置记下来,实验路径暂时恢复为本期的统一列表。媒体需要由 FS 正常处理,测试路径里如果有 bypass_media、proxy_media 或对应 Profile 设置,也先按原项目的回退方法恢复普通媒体处理。多个设置一起生效时,只改 Profile 往往看不到预期变化。

<profile name="training-internal">
  <!-- 沿用目录用户,不加载额外网关或建立域别名 -->
  <aliases/>
  <gateways/>
  <domains>
    <domain name="all" alias="false" parse="false"/>
  </domains>
  <settings>
    <!-- 以下两项填测试机的网卡地址和实验 SIP 端口 -->
    <param name="sip-ip" value="10.20.30.10"/>
    <param name="sip-port" value="5090"/>
    <param name="rtp-ip" value="10.20.30.10"/>
    <!-- 这两项沿用上期实际公网映射地址,示例值需替换 -->
    <param name="ext-sip-ip" value="203.0.113.10"/>
    <param name="ext-rtp-ip" value="203.0.113.10"/>
    <!-- 保留鉴权与原来受控的路由入口 -->
    <param name="auth-calls" value="true"/>
    <param name="dialplan" value="XML"/>
    <param name="context" value="public"/>
    <!-- 入站与出站分别设置,逗号分隔且左边优先 -->
    <param name="inbound-codec-prefs" value="PCMA,PCMU"/>
    <param name="outbound-codec-prefs" value="PCMA,PCMU"/>
    <!-- 入站以本地偏好选共同编码,本实验提前完成协商 -->
    <param name="inbound-codec-negotiation" value="greedy"/>
    <param name="inbound-late-negotiation" value="false"/>
    <!-- 允许媒体在服务器处理,两腿编码不同时可转码 -->
    <param name="disable-transcoding" value="false"/>
  </settings>
</profile>

inbound-codec-prefs 用在本 Profile 收到的呼叫,outbound-codec-prefs 用在它发起的呼叫。这里的“入站、出站”是相对于 FS 的呼叫腿。7101 拨 7102,先是 7101 到 FS 的入站腿,再由 FS 建立到 7102 的出站腿。如果注册定位把 7102 送到另一个 Profile,出站那边还要核对那个 Profile 的列表。一次测试最好让两台话机都使用 training-internal,并核对实际注册记录。

PCMA,PCMU 是逗号分隔的名称列表,没有时间或码率单位。greedy 表示在双方都支持的编码里按本地顺序挑选。generous 则优先考虑远端提供的顺序。这里明确选 greedy,便于比较“本地写在前面”和“对端提供在前面”的区别。偏好再靠前,也得有双方共同支持的格式才能用。

为什么本例把晚协商关掉

inbound-late-negotiation=false 让本次实验走提前协商的路径,便于先确认 7101 到 FS 这一腿,再看 FS 呼叫 7102 时提供了什么。启用晚协商时,可以把入站编码的确定推迟到后续呼叫处理阶段,具体还要看拨号计划是否提前接听、播放提示,以及是否配了 inherit_codec 等关联项。已有项目依赖晚协商时,先复制到独立测试入口做比较,再决定如何调整现网。

disable-transcoding=false 保留两腿使用不同编码时的转换能力。设为 true 会限制桥接时的编码选择,可能因为对端不支持入站已选编码而无法接通。关闭转码要连同实际出站 offer 一起检查。录音、播放和会议还涉及音频解码处理,选了相同编码也无法据此断定服务器没有处理媒体。转码消耗多少资源,要用本机的话务、编码和业务功能测量,本期不提供并发估算。

加载后先测双方都有的编码

等实验通话结束,在 fs_cli 执行下面几行。重启 training-internal 会影响它承载的通话,生产变更先把这部分话务移走。show codecs 用来确认当前可用的编码,不是显示这通电话最终用了什么。两台话机重新注册后,再开始新通话。

reloadxml
sofia profile training-internal restart
sofia status profile training-internal
show codecs

让 7101 和 7102 都启用 PCMA、PCMU,在 7101 上把 PCMU 排在前面。由 7101 发起呼叫,抓它到 FS 的 INVITE,确认它真的按这个顺序提供了编码。再看 FS 给这条腿的应答以及运行中的编码。满足本例前提时,入站选择应反映 greedy 下的本地 PCMA 偏好。

接通后运行下面的查询,UUID 换成 show channels 里这次测试的通道标识,并对两条腿分别执行。read_codec 是 FS 从该通道读入音频所用的编码,write_codec 是向该通道送出音频所用的编码。查询要在通道还存在时做,保存输出前先脱敏。

show channels
uuid_getvar UUID read_codec
uuid_getvar UUID write_codec

SDP 的 m=audio、a=rtpmap 和运行时编码一起看。RFC 3264 允许协商多个可用格式,单看 offer 里的第一项不能代替运行时判断。RTP/AVP 下 PCMU 和 PCMA 的常见静态负载类型分别是 0 和 8,动态映射按当通 SDP 解释。

再让两端故意没有共同编码

把 7101 的语音列表缩到 PCMA,7102 缩到 PCMU,分别保存设置后建立一通新呼叫。FS 这一端仍同时支持两种。检查入站腿与 7102 那条腿各自协商的格式,再查询两条腿的 read_codec 和 write_codec。若两腿分别是 PCMA 与 PCMU,媒体经 FS 正常处理且双方能互相听见,就能确认本例的话路完成了两种编码间的转换。

把两台话机改回双方支持的列表后反向拨一次。若原测试路径还要服务 7190 队列,再走一次座席接单,把实际承载被叫腿的 Profile 和编码也记录下来。目录分机、agent 的联系地址和 tier 的派单关系仍是不同对象。

四种不符合预期的表现

  • 已把 PCMA 写在前面,实际仍选 PCMU。先看呼叫有没有命中实验 Profile,再看对端是否真的提供 PCMA,最后查通道或拨号串里有没有覆盖列表。
  • 内网互拨能通,接中继报 488。检查报错发生在哪条腿,对照双方 SDP 的共同格式、采样率和其他媒体条件。488 也可能来自其他协商限制,继续看对应日志。
  • 两端各留一种编码后失败。确认 FS 有两种编码、测试媒体经过 FS,再查 disable-transcoding 和 absolute_codec_string 等限制。保留失败时的 offer 与 answer,修完用同一组端点复测。
  • 改完配置旧通话没变化。旧通话已经完成过协商,重新建立测试通话再比较。若双方都有声但质量差,进一步看丢包、时序和编解码处理,先前的公网 RTP 路径也要核对。

常用覆盖项和回退

absolute_codec_string 适合给指定通话腿严格限定编码,codec_string 用来表达该通道的偏好。设置在哪条腿、通过 set 还是 export 传递、是否写进 bridge 参数,都会影响结果。运营商中继需要单独要求时,可以在它的受控路由里限定,先把实际出站 offer 对上,再考虑推广到其他线路。采样率以 Hz 表示,打包间隔 ptime 以毫秒表示,它们也要与对端能力匹配,编码名称相同仍需检查关联参数。

回退时先结束实验通话,恢复备份的 Profile、原拨号路径和两台话机的编码列表。reloadxml 后重启实验 Profile,重新注册并按原设置互拨。保留两组测试的 SDP、两腿编码和听音结果,下次接新线路时就有可对照的记录。

资料来源


评论