- 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 }
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.
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.