关键帧不是关键帧?AV_PKT_FLAG_KEY不解码为AV_PICTURE_TYPE_I

Mic*_*nes 5 ffmpeg libavcodec libav libavformat

在标志中解码包含AV_PKT_FLAG_KEY的数据包之后,我期待获得I帧,但我获得了P帧:

致电后:

avcodec_decode_video2(codecCtx, frame, &frameFinished, &packet); // mpeg2 video
Run Code Online (Sandbox Code Playgroud)

我打印出以下内容作为完整性检查:

    printf("packet flags: %d picture type: %c\n", packet.flags,
            av_get_picture_type_char(frame->pict_type));
Run Code Online (Sandbox Code Playgroud)

返回输出:

    packet flags: 1 picture type: P
Run Code Online (Sandbox Code Playgroud)

当我期待:

    packet flags: 1 picture type: I  
Run Code Online (Sandbox Code Playgroud)

'1'== AV_PKT_FLAG_KEY.和'我'指的是AV_PICTURE_TYPE_I,

这种行为是否正确?(我正在解码MPEG2视频).

Mic*_*nes 8

我得到了ffmpeg bugtracker的回复:

https://ffmpeg.org/trac/ffmpeg/ticket/2074

我怀疑你错过了编解码器延迟.您获得的视频帧通常不是基于您刚刚发送的数据包.对于多线程解码尤其如此,但即使没有它,由于B帧如何工作,通常也不可能.

而且,实际上我打印出3帧以后的 - > pict_type"图片类型",有一个I帧会在几帧之后弹出,其中"延迟"的确分别是3帧之后.在我的情况下,我有一个四核计算机,所以也许有一个线程被分配给我的计算机上的每个核心进行编码.