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?
Es gibt mehrere Dinge, die wir hier festhalten können:
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? .
Jörg W Mittag