摘要

  • DV 把负满幅值当作“本采样周期没有有效音频”的错误哨兵;RFC 3190 的 DAT12、L16、L20 RTP 表示却把所有数值都视为合法声音。
  • 从 DV 到 RTP,桥接器可能先掩盖磁带读取错误;从 RTP 回到 DV,它又可能改动一个真实采样以免被误判为错误。互操作保住了播放,却改变了证据。

数值没有自带解释权

在 DV 里,12 位的 800h、16 位的 8000h 和 20 位的 80000h 都不是普通波形低点。它们表示在那个采样周期里没有获得有效音频,磁带读取失败便可能留下这种哨兵。

RFC 3190 没有把这些位置从 RTP 数值空间里挖掉。DAT12、L20、L24 的每一个可能值都能成为音频;已有的 L16 也是如此。来自别种声源的负满幅值完全可能是真实信号。

因此,逐比特复制并不等于保持含义。去往网络时,桥接器要为不存在的磁带采样选择替代;回到 DV 时,它又要阻止真实声音被设备当成故障。冲突发生在语义层,而非封包容量。

掩盖能修好节目,不能找回源采样

RFC 建议 DV 到 RTP 的发送端执行错误掩盖,却没有规定算法。单点失败和连续失败可以使用不同策略:插值、重复、静音或实现自己的处理。发送端也可以把错误值当作音频直接发出,但文档警告这很可能产生不良听感。

掩盖服务于实时播放。它不会恢复磁带没有读出的值。一旦 8000h 被替换,网络包准确记录的是桥接器的补救,而不是原始介质的输出。

于是,一份 RTP 抓包可以在传输意义上完整,却无法说明上游曾经读带失败。声音越平滑,故障痕迹反而越难被后来者发现。若没有旁路日志,算法生成的波形会永久伪装成录得的波形。

反向转换必须牺牲合法数据

RTP 到 DV 面临相反风险。合法负满幅采样若原样交给 DV,设备会把它理解为错误。RFC 建议把 800h 改成 801h,把 8000h 改成 8001h。

20 位情况需要移动整个 80000h 至 8000Fh 区间,将它们变成 80010h。原因是 16 位系统可能简单丢掉四个最低位来播放 20 位音频;十六个不同的 20 位值都会坍缩成同一个 16 位错误哨兵。

这不是无损转换,而是受控失真。系统改动真实采样,换取下游不误判。24 位没有相同规则,因为引用的 DV 规范并不包含该编码;把 20 位规则类推过去会制造没有来源的语义。

十二位节省的是线路,不是证明成本

DAT 长播放把 16 位线性采样压成 12 位非线性值。若先扩展成 L16 再发送,带宽会多用 33%。DAT12 保留紧凑形式。

从 -2048 到 2047 的二补码采样按最高位优先连续装入。采样数为奇数时,最后一个字节的四个低位不用。L20 也会留下半字节,L24 则自然落在整字节边界。

这些规则只证明数字如何拆装。它们不证明磁带无错、桥接器未掩盖、听感正确或声源可信。解析器可以毫厘不差地还原一个由算法补出的值。

DV 块顺序必须改写成 RTP 时间顺序

RTP 先放同一时刻的各声道,再进入下一时刻。原生 DV 音频块的排列不同。把 DV 音频抽出并装入 DAT12、L20、L24 或 L16 的应用必须重排采样;若保持原生音视频捆绑结构,则应使用 DV 载荷格式。

一至三声道沿用隐含的 AIFF-C 顺序。四声道以上需要在带外给出 channel-order,并且声明必须与声道数相符。允许的 DV 组合由固定符号连接而成,特意不留分隔符,以免实现随意拼出新排列。

五声道即使只有一种合法顺序,也必须声明。小规模声道却必须省略该参数,以兼容旧实现。参数存在与缺席各自有协议含义。

共同播放的声道可以放进同一 RTP 流。彼此独立的语言节目应分开成不同会话,让接收者只订阅想听的内容,而不必承担全部带宽。

包完全正确,声音仍可能过亮

模拟预加重发生在量化之前。RFC 定义 emphasis=50-15 在带外说明这种处理,并要求没有预加重时绝不能携带该属性。

旧应用可能接受 SDP 却忽略参数。包照常到达,采样照常解码,但接收端会听起来过亮,发送端则可能过闷。传输成功并不能证明再现忠实。

DAT12、L20、L24 说明数值表示;采样率和声道数说明网格;声道顺序说明位置;预加重说明量化前的模拟变化。任何一项单独成立,都不能证明对端执行了完整解释。

RFC 3190 协调的是差异,不是同一性

文档注册了三个音频媒体子类型,也规定了 DAT、DV 与 RTP 相遇时的转换边界。它没有假装三者拥有相同的原生约定。

桥接器可以掩盖故障、移动合法采样、重排声道,或依赖旧端忽略的元数据。每一步都可能改善互操作,也都会产生新表示。

8000h 的历史意义就在这里:比特本身没有裁判权。一套合同让它成为声音,另一套合同让它成为“声音缺席”。只有在波形之外保存转换收据,系统才不会把修复后的连续误写成从未失败。