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

  • 本文关键字:pts pkt packet AVFrame 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 = %dn", packet.pts);
   printf("frame->pkt_pts", frame->pkt_pts);
}

显示frame->pkt_pts通常与packet.pts不同,尽管文档声称frame->pkt_pts是

从AVPacket中复制的PTS被解码以产生此帧

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

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

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

相关内容

  • 没有找到相关文章

最新更新