Video h264 RTP时间戳

Video h264 RTP时间戳,video,h.264,rtp,x264,rfc3984,Video,H.264,Rtp,X264,Rfc3984,我对h264 RTP数据包的时间戳感到困惑。我知道视频的时钟频率是90KHz,这是我在SIP SDP中定义的。我的编码器的帧速率不完全是30 FPS,它是可变的。飞行速度从15 FPS到30 FPS不等。所以,我不能使用任何固定的时间戳 有人能告诉我以下编码数据包的时间戳吗。 0毫秒后编码的RTP时间戳=0(让起始时间戳为0) 50毫秒后编码的RTP时间戳= 40毫秒后编码的RTP时间戳= 33毫秒后编码的RTP时间戳= 编码帧速率可变时的公式是什么 提前谢谢。编码器是以10FPS还是30FPS

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

有人能告诉我以下编码数据包的时间戳吗。
0毫秒后编码的RTP时间戳=0(让起始时间戳为0)
50毫秒后编码的RTP时间戳=
40毫秒后编码的RTP时间戳=
33毫秒后编码的RTP时间戳=

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


提前谢谢。

编码器是以10FPS还是30FPS的速度编码视频并不重要,使用RTP时间戳,您可以告诉接收器两帧之间的暂停时间有多长。因此,您可以为每一帧动态地确定该值。这样,您可以在一秒钟内发送10帧(10fps),在另一秒钟内可以发送30帧(30fps)。您只需要正确设置RTP时间戳。如果我听到你的问题,你会怀疑怎么做

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

Frame #      RTP Time   Time between frames [ms]
[  1]               0   0
[  2]           50000   50
[  3]           90000   40
[  4]          420000   33  
因此,如果您像这样设置RTP时间戳(时间单位:ms*100000)您将使解码器加载并解码第1帧,然后加载并解码第2帧,但它将在绘制第2帧之前休眠50 ms(第1帧和第2帧之间的时间差),依此类推

如您所见,解码器使用RTP时间戳来知道何时显示每个时间戳,并且它不介意视频是以30或10 fps的速度编码的

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


我想这就是你需要的。。。希望我能帮上忙,如果我没有帮上忙,就不要告诉我……)

这方面没有简单的公式

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

在此基础上,您有两种可能性:

  • H264编码器不生成B帧,则RTP时间戳应为PTS+随机偏移量(对于所有流会话相同)
  • 如果编码器生成B帧(或B片),则需要修改解码顺序,因为B帧需要解码下一帧,因此必须在之前发送
  • 在后一种情况下,RFC6184声明您有多种方式来传输编码的NAL单元

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

    我在这里使用术语DTS是有原因的,因为不需要解码时间戳,只需要顺序


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

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

    0毫秒后编码的RTP时间戳=0
    50毫秒后编码的RTP时间戳=0+50*90=4500
    40毫秒编码后的RTP时间戳=4500+40*90=8100

    在33毫秒编码的RTP时间戳=8100+33*90=11070之后,我不太清楚。我正在尝试解析nalu并发送rtp。问题是我必须自己计算时间戳。目前我很确定我做错了(timestamp lasttimestamp)*100000。每次从比特流读取新的nalu时,我都会设置新的时间戳,但这种形式会使时间戳在数据包之间发生变化,数据包a的时间戳可能比数据包B大!RTP时间戳除了告诉帧之间的时间差外,还告诉绝对时间。否则,它不能用于音频和视频之间的同步。@不,您不能在32位整数字段中可靠地设置绝对64位时间值。最好使其相对于0。关键是时间戳应该线性增加,相同的时间戳值应该出现在匹配的AV帧上,并且在设置时间戳时应该记住时钟速率值,所以在1AV秒内
    最后一帧时间戳-第一帧时间戳=时钟速率
    。您有RTP扩展头来存储您想要的任何其他数据,比如正确的时间戳(ticks),等等@Cipi我不是说NTP直接在RTP内。可以计算NTP 64位,因为RTCP将RTP 32位时间戳映射到NTP。更多详细信息:SR发送方的报告有:NTP时间戳(64位),格式为NTP,表示挂钟绝对日期和时间。RTP时间戳(32位)请参见rfc3550中的“6.4.1 SR:发送方报告RTCP数据包”