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视频).
我得到了ffmpeg bugtracker的回复:
https://ffmpeg.org/trac/ffmpeg/ticket/2074
我怀疑你错过了编解码器延迟.您获得的视频帧通常不是基于您刚刚发送的数据包.对于多线程解码尤其如此,但即使没有它,由于B帧如何工作,通常也不可能.
而且,实际上我打印出3帧以后的 - > pict_type"图片类型",有一个I帧会在几帧之后弹出,其中"延迟"的确分别是3帧之后.在我的情况下,我有一个四核计算机,所以也许有一个线程被分配给我的计算机上的每个核心进行编码.