h264 RTP 时间戳

问题描述 投票:0回答:3

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

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

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

提前谢谢您。

video h.264 rtp x264
3个回答
16
投票

无论您的编码器以 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时间戳

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

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

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

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


7
投票

对此没有简单的公式。

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

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

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

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

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

我在这里不使用术语 DTS 是有原因的,因为您不需要解码 timestamp 来使其工作,只需要顺序。

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.