我正在尝试获取ffmpeg流视频处理的知识。
我的理解:
我从IPed Camaera那里得到像'IPPPPPPPPPPPPPPPPIPPPPPPP'这样的帧。
帧'I'是一个完整的帧,其中帧'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计算在这里有效吗?
答案 0 :(得分:2)
P帧不依赖于之前的P帧,它取决于之前的图片。所以,例如,如果你有IPP,你需要我和第二个P来使用第三个P,而不仅仅是第二个P.
decode_video2
为你做插值并返回图像,所以它折腾的原因必须是不同的。
PTS / DTS告诉您何时显示帧,但帧仍然必须有效。