2014-02-14 121 views
2

我想了解ffmpeg流视频处理的知识。ffmpeg如何从['P'帧]计算完整帧['I'帧]。它在概念上是正确的?

我的理解:

我从IPED Camaera,像“IPPPPPPPPPPPPPPPPIPPPPPPP”的帧得到..

框架“我”是一个完整的框架,其中为框架“P”依赖于前面无论是“P”还是“I”都是关闭的。

我用avcodec_decode_video2

while (av_read_frame (context, &packet) >=0) 
{ 
     //LOGD (" Received PACKET...DTS and PTS %ld and %ld ", packet.pts, packet.dts); 

     if(packet.stream_index == videoStreamIndex) { 
       avcodec_decode_video2 (pCodecCtx, pFrame, &finished, &packet); 
       if (finished) { 
       // Here is my frame, getting the type by av_get_picture_type_char(pFrame->pict_type). 
      } 
} 

现在,当我只显示我已收到帧获得框架,看起来像每当“我”收到的帧,它显示正常,当收到“P”帧,图像是一个折腾。

1)我们需要手动进行任何计算以将'P'帧转换为'I'帧,以便它可以被渲染? 2)如果不是(1),我必须注意什么?.. DTS/PTS计算是否在这里做魔术?

回答

2

P帧不依赖于前一个P帧,它依赖于前一张图片。因此,例如,如果您有IPP,则需要I和第二个P使用第三个P,而不仅仅是第二个P,而不仅仅是第二个P。

decode_video2为您做插值并返回图像,所以它抛弃的原因必须是不同的东西。

PTS/DTS告诉你什么时候显示帧,但帧仍然必须有效。

+0

感谢乔治,如果我只对显示视频帧感兴趣,我还需要做PTS/DTS计算吗? – Whoami

+0

您需要从帧中获取PTS信息,告诉您何时显示特定帧(否则您的视频将播放的速度与设备一样快)。 DTS你不应该在意,因为它们是由FFmpeg本身处理的。 –

+0

谢谢,你有没有参考,如何处理点计算,因为它真的很混乱,没有人提供具体的解释。 – Whoami