繁体   English   中英

h264 RTP 时间戳

[英]h264 RTP timestamp

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

谁能告诉我以下编码数据包的时间戳。
经过 0 毫秒编码的 RTP 时间戳 = 0(让起始时间戳为 0)
经过 50 毫秒编码的 RTP 时间戳 = ?
经过 40 毫秒编码的 RTP 时间戳 = ?
经过 33 毫秒编码的 RTP 时间戳 = ?

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

先感谢您。

如果您的编码器以 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 帧进行编码。

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

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

对此没有简单的公式。

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

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

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

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

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

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

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

我在我的应用程序中使用这个公式来计算 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM