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    }
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才會有所不同。

answered 2020-02-22T10:08:34Z
translate from