ffmpeg.c什么是pts和dts?这个代码块在ffmpeg.c中做了什么?

时间:2011-05-18 12:01:05

标签: c ffmpeg

  • 简单来说,什么是pts和dts值?
  • 为什么在转码[decode-encode]视频时它们很重要?

这段代码在ffmpeg.c中做了什么,它的目的是什么?

01562    ist->next_pts = ist->pts = picture.best_effort_timestamp;
01563    if (ist->st->codec->time_base.num != 0) {
01564        int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
01565        ist->next_pts += ((int64_t)AV_TIME_BASE *
01566                         ist->st->codec->time_base.num * ticks) /
01567                         ist->st->codec->time_base.den;
01568    }

2 个答案:

答案 0 :(得分:83)

这些是解码时间标记(DTS)和显示时间标记(PTS)。您可以在inside a tutorial找到解释。

  

所以我们假设我们有一部电影,并且框架显示如下:I B B P.现在,我们需要知道P中的信息才能显示B帧。因此,帧可能存储如下:I P B B.这就是为什么我们在每个帧上都有解码时间戳和显示时间戳。解码时间戳告诉我们何时需要解码某些内容,并且演示时间戳告诉我们何时需要显示某些内容。因此,在这种情况下,我们的流可能如下所示:

   PTS: 1 4 2 3
   DTS: 1 2 3 4
Stream: I P B B
     

一般来说,PTS和DTS只会在我们正在播放的流中有B帧时才会有所不同。

答案 1 :(得分:-1)

从I帧和P帧中预测出B帧。与I和P相比,B帧通常具有更多的错误,因此尽管在时间上可能更近,但不建议将其用于预测。有一些算法使用B进行预测,但是它是从过去的B帧而不是将来的B帧中提取的。

因此,在IP B1 B2的序列中,解码顺序为IP B1 B2,显示顺序为I B1 B2P。从I,B1从I和P预测P,从B2从I和P预测P。