让我记住有关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)获取此流。答案 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接口的示例。