ffmpeg.c was sind pts und dts? Was macht dieser Codeblock in ffmpeg.c?

Lesezeit: 3 Minuten

Benutzeravatar von Aditya P
Aditya P

  • Was sind in einfachen Worten pts- und dts-Werte?
  • Warum sind sie beim Transkodieren wichtig? [decode-encode] Videos?

Was macht dieses Codebit in ffmpeg.c was ist seine Aufgabe?

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    }

Barts Benutzeravatar
Bart

Dies sind der Dekodierungszeitstempel (DTS) und der Präsentationszeitstempel (PTS). Eine Erklärung finden Sie hier innerhalb eines Tutorials.

Nehmen wir also an, wir hätten einen Film und die Frames wurden wie folgt angezeigt: IBB P. Jetzt müssen wir die Informationen in P kennen, bevor wir einen der B-Frames anzeigen können. Aus diesem Grund könnten die Frames wie folgt gespeichert werden: IPB B. Aus diesem Grund haben wir einen Dekodierungszeitstempel und einen Präsentationszeitstempel für jeden Frame. Der Dekodierungs-Zeitstempel sagt uns, wann wir etwas dekodieren müssen, und der Präsentations-Zeitstempel sagt uns, wann wir etwas anzeigen müssen. In diesem Fall könnte unser Stream also so aussehen:

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

Im Allgemeinen unterscheiden sich PTS und DTS nur, wenn der Stream, den wir abspielen, B-Frames enthält.

  • @nirvanaswap das wird hier eigentlich ziemlich gut erklärt en.wikipedia.org/wiki/Video_compression_picture_types

    – Bart

    20. Mai 2016 um 7:36 Uhr

  • Ich verstehe immer noch nicht. Der Stream muss als IBBP angezeigt werden, aber da P vor B kommen sollte, speichern wir ihn als IPB B. Daher dekodieren wir ihn in der Reihenfolge 1 2 3 4, das macht Sinn. Aber sollten wir es nicht in der Reihenfolge 1 3 4 2 darstellen? Warum ist es 1 4 2 3? Wenn wir aufeinanderfolgende B-Frames haben, nutzen diese B-Frames nur die I- und P-Frames oder verwenden sie auch die B-Frames nebeneinander?

    – Nirvanaswap

    20. Mai 2016 um 18:31 Uhr

  • Nein, Sie zeigen in der IBBP-Reihenfolge an. Aber da das erste B auf dem I davor und dem B danach basiert und anschließend das zweite B-Frame auf dem letzten P-Frame basiert, benötigen Sie bereits die Informationen des P-Frames, um das erste B-Frame anzeigen zu können . Und deshalb ist der Stream IPBB.

    – Bart

    20. Mai 2016 um 18:36 Uhr

  • @neevek Sollte; ffmpeg beschwert sich, wenn dies nicht der Fall ist, z. B. „Non-monotonous DTS in output stream“ (in diesem Fall verwendeten sie -c copy).

    – arielCo

    24. Juli 2020 um 15:08 Uhr

  • Hinweis für verwirrte Leser wie mich: I, P und B sind keine willkürlichen Frame-Namen, sie stehen jeweils für Intra-Coded Frame, Predicted Frame, Bi-directional Predicted Frame.

    – ahmetknk

    5. April um 23:37 Uhr

Benutzeravatar von ShijithR
ShijithR

B-Frames werden aus I- und P-Frames vorhergesagt. B-Frames haben im Vergleich zu I und P normalerweise mehr Fehler und werden daher nicht für die Vorhersage empfohlen, obwohl sie zeitlich näher liegen könnten. Es gibt Algorithmen, bei denen B zur Vorhersage verwendet wird, aber es stammt von einem vergangenen B-Frame und nicht von zukünftigen B-Frames.

In einer Folge von IP B1 B2 ist die Dekodierreihenfolge also IP B1 B2 und die Anzeigereihenfolge ist I B1 B2 P. P wird von I vorhergesagt, B1 von I und P, B2 wiederum von I und P.

1417890cookie-checkffmpeg.c was sind pts und dts? Was macht dieser Codeblock in ffmpeg.c?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy