Warum ist H.264-Video in einem FLV-Container so viel schneller als in einem MP4-Container?

9

Ich entwickle eine Tube-Site und habe derzeit Probleme mit dem H.264-Format. Mir ist aufgefallen, dass YouTube ihre HD-Videos in einen MP4-Container gestellt hat, also habe ich logischerweise dasselbe getan.

Als nächstes habe ich mod_h264_streaminglighttpd installiert , damit Streaming und Timeline-Scrubbing funktionieren.

Das Problem ist, dass große Dateien (> 500 MB bei etwas hoher Auflösung) ewig brauchen, um überhaupt mit dem Puffern zu beginnen (ich habe gelesen, dass Flowplayer und andere Flash-Player zuerst Metadaten herunterladen müssen). Ich habe das xmov-Atom mit MP4Box an den Anfang der Datei verschoben (ich habe auch Qt QuickStart ausprobiert), aber das hat nicht geholfen.

Als nächstes las ich, dass ich Audiospuren verschachteln muss, also tat ich das auch. Dies führte zu keiner Änderung: Die Videos waren immer noch langsam.

Also habe ich versucht, genau den gleichen H.264-Film in einen FLV-Container zu legen, und die Wiedergabepufferung begann fast sofort - keine Langsamkeit.

Was vermisse ich hier? Warum sollte ich einen MP4-Container mit dem Modul mod_264_streaming, das sehr langsam erscheint, einem normalen FLV-Container mit integriertem lighttpd vorziehen mod_flv_streaming? Natürlich wählen viele Websites den MP4-Container, aber ich verstehe nicht warum.

Und als Nebenfrage habe ich versucht, mit dem HTML5- <video>Tag denselben H.264 MP4-Film zu testen, und das Scrubben war blitzschnell ! Ich habe in die Protokolldatei von lighttpd geschaut und festgestellt, dass Flash-Player video.mp4?start=234jedes Mal angehängt werden, wenn die Timeline gesäubert wird, während Browser, die das native HTML5- <video>Tag verwenden, dies nicht tun. Ist dies eine Einschränkung von Flash? Warum kann Flash-Streaming nicht so schnell sein wie HTML5-Streaming?

Gotys
quelle

Antworten:

4

TL; DR: MP4 wird verwendet, wenn die Video-Site mehr Metadaten im Video speichert, als FLV unterstützt, oder wenn ein Audio-Codec verwendet wird, den FLV nicht unterstützt. Die Einfachheit und das For-Streaming-Design von FLV machen es zu einer guten Wahl, wenn Sie keinen guten Grund haben, MP4 zu verwenden.

Was das Timeline-Scrubbing von Flash angeht, habe ich keine Ahnung, warum das so ist, da ich Flash nie codiert habe, aber es ist möglich, dass es sich um einen verwendeten Regler handelt oder um etwas, das speziell mit dem Streaming-Server von Adobe zusammenarbeitet, um in der Datei zu suchen. Es funktioniert auch, um den nervigen Benutzer daran zu hindern, die Datei auf seiner Festplatte zu behalten.


Einige Dinge, die Sie bereits wussten:

Es gibt grundlegende Unterschiede zwischen den Containern FLVund MP4(auch bekannt als Isomedia) Containern. FLV wurde von Adobe von Anfang an als Streaming-Container entwickelt und ist wirklich verdammt einfach . Es wird lediglich ein Videopaket gesendet, dann ein Audiopaket, dann ein Videopaket ... Es werden jedoch nur sehr wenige Codecs und keine anderen Metadaten als Zeitstempel in Millisekunden unterstützt. Wenn Sie keine MP4-spezifischen Funktionen benötigen, können Sie mit FLV problemlos umgehen.

ISO-Medien hingegen basieren auf dem MOV-Container von Apple. Es ist in Atome unterteilt, und es gibt ein bestimmtes Atom, moovdas dekodiert werden muss, bevor andere Atome gelesen werden können. Das Problem mit MP4 ist, dass das moovAtom am Ende der Datei geschrieben wird, was für die Codierung von Programmen viel einfacher ist. Es gibt Tools wie qtfaststart , die das notwendige Munging ausführen, um das moovAtom an den Anfang der Datei zu setzen. Daher startet die Datei die Wiedergabe, sobald sie Daten enthält, anstatt vor dem Start vollständig heruntergeladen werden zu müssen.

Jessidhia
quelle
0

Wenn Sie einen Mov-Container verwenden, wird dieser sofort gesendet, ohne dass Module installiert oder in einen FLV-Container gestellt und ein Modul verwendet werden müssen. Nur meine Gedanken. Verwenden Sie mov und fügen Sie den entsprechenden MIME-Typ hinzu - fertig.

RobotHumans
quelle