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

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

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

先感谢您。

没有正确的解决方案

其他提示

如果您的编码器在10FPS或30FPS的视频编码与RTP时间戳你告诉接收机如何长的两帧之间的停顿没关系。所以,你确定在飞行的每一帧。这样,你可以在一秒钟内(10FPS)发送10帧,而在其他第二,你可以发送30帧(每秒30帧)。你只需要正确设置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帧编码。

此外,如果视频为30fps,这并不意味着,对于每个第二会有30个RTP分组。有时可以有更多然后100,这样就可以不具有确保正确的RTP时间戳计算的公式。

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

对此没有简单的公式。

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

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

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

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

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

我没有使用这个词 数字传输系统 这里是有原因的,因为你不需要解码 时间戳 为此,只需执行命令即可。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top