为什么 packet.pts != frame->pkt_pts 在 AVFrame 中?

Why is packet.pts != frame->pkt_pts in AVFrame?

试图通过 ffmpeg 了解一些 audio/video 同步问题,我注意到以下内容。 运行 这个代码

while (av_read_frame(formatCtx, &packet) >= 0)
{
   if (packet.stream_index == videoStream)
   {
      avcodec_decode_video2(videoCodecCtx, frame, &got_frame, &packet);
   }

   printf("packet.pts = %d\n", packet.pts);
   printf("frame->pkt_pts", frame->pkt_pts);
}

表明 frame->pkt_pts 通常不同于 packet.pts,尽管文档声称 frame->pkt_pts 是

PTS copied from the AVPacket that was decoded to produce this frame

而且我注意到两者的差别很大,恰恰是在音视频不同步的地方。

那么,为什么是 packet.pts != frame->pkt_pts

视频可能有延迟帧,这意味着输入帧和输出帧可能指的是不同顺序的单元。例如。在 MPEG 的情况下,IBP 的显示顺序被编码为 IPB,输入点与输出点不同,重新排序会在输入点和输出点之间引入延迟。此外,当使用多线程解码时,在输入和输出之间会增加 n_threads - 1 个数据包的额外延迟。在所有这些情况下,pkt.pts != frame->pkt_pts。显示的话应该依赖frame->pkt_pts.