首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析RTP包中的MPEG4帧

解析RTP包中的MPEG4帧
EN

Stack Overflow用户
提问于 2010-11-03 05:03:57
回答 1查看 6.1K关注 0票数 3

我正在尝试从来自轴摄像头的rtp流中解析不同的mpeg4帧,并使用avcodec_decode_video函数将数据包提供给FMPEG库。下面是我正在做的步骤1. rtsp流被初始化2. rtp流开始流动3.我得到的第一个包以000001b0开始…然后是配置数据,在该帧之后以000001b6..第二个rtp有效负载将是不同的,直到我得到一个设置了标记位的rtp数据包。之后,我再次得到以000001b6开始的数据包,并继续大约5-10个rtp数据包。此模式重复

我正在做的是,如果我检测到000001b0/b6 -i将累加所有之后到来的数据包,并在正确初始化解码器上下文后将更大的缓冲区提供给libavcodec的avcodec_decode_video函数。

但我在这里得到了一张糟糕的图片,最上面的部分,一张水平条-水晶般清晰的图片,其余的都很糟糕。我不知道它为什么会这样。请帮帮我

我在rtp数据包中获得的数据是dynamic-96。

要注意的是:当我传递iframe和p帧时,这两个帧专注于其他制造商的propreitary协议,ffmpeg能够解析并提供非常好的性能。

任何帮助我们都将不胜感激

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-26 17:29:03

尝试在AXIS IP摄像机上摆弄您的MPEG4流设置。请注意视频和图像/高级部分,您应该将其设置为:

  1. 视频对象类型:符合SIMPLE
  2. ISMA的
  3. GOV结构: IP

此外,尝试更改“优先级”或“优化视频流”设置(您应该有帧速率,图像质量,带宽,无)。

如果这些都不起作用,那就多读点...

我希望您了解MPEG4流是如何通过RTP传输的。简而言之(如果你不确定该怎么做):

  1. "Configuration frame“(可视对象序列开始)以整数000001B0(十六进制)开始。它包含视频解码所需的数据。你只需要在第一次尝试解码一个流的时候把它发送到解码器,它被用来解码它之后的所有VOP。请注意,AXIS在SDP (响应于在RTSP中描述)中发送此数据包,例如:a=fmtp:96 profile-level-id=245; config=000001B0F5000001B5891300000100000001200086C40FA28A021E0A21。因此,如果流永远不会改变,并且你在SDP中获得了这一点,那么你不需要将VOS传递给解码器……
  2. 视频对象平面(I-VOP,P-VOP,B-VOP)以整数000001B6开头。如果您将GOV length设置为10,并将流的结构设置为"IP“,您将获得1个I帧(I-VOP)和9个P-VOP-s,但所有这些都将具有000001B6起始码。区分它们的诀窍是检查第五个字节中的下两位。检查下表以确定您要获取的VOP类型:

VOP_CODING_TYPE (二进制)编码方法00帧内编码(I) 01预测编码(P) 10双向预测编码(B) 11子画面(S)

现在,要解码视频,必须将VOP发送到解码器,紧跟其后的是I-VOP。但是首先,你从RTP流中提取这些帧的方法很笨拙...如果I-VOP的大小是10000B,而您的网络MTU是1400B,则无法按原样发送它,并且不会出现网络拥塞。因此,AXIS camera将I-VOP和所有其他大帧分割为碎片,并通过RTP发送大小不超过MTU的RTP数据包。主要思想是这样的(示例):

  1. 将10000B拆分为多个MTU大小的片段(对于1400B MTU,您将获得大约8x1400B和1x200B的fragments)
  2. Send,每个片段的RTP标记位设置为0
  3. 发送最后一个片段,RTP标记位设置为1,以标记最后一个片段

现在,当你收到这段视频的时候,你大概明白了,但是为了让解码器解码,你需要恢复原来的10KB帧。这样做,您只解码了更大的帧的第一个MTU字节,而您发送到解码器的所有其他片段都将被丢弃。这就是为什么你能拍到这张烂照片。

要恢复原始帧,请执行以下操作:

  1. 接收起始码为000001B6000001B0且RTP标记位设置为0的数据包。如果标记设置为1,那就是整个帧,您可以直接解码它!如果为0,则more parts follow...
  2. Place第一个片段所有随后的片段进入缓冲区,直到获得标记位设置为1的片段。当您获得最后一个片段时,将其放入缓冲区。
  3. 您的缓冲区现在包含一个完整的帧,您可以将其发送到解码器!

希望我能帮上忙..。:)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4082080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档