我正在尝试从来自轴摄像头的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能够解析并提供非常好的性能。
任何帮助我们都将不胜感激
发布于 2011-01-26 17:29:03
尝试在AXIS IP摄像机上摆弄您的MPEG4流设置。请注意视频和图像/高级部分,您应该将其设置为:
此外,尝试更改“优先级”或“优化视频流”设置(您应该有帧速率,图像质量,带宽,无)。
如果这些都不起作用,那就多读点...
我希望您了解MPEG4流是如何通过RTP传输的。简而言之(如果你不确定该怎么做):
000001B0(十六进制)开始。它包含视频解码所需的数据。你只需要在第一次尝试解码一个流的时候把它发送到解码器,它被用来解码它之后的所有VOP。请注意,AXIS在SDP (响应于在RTSP中描述)中发送此数据包,例如:a=fmtp:96 profile-level-id=245; config=000001B0F5000001B5891300000100000001200086C40FA28A021E0A21。因此,如果流永远不会改变,并且你在SDP中获得了这一点,那么你不需要将VOS传递给解码器……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数据包。主要思想是这样的(示例):
现在,当你收到这段视频的时候,你大概明白了,但是为了让解码器解码,你需要恢复原来的10KB帧。这样做,您只解码了更大的帧的第一个MTU字节,而您发送到解码器的所有其他片段都将被丢弃。这就是为什么你能拍到这张烂照片。
要恢复原始帧,请执行以下操作:
000001B6或000001B0且RTP标记位设置为0的数据包。如果标记设置为1,那就是整个帧,您可以直接解码它!如果为0,则more parts follow...希望我能帮上忙..。:)
https://stackoverflow.com/questions/4082080
复制相似问题