在标志中解码包含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视频)。
答案 0 :(得分:8)
我收到了来自ffmpeg bugtracker的回复:
https://ffmpeg.org/trac/ffmpeg/ticket/2074
我怀疑你错过了编解码器延迟。 您获得的视频帧通常不是基于您刚刚发送的数据包。对于多线程解码尤其如此,但即使没有它,由于B帧的工作原理通常也不可能。
而且,实际上我在3帧之后打印出了> pict_type“图片类型”,有一个I帧会在几帧之后弹出,其中“延迟”的排序恰好是3帧之后。就我而言,我有一台四核计算机,所以也许我的计算机上为每个核心分配了一个线程来进行编码。