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

  • 简单来说,什么是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    }
Aditya P asked 2020-02-22T10:08:07Z
1个解决方案
90 votes

这些是解码时间戳(DTS)和演示时间戳(PTS)。 您可以在教程内的此处找到说明。

假设我们有一部电影,并且帧显示为:I B BP。现在,我们需要先了解P中的信息,然后才能显示任一B帧。 因此,可能会这样存储这些帧:I P BB。这就是为什么我们在每个帧上都有一个解码时间戳和一个呈现时间戳。 解码时间戳告诉我们何时需要解码某些内容,演示时间戳告诉我们何时需要显示某些内容。 因此,在这种情况下,我们的流可能看起来像这样:

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

通常,只有当我们正在播放的流中具有B帧时,PTS和DTS才会有所不同。

Bart answered 2020-02-22T10:08:34Z
translate from https://stackoverflow.com:/questions/6044330/ffmpeg-c-what-are-pts-and-dts-what-does-this-code-block-do-in-ffmpeg-c