摘要
mode-set-recv与recvmode属于接收方向,只表达本端希望远端编码器采用什么模式;远端可以忽略。sendmode属于发送方向,只声明发送方当前模式。- 参数出现不等于方向正确,方向正确也不等于执行已经发生。可靠记录必须把会话角色、SDP 版本、编码器变更与 RTP 帧放在同一时间线上。
一条 sendonly 流的 SDP 里出现了 mode-set-recv=0,4。自动审计看到熟悉字段,便判定远端已经接受模式限制。问题不在字段拼写,而在方向:这个端点不接收该流,所谓“接收偏好”没有可作用的媒体。
复制器创造了符号,仪表盘替它发明了权力。
方向决定谁能说什么
RFC 5188 为 EVRC-WB 定义 mode-set-recv,让接收端说明它偏好的远端编码模式集合;为 EVRC-B 定义 recvmode,表达单一偏好。两者都是 receive-only。
sendmode 恰好相反。它由发送方声明当前编码器模式,是 send-only。规范明确指出:sendonly 流不应使用 mode-set-recv,recvonly 流不应使用 sendmode。
因此,证据不能只保存参数名和值。还要保存是谁写的、针对哪个方向、绑定哪个 payload、属于哪一版 offer/answer。失去这些坐标后,数字 4 既可能是本端偏好,也可能是远端声明,还可能只是中间件复制的无效文本。
偏好没有接管远端编码器
接收端可以要求模式 0,远端仍可选择模式 4,并且保持合规。RFC 5188 说明远端发送方可以忽略 mode-set-recv 或 recvmode,接收方仍应正确解码。
这不是规范漏洞,而是权责设计。接收方掌握偏好,发送方掌握允许范围内的编码决策。会话系统应记录“请求已收到”“策略选择尊重或忽略”“当前模式已声明”“特定帧确实按该模式编码”四个不同状态。
若把偏好写成命令,被允许的选择会触发误报。若看到偏好字段就写成“已执行”,真正没有落实的请求又会得到假绿灯。正确状态应包括已尊重、明确未尊重、peer 版本未知、字段方向不适用、声明尚未被媒体证据确认。
SDP 可以落后于 RTP
sendmode 声明当前编码器模式,但 RFC 5188 特别提醒:RTP 媒体可能早于首次或更新后的 sendmode SDP 到达。
这意味着控制文本与媒体不是同一个时钟。如果编码器在 T1 切换到模式 4,媒体在 T2 到达,SDP 更新在 T3 才到,T1 到 T3 之间保存的“最后已知模式”已经过时。T3 的声明也不能自动给此前每个包补写时间戳。
审计必须保留 offer/answer 版本时间、编码器切换时间、RTP 发送与到达时间、解码器摄取时间。只有这些事件能说明声明覆盖哪一段媒体。SDP 晚到不等于媒体违规;媒体与声明长期矛盾也不能用“最终一致”掩盖。
Payload 名称不替编码器作证
audio/EVRCWB、audio/EVRCWB0 与 audio/EVRCWB1 分别绑定 interleaved/bundled、header-free 与 compact bundled 格式。它们回答的是 payload 应怎样解析,不是每一段使用模式 0、4 还是 7。
EVRC-WB 的模式 4 与 7可与 EVRC-B 互操作。offerer 还应同时公布 EVRC-B 支持,让只懂旧格式的 answerer 能选择 fallback。选中某种 codec 证明协商的解释规则,不证明声音路径、编码模式或质量结果。
16 kHz RTP clock 也容易被误读。规范要求 EVRC-WB 始终使用 16 kHz 时钟,即使编码器输入或解码器输出配置为 8 kHz。rtpmap 中的 16000 是时间尺度,不是麦克风、扬声器或声学带宽收据。
兼容性会留下“缺字段”
RFC 5188 给 RFC 4788 的 EVRC-B 注册新增 recvmode 和 sendmode。旧实现不会发送,也会忽略收到的新参数,从而保持互操作。
所以字段缺失不能直接解释为模式 0、拒绝或故障。它可能是 legacy peer、可选字段省略、中间件归一化或抓取不完整。没有版本证据时,最诚实的值是 unknown。
未知参数必须在 offer 中被忽略,并且不得复制到 answer。这个规则防止端点假装理解并达成协议。要求“原样回显”反而会奖励虚假的语义一致。
EVRCWB1 的固定模式需要会话边界
EVRCWB1 要求整个会话保持相同固定速率与模式。若同一会话身份中观察到中途切换,就不能仅凭一份更新 SDP 宣布合理。
需要证明旧配置何时结束、新会话或新 payload binding 是否建立、每个包属于哪段配置。两段各自合法的会话如果被错误合并,会看似违规;一次真实违规如果只保留最终文档,也会消失。
固定规则加强的是时间与身份校验,并没有把接收偏好升级为执行收据。
最小但完整的证据链
记录从不可变 session/change ID 开始,包括双方角色、媒体方向、offer/answer 版本、候选与选中 payload、media subtype、RTP clock,以及原始 rtpmap、fmtp、ptime、maxptime。
随后记录偏好由谁提出,发送方策略如何决定,是否尊重及原因;每次 sendmode 的值与到达时间;编码器配置切换;相关 RTP sequence、timestamp、到达时间与帧模式。legacy 能力、未知扩展处理和 EVRCWB1 固定模式也必须显式呈现。
最后才是解码器接受、输出状态与应用结果。能解码不证明偏好被尊重,偏好被尊重不证明声学质量,格式正确也不证明人听到了预期效果。每层只为本层事实负责。
领导决策
治理重点不应是“字段齐不齐”,而是“谁有权决定下一状态,声明何时生效,运行媒体如何证明”。
让偏好保持偏好,让声明保持声明,让编码器和帧拥有自己的收据。这样既不把互操作弹性误判为不服从,也不让一行 SDP 冒充远端执行事实。
来源
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
