我正在尝试了解 ffmpeg 流视频处理的知识。
我的理解:
我从 IPed Camaera 获得类似“IPPPPPPPPPPPPPIPPPPPPP”的帧..
帧“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).
}
}
现在,当我只显示我收到的帧时,看起来每当收到“I”帧时,它都会正确显示,当收到“P”帧时,图像会抛出。
1)我们需要手动进行计算将“P”帧转换为“I”帧才能渲染?
2)如果不是(1),我需要注意什么?..DTS/PTS 计算在这里起作用吗?
最佳答案
P帧不依赖于前一个P帧,它依赖于前一个图片。因此,例如,如果您有 IPP,则需要 I 和第二个 P 才能使用第三个 P,而不仅仅是第二个 P。
decode_video2
为您进行插值并返回图像,因此它抛出的原因一定有所不同。
PTS/DTS 告诉您何时显示帧,但帧仍然必须有效。
关于ffmpeg如何从[['I'帧]计算完整的帧 'P'帧]。它在概念上是正确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21774817/