这段代码在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 }
答案 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)
因此,在IP B1 B2的序列中,解码顺序为IP B1 B2,显示顺序为I B1 B2P。从I,B1从I和P预测P,从B2从I和P预测P。