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

时间:2015-05-31 23:52:26

标签: ffmpeg

尝试通过ffmpeg了解一些音频/视频同步问题,我注意到以下内容。运行此代码

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是

  

从已解码的AVPacket复制的PTS产生此帧

此外,我注意到两者之间的差异很大,恰好在音频和视频不同步的地方。

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

1 个答案:

答案 0 :(得分:5)

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