如何知道RTP H264流中的数据包顺序

时间:2014-02-11 03:38:16

标签: h.264 rtp

让我记住有关H264 RTP数据包的事情。

如果你想观察下面关于句子的一些错误,请随意这样做。

1)IDR,也由作为整个图像的I帧命名,可以分组。

2)当我收到一个数据包并且它是“fragment_type == 28”(不仅如此,但让我知道我真的得到了一个片段)这意味着我有一个IDR片段。

3)每个数据包都有一个由发射器生成的序列号。序列包遵循一个顺序:如果包A的序号= 20,则发送者发送的下一个包将是21,依此类推。

现在回答我的问题:

A)如果我要重建IDR,我怎么知道哪些数据包属于这个IDR?让我举一个例子: IDR在数据包A,B,C和D中被分段。将始终数据包A的序列号为6606(仅作为示例),因此B将具有6607和C 6608和D 6609,例如序列号梅特?如果序列号没有完成,我想我在数据包中有一个字段,说“嘿!我是帧的一个片段”HelloWorld“。另一个数据包出现并说”嘿!我也是“HelloWorld”框架的一个片段。但其他数据包出现并说“嘿!我不属于我的其他朋友的HelloWorld框架,我属于框架”HelloHell“。那么,哪个字段显示我IDR属于哪个框架?

B)如何从数据包中提取SPS和PPS?我读了很多关于这个的主题,但我不明白这个信息在哪个字节。稍后得到它,我怎么能为我的解码器发送这些信息?

C)用户Cipi,我邀请您帮助我提供一些关于问题的代码示例B.Dude,您是如此有帮助。在知道之前我几乎所做的一切都是因为你的帮助。你能帮助我吗?

谢谢大家!我在我的软件中努力从IPcâmera(SONY SNC-EP580)获取此流。

1 个答案:

答案 0 :(得分:1)

  

1)IDR,也由作为整个图像的I帧命名,可以分组。

任何帧都可以分为多个数据包。这通常与网络的MTU有关。

  

2)当我收到一个数据包并且它是“fragment_type == 28”(不仅如此,但让我知道我真的得到了一个片段)这意味着我有一个IDR片段。

如上所述不正确。

  

3)每个数据包都有一个由发射器生成的序列号。序列包遵循一个顺序:如果包A的序号= 20,则发送者发送的下一个包将是21,依此类推。

     

A)如果我有重建的IDR,我怎么知道哪些数据包属于这个IDR?

分段单元的第一个数据包将在FU标头(有效负载的第二个字节)中设置起始位。碎片单元的最后一个数据包将设置结束位。有关碎片单元的详细信息,请阅读RFC6184中的第5.8节。

  

如何从数据包中提取SPS和PPS?

这取决于使用的分组模式。在单NAL单元模式中,每个NAL单元(例如SPS或PPS)将在其自己的RTP分组中。在非交错模式下,您通常必须将STAP数据包拆分为原始NAL单元。

  

稍后获取它,如何为解码器发送此信息?

这取决于解码器,所以你必须初始化,其他你可以通过NAL单元,例如SPS或PPS与任何其他NAL单位一样。

  

我邀请您帮助我提供有关问题B的一些代码示例。

同样,这是解码器特定的,开源VLC和ffmpeg代码包含如何与libavcodec接口的示例。