1. RTP Speex 头部
RTP头部在[RFC3550]中定义。本文定义RTP头部中各字段的用法。
Payload Type (PT): 本格式的负责类型号。
Marker (M) bit: 此位被用来标志一段无声后有声的开始。打在有声数据的第一个包上。 Speex支持声音检测,可以在无声时不产生帧数据。所以包可能是非连续传输的。
Extension (X) bit: 见RTP的规定。
Timestamp: 一个32位的整数,表示一个包中第一帧的采样时间。
2. Speex的RTP负载格式
Speex的RTP负载如图1所示。本格式没有附加的头部,所以只什用标准的RTP头部 头部之后是一个或多个负载数据库(speex帧)。包尾部可能需要一些填补数据。

图 1: Speex的RTP负载
3. Speex 负载
为了把编码后的数据打包进RTP,我们只需要考虑Speex编码器输出的比特流必须以相同的顺序出现在解码端。此处所说的负载格式保持了这个顺序。
一个典型的Speex帧,最大编码码率大约是110个字节。一个包中所有的Speex帧的总字节数应小用路径MTU以避免被分割。Speex帧绝不能被分割!
必须按时间序把帧打到包里。
一个RTP包中可能包含相同码率的帧也可能包含不同码率的帧。然而码率是在带内传送的,每帧中包含了自己的码率,所以打包时不必在意它。
编码和解码算法可以以20毫秒的帧为边界改变码率。 码率改变的通知是在带内传送的。每个帧都包含采样率(窄带, 宽带, 或 超宽带)和"模式"(码率)信息。所以不需要带外数据通知解码器处理那些变化。
采样率必须是8000 Hz, 16000 Hz, 或 32000 Hz之一。
RTP负载必须被填补数据以保证能提供整数个字节的数据,这些填补位是LSB(最低有效位)-对齐的并且按网络字节序放置,它是由一个0跟着一群1组成的。填补数据仅被包中最后一个帧所需要。并且仅仅为了保证一个包的内容按字节边界结束。
4. Speex RTP包的例子
下面的示例中,我们的包中一个Speex帧,还有5位的填补数据来保证包的大小是字节对齐的。

5. 多Speex帧的RTP包
下面的例子演示的是一个RTP包中有两个Speex帧。这个例子中的Speex帧的长度是字节对齐的,所以不需要填补数据。
Speex解码器可以从负载侦测码率,并负责在各帧之间检查20毫秒的的帧界限。
6. 媒体类型
媒体类型名字: audio
媒体字类型名字: speex
所需参数:
rate: RTP 时间戳时钟频率,等于采样率Hz。采样率必须是8000, 16000, 或 32000。
可选的参数:
ptime: 必须能被20毫秒整除 [RFC4566]
maxptime: 必须能被20毫秒整除 [RFC4566]
vbr: 可变码率 - 可为 'on', 'off', 或 'vad' (默认是'off')。如果是'on',可变码率被使用。如果是 'off',则不被使用。如果是'vad',那么固定码率被使用,但是无声时段将被编码为特殊的短帧来表明那段时间没有声音。这个参数
用于编码器。
cng: 产生舒适噪音 - 可为 'on' 或 'off' (默认是'off')。如果为 'off',无声帧就是无声,如果为'on',那么这些帧将被以舒适噪音填充。此参数被用于编码器。
mode: 以逗号分隔的多个speex支持的解码模式,按优先度排列。第一个具有最优先级,剩余的依次排列。对于窄带和宽带可用的模式值不一样,见以下定义:
* {1,2,3,4,5,6,7,8,any} 用于窄带
* {0,1,2,3,4,5,6,7,8,9,10,any} 用于宽带
mode'参数可能包含多个值。这此情况下,远端的编码器必须被配置成能支持模式列表中的第一个值。 当 'any' 被使用时,表明自己支持所有的解码模式。'mode' 参数必须永远有值。如果'mode' 没有出现,那么mode的值被置为:在
窄带下是'mode="3,any"',在宽带和超宽带下是'mode="8,any"' 。注意每个包含mode(或码率)的Speex帧必须被解码。因此,一个应用程序必须能解码任何Speex帧,除非在SDP中明确指明某些模式不被支持(例如,不含'mode="any"')。
解码端指定支持哪些模式意味着编码端也支持那些模式。
下节预告:Speex使用SDP。
(nkmnkm) |