h264 RTP时间戳

use*_*090 7 video rtp h.264 x264 rfc3984

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

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

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

先感谢您.

Cip*_*ipi 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  
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


xry*_*669 6

对此没有简单的公式。

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

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

  1. H264编码器不产生B帧,那么RTP时间戳应该是PTS+随机偏移量(所有流媒体会话都一样)
  2. 如果编码器生成B-frame(或B-slices),则需要修改解码顺序,因为B-frame需要下一帧解码,所以必须先发送。

在后一种情况下,RFC6184 指出您有多种方式来传输编码的 NAL 单元。

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

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

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