Skype 的 SILK 编解码器

信息处理 声音的
2022-02-19 22:58:53

让我首先澄清我将在下面使用的术语。

编解码器数据包是编码器在调用一次时返回的压缩数据。

RTP 有效载荷可以由一个编解码器数据包或一系列编解码器数据包组成。

我的问题:

SILK 的 RFC 是否允许 RTP 有效负载包含多个编解码器数据包?

如果是这样,我如何将接收到的 RTP 有效负载拆分为编解码器数据包,以便以后可以及时解码每个数据包(一次一个编解码器数据包)?

例子:

应用程序使用 SILK 对 20 毫秒 16 位 LPCM 音频块进行编码。每个编解码器数据包都被向下发送到网络堆栈以通过 RTP 传输。假设前 4 次调用编码器,编码器输出:

1) 大小为 39 字节的 20ms 编解码器包 2) 大小为 35 字节的 20ms 编解码器包 3) 大小为 41 字节的 20ms 编解码器包 4) 大小为 32 字节的 20ms 编解码器包

应用程序中的网络堆栈组装由 4 个编解码器数据包组成的 RTP 有效负载。所以在这种情况下,RTP 有效负载大小为 39 + 35 + 41 + 32 = 147 字节。

在接收端,接收到 147 字节的 RTP 有效载荷。接收应用程序应该如何将 RTP 有效负载拆分为原始的 4 个分别为 39、35、41 和 32 字节的编解码器数据包????

我很确定 RFC 不允许这种情况,但我想确定一下。有人可以确认 RFC 是否允许每个 RTP 有效负载多个编解码器数据包???

据我了解,RFC 仅允许每个 RTP 有效负载一个编解码器数据包。如果希望每个有效负载发送 80 毫秒,则应该将编码器配置为输出 80 毫秒编解码器数据包(而不是 20 毫秒)。它是否正确???

1个回答

我相信你是对的。

Silk 的 RFC 允许最多 5、20 毫秒的数据段表示每个 RTP 数据包的单个帧。

从 rfc 草案...

4.2. 有效载荷结构

SILK 编码器可以设置为输出代表 20、40、60、80 或 100 毫秒语音或音频数据的编码帧。只有编码器输出的一帧必须用作有效载荷。图 1 显示了结合 RTP 头的结构。

+----------+--------------+ |RTP 标头| 丝绸有效载荷 | +----------+--------------+

有关详细信息,请参阅http://tools.ietf.org/id/draft-spittka-silk-payload-format-00.txt 。还要搜索最新的 RFC 草案,以确保您是最新的。