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

时间:2012-12-26 18:04:48

标签: ffmpeg libavcodec libav libavformat

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

致电:

avcodec_decode_video2(codecCtx, frame, &frameFinished, &packet); // mpeg2 video

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

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

返回输出:

    packet flags: 1 picture type: P

我期待的时候:

    packet flags: 1 picture type: I  

其中'1'== AV_PKT_FLAG_KEY。并且'我'指的是AV_PICTURE_TYPE_I,

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

1 个答案:

答案 0 :(得分:8)

我收到了来自ffmpeg bugtracker的回复:

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

  

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

而且,实际上我在3帧之后打印出了> pict_type“图片类型”,有一个I帧会在几帧之后弹出,其中“延迟”的排序恰好是3帧之后。就我而言,我有一台四核计算机,所以也许我的计算机上为每个核心分配了一个线程来进行编码。