h264 RTP时间戳

时间:2010-03-13 16:39:34

标签: video h.264 rtp x264 rfc3984

我对h264 RTP数据包的时间戳感到困惑。我知道我在SIP SDP中定义的视频挂钟率是90KHz。我的编码器的帧速率不是30 FPS,它是可变的。它的速度从15 FPS到30 FPS不等。所以,我不能使用任何固定的时间戳。

任何人都可以告诉我以下编码包的时间戳 在0毫秒编码后的RTP时间戳= 0(让起始时间戳0) 经过50毫秒编码的RTP时间戳=?
经过40毫秒编码的RTP时间戳=?
经过33毫秒编码的RTP时间戳=?

编码帧速率可变时的公式是什么?

提前谢谢。

3 个答案:

答案 0 :(得分:13)

如果您的编码器以10FPS或30FPS对视频进行编码,则无关紧要,使用RTP时间戳告诉接收器两帧之间的暂停时间。因此,您可以动态确定每个帧。这样你可以在一秒钟内发送10帧(10fps),而在另一秒钟你可以发送30帧(30 fps)。您只需要正确设置RTP时间戳。如果我得到你的问题,你就会怀疑如何做到这一点......

让开始时间戳为0,您将挂钟时间(以毫秒为单位)乘以100加到最后一个RTP时间戳,或者您可以使用您想要的任何时间刻度。要使解码器以30fps解码10fps视频,请为每个数据包添加333000到RTP时间戳......但让我们看一下您的示例:

Frame #      RTP Time   Time between frames [ms]
[  1]               0   0
[  2]           50000   50
[  3]           90000   40
[  4]          420000   33  

因此,如果您设置RTP时间戳,如此(Time in ms * 100000),您将使解码器加载并解码帧1,然后加载和解码帧2,但它将睡眠50毫秒(帧1和帧之间的时差) 2)在绘制第2帧之前,依此类推......

正如您所看到的,解码器使用RTP时间戳来知道何时显示每个时间戳,并且如果视频以30或10 fps编码,则不会介意。

此外,如果视频为30 fps,这并不意味着每秒将有30个RTP数据包。有时候可能会超过100,所以你不能有一个公式来确保正确的RTP时间戳计算。

我想这就是你所需要的......希望我帮助过,如果我没有,请不要约会我... =)

答案 1 :(得分:3)

没有简单的公式。

用于在编码之前对帧进行采样的瞬间称为 PTS (演示时间戳)。它超出了编码器的范围,在捕获帧时必须在数据流中记住它。

从那里,你有两种可能性:

  1. H264编码器不生成B帧,那么RTP时间戳应该是PTS +随机偏移(所有流会话都相同)
  2. 如果编码器生成B帧(或B片段),则需要修改解码顺序,因为B帧需要解码下一帧,因此必须先将其发送。
  3. 在后一种情况下,RFC6184声明您有多种方式来流式传输编码的NAL单元。

    大多数流媒体软件将使用称为“非交错”的模式,其中,您必须将RTP时间戳设置为PTS +偏移量,但是按解码顺序发送它们,以便时间戳不会单调增加。 这也意味着客户端必须按接收的顺序进行解码,而不是按照PTS顺序对帧进行重新排序。

    我在这里没有使用术语 DTS ,原因是因为您不需要解码时间戳来实现此功能,只需订单。

    RFC6184中描述的最后一种模式是所谓的交错顺序,您可以在其中重新排序NAL单元。在这种情况下,您必须实现一些应用程序逻辑来重新排序单元,有关详细信息,请参阅RFC6184。

答案 2 :(得分:0)

我在应用程序中使用此公式来计算h.264视频流的RTP时间戳字段:
时间戳= LastTimestamp + Inverval(ms)* 90000/1000

在0毫秒编码的RTP时间戳= 0之后
50毫秒编码后的RTP时间戳后= 0 + 50 * 90 = 4500
40毫秒编码后的RTP时间戳= 4500 + 40 * 90 = 8100
经过33毫秒的编码RTP时间戳= 8100 + 33 * 90 = 11070