我对h264 RTP数据包的时间戳感到困惑。我知道我在SIP SDP中定义的视频挂钟率是90KHz。我的编码器的帧速率不是30 FPS,它是可变的。它的速度从15 FPS到30 FPS不等。所以,我不能使用任何固定的时间戳。
任何人都可以告诉我以下编码包的时间戳
在0毫秒编码后的RTP时间戳= 0(让起始时间戳0)
经过50毫秒编码的RTP时间戳=?
经过40毫秒编码的RTP时间戳=?
经过33毫秒编码的RTP时间戳=?
编码帧速率可变时的公式是什么?
提前谢谢。
答案 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 (演示时间戳)。它超出了编码器的范围,在捕获帧时必须在数据流中记住它。
从那里,你有两种可能性:
在后一种情况下,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