2010-11-02 146 views
3

我想解析来自轴摄像头的rtp流中不同的mpeg4帧,并使用avcodec_decode_video函数将数据包送入ffmpeg库。这里是我正在做的步骤 1. rtsp流初始化 2. rtp流开始流动在 3.我得到的第一个数据包以000001b0开始...并且配置数据如下,并且在该帧之后以000001b6开始.. 秒rtp有效载荷将不同,直到我得到一个rtp数据包标记位设置。后我再次得到数据包从000001b6开始,并继续大约5-10 rtp数据包..这种模式repeast从rtp数据包解析MPEG4帧

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

但我在这里得到了一个蹩脚的图片,最上面的部分是一个单杠 - 水晶般清晰的图片,其余的都很糟糕。我不确定它为什么会这样。请帮助我

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

需要注意的是:当我通过其他制造商的propreitary协议中专注的iframe和p帧时,ffmpeg能够解析并给出非常好的pcpers。

任何帮助表示赞赏

回答

9

尝试在AXIS IP摄像机上摆弄您的MPEG4流设置。注意在视频&图像/高级部分,你应该设置这样的:

  1. 视频对象类型:SIMPLE
  2. [X] ISMA兼容
  3. GOV结构:IP

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

如果没有这个工程,然后读更多...

我希望你理解了MPEG4码流是如何通过RTP传输。在短(如果你不知道如何):

  1. “配置框架”(可视目标序列开始)一个整数000001B0(十六进制)开始。它包含了视频解码所需的数据。只有在您第一次尝试解码流时,您才需要将其发送给解码器,并且将其用于解码所有后续的VOP。请注意,AXIS以SDP(响应RTSP中的DESCRIBE)发送此数据包,例如: a=fmtp:96 profile-level-id=245; config=000001B0F5000001B5891300000100000001200086C40FA28A021E0A21。所以如果流不会改变,并且你在SDP中得到这个,你不需要将VOS传递给解码器......但是如果你这样做,没有任何伤害。

  2. 视频对象平面(I-VOP,P-VOP,B-VOP)以整数000001B6开头。如果您将GOV长度设置为10,并将流的结构设置为“IP”,则您将获得1个I帧(I-VOP)和9个P-VOP-s,但所有码都将有000001B6起始码。区分它们的技巧是检查FIFTH字节中的下两个BITS。检查表来确定VOP的类型,你得到:

    VOP_CODING_TYPE (binary) Coding method 
             00 intra-coded (I) 
             01 predictive-coded (P) 
             10 bidirectionally-predictive-coded (B) 
             11 sprite (S) 
    

现在,视频,你必须有VOS发送到解码器进行解码,紧跟着的一个I-VOP。但是,从RTP流中提取这些帧的方式很尴尬......如果I-VOP的大小是10000B,并且您的网络MTU是1400B,则您无法按原样发送它,也没有网络拥塞。因此,AXIS摄像机将I-VOP和所有其他BIG帧分割为它通过RTP发送的FRAGMENTS,作为大小不超过MTU的RTP数据包。主要思路是这样的(例子):

  1. 拆分10000B分成MTU大小的片段(对于1400B MTU你会得到大约8倍[1400B]和1个[200B]片段)
  2. 发送每一个与RTP标记位设置为与RTP标记位设置为1 0
  3. 发送最后一个片段,以纪念过去的片段

现在,当你收到此,你还挺有想法,但你需要恢复秩序原10KB FRAME供解码器解码。你所做的只是解码更大帧的第一个MTU字节,而你发送给解码器的所有其他片段都将被丢弃。这就是为什么你可以得到低劣的图片...

要恢复原来的框架:如果标记设置为

  1. 接收与起始码000001B6000001B0和RTP标记位设置为0的数据包1,这是整个框架,你可以解码它,因为它!如果它是0,则更多部分遵循...
  2. 将所有后续片段的第一个片段放入缓冲区,直到您将MARKER BIT设置为1为止。当您获取最后一个片段时,将其放入缓冲区。
  3. 您的缓冲区现在包含一个完整的帧,您可以发送给解码器!

那里,希望我帮忙... :)