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

  • 简单地说,pts和dts的值是什么?
  • 为什么在转码[解码 – 编码]video时它们很重要?

这个代码在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 } 

这些是解码时间戳(DTS)和演示时间戳(PTS)。 你可以在教程里find一个解释。

所以假设我们有一个电影,帧显示为:IBB P.现在,我们需要知道P中的信息,然后才能显示任一B帧。 正因为如此,这些帧可能像这样存储:IPB B.这就是为什么我们在每一帧都有一个解码时间戳和一个表示时间戳。 解码时间戳告诉我们什么时候需要解码什么东西,而显示时间戳告诉我们什么时候需要显示一些东西。 所以,在这种情况下,我们的stream可能看起来像这样:

  PTS: 1 4 2 3 DTS: 1 2 3 4 Stream: IPBB 

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