解码标记中包含AV_PKT_FLAG_KEY的数据包后,我希望得到I帧,但我得到的却是p帧:
调用后:
avcodec_decode_video2(codecCtx, frame, &frameFinished, &packet); // mpeg2 video
我打印出以下内容作为完整性检查:
printf("packet flags: %d picture type: %cn", packet.flags,
av_get_picture_type_char(frame->pict_type));
返回输出:
packet flags: 1 picture type: P
当我期待的时候:
packet flags: 1 picture type: I
Where '1' == AV_PKT_FLAG_KEY。和'I'指的是AV_PICTURE_TYPE_I,
这个行为正确吗?(我正在解码MPEG2视频)。
我得到了ffmpeg bug跟踪器的响应:
https://ffmpeg.org/trac/ffmpeg/ticket/2074我怀疑你错过了编解码器延迟。你得到的视频帧通常根本不是基于你刚刚发送进来的数据包。对于多线程解码尤其如此,但由于b帧的工作方式,即使没有它,通常也不可能。
并且,确实我在3帧后打印出->pict_type"图片类型",有一个I帧在几帧后弹出,并在3帧后出现"延迟"。在我的情况下,我有一个四核计算机,所以也许有一个线程被分配给我的计算机上的每个核心进行编码。