Wie ist diese .mp4-Datei 596523 Stunden lang?

Ich bin online auf diese Witz-MP4 -Datei gestoßen . (Achtung: direkter Download-Link zu einer 8-MB-Datei.) Sowohl Mediaplayer als auch ffmpeg listen die Datei mit einer Länge von 596523:14:07.00 (!) auf. Meine erste Vermutung war, dass das Video möglicherweise eine sehr niedrige Bildrate verwendet hat, aber ffmpeg listet eine Bildrate von 10 fps auf, ohne dass Frames eine variable Bildrate haben. Was passiert in der Codierung dieser Datei, um ihr eine so lange Länge zu verleihen?

Hier ist ein Hinweis: Wenn Ihnen jemand sagt „Ich bin 100 m groß“, muss er dann wirklich 100 m groß sein, um das sagen zu können?

Antworten (1)

Es gibt mehrere Dinge, die wir hier festhalten können:

  1. Die Datei wird nach 0:05:30 nicht mehr wiedergegeben.
  2. Wenn Sie die Datei remuxen (z. B. mkvtools), wird 5:30 als Länge angezeigt.
  3. Die Originaldatei zeigt tatsächlich die lächerliche Länge.

Also, obwohl es ein lustiger Witz ist, ist es nicht so cool, wie ich zuerst dachte. Niemand hat herausgefunden, wie man eine Endlosschleife von Frames oder etwas Ähnliches macht. Dies scheint nur ein Header der Datei zu sein, der nicht mit den Daten übereinstimmt.

Wie ermittelt der Player (oder die meisten Tools) die Länge des Videos? Sie lesen nicht die ganze Datei, sonst wären die Ladezeiten von Dateien unpraktisch. Am Anfang der Datei steht also eine Markierung, die die Länge angibt, und der Spieler vertraut ihr einfach.

Lassen Sie uns die Mathematik durchgehen:

596523:14:07.00 = ((596523*60)+14)*60+7 = 2147483647 seconds
2147483647 (base 10) = 7FFFFFFF (base 16)

Oh, das ist eine schöne Nummer. Jetzt öffnen wir die Datei mit einem Hex-Editor, gleich am Anfang sehen wir

 00000000:  00 00 00 18 66 74 79 70  6d 70 34 32 00 00 00 00  ....ftypmp42....
 00000010:  6d 70 34 32 6d 70 34 31  00 01 69 7b 6d 6f 6f 76  mp42mp41..i{moov
 00000020:  00 00 00 6c 6d 76 68 64  00 00 00 00 dd 69 a6 fb  ...lmvhd.....i..
 00000030:  dd 69 a6 fb 00 00 00 01  7f ff ff ff 00 01 00 00  .i..............

Da ist unser Übeltäter, direkt an der 0x38-Marke. Bearbeiten wir es und sehen, was passiert. Ich bekomme tatsächlich einen lustigeren "Witz", wenn ich am Anfang 7f in ff ändere. Um zu verstehen, warum es funktioniert, lesen Sie bitte Wie werden negative Zahlen im Speicher gespeichert? .

Ich bin neugierig, was ist der "lustigere" Witz?
@Tvde1 Die darauf hinweisenden Kommentare wurden gelöscht, aber Sie erhalten eine negative Länge
Ich frage mich, warum das Längenfeld als signiert definiert ist (wenn es wirklich so ist), da negative Längen niemals Sinn machen. Aber wahrscheinlich für einfachere Portabilität / Kompatibilität mit anderer Software.
@Ray Was war eine sehr gute Diskussion, die von einem Moderator gelöscht wurde, warum es sich um ein signiertes und nicht um ein unsigniertes int handelt. Ich werde nicht alles wieder eintippen, nur damit es gelöscht wird, tut mir leid.
@v010dya Seltsam, warum es nicht in den Chat verschoben wurde. Danke für die Information.
@Ray Ganzzahlen mit und ohne Vorzeichen haben dieselbe Bitdarstellung für positive Zahlen. Die meiste Software wird signiert verwenden, da sie in Sprachen wie C++ dank undefiniertem Verhalten schneller ist. Beispielsweise kann der Compiler sicher 64-Bit-Operationen auf diesen 32-Bit-Ints verwenden, ohne auf Wraparound zu prüfen. Sie können auch statische Analysatoren und ubsan verwenden, um einen Überlauf zu erkennen, was Sie für unsigned ints nicht tun können, da sie niemals überlaufen. (Auch danke SE-Mods für das Löschen nützlicher Informationen)