Wie generieren "moov vor mdat" MP4-video-Dateien mit hoher Leistung (minimale I/O)?
Ich bin der Gestaltung einer server-Anwendung, speichert ein live-H. 264-video-stream als MP4 für den späteren Verbrauch von Browsern. Da ein server muss um wie viele gleichzeitige streams möglich, glaube ich I/O werden die natürlichen Engpass, und ich möchte zu halten I/O auf ein minimum. Ich bin in den klassischen MP4 moov/mdat Bestellung problem: MP4-Generatoren schreib lieber die mdat-box (enthält die eigentlichen Medien-frames), dann schreiben Sie das moov-Atom (mit Datei-offsets und andere strukturelle Informationen) später, nach der es tatsächlich weiß, was die mdat-Datei-offsets. MP4 Verbraucher lieber das Gegenteil für progressive streaming -- Lesen der moov-die erste, also die mdat-Struktur bekannt ist und das video mit dem spielen beginnen kann schnell, ohne den download der gesamten Datei.
Die übliche Lösung ist ein post-process-MP4-Dateien zu verschieben, das moov-Atom vor der mdat-box, und umschreiben von Datei-offsets entsprechend. Jedoch, für eine high-volume-Anwendung ist, ich möchte vermeiden die I/O-Strafe schreiben, der eingehende video-Daten auf der Festplatte, liest er alles wieder an, und schreiben Sie es wieder mit einem neuen arrangement.
Mehrere Ansätze kommen in den Sinn:
- Post-Prozess die MP4 als üblich, dass die I/O-Strafe und möglicherweise verzögern die video ' s Verfügbarkeit. (nicht gut.)
- Verwenden fragmentierten MP4 und kleine fragment-Größen, die angemessen sind, um in den Speicher passt. (Dies könnte negative Auswirkungen auf die gesamte-Datei seekability, würde ich denken.)
- Es wäre fantastisch, wenn Dateisysteme, vorausgesetzt, eine schnelle "Stelle" option zum hinzufügen neuer Blöcke an den Anfang der Datei-block-Kette. (Ich glaube nicht, das ist bisher erfunden worden.)
- Generieren Sie die MP4 als zwei Dateien-eine "mdat" - Datei (enthält die eigentlichen Medien-frames) und "moov" - Datei (enthält die ftyp Kopf-und moov-Daten). Diese beiden Dateien, wenn verkettet, würde die Vorlage eines gültigen moov-die erste MP4-Datei. Eine einfache web-server-Modul könnte ein virtueller .mp4-Datei für den Benutzer, aber Lesen die .moov und .mdat-Dateien hinter den kulissen.
Ich bin Neigung in Richtung #4 für heute. Gibt es eine praktischere Weise um dieses problem zu lösen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Größe des moov-Daten abgeschätzt werden können, preallocate Leerzeichen am Anfang der Datei. Einige davon möglicherweise verschwendet werden, aber Sie nicht haben, um neu berechnen und alle offsets werden, und es wird vermieden, die I/O-Kosten, die in einem bestimmten Prozentsatz der Fälle. Nur stellen Sie sicher, dass Sie einen fallback, wenn die moov-Daten größer als Ihre Schätzung.