Wo steckt denn im VOB/mpeg2 streamheader der Eintrag bezgl. Streamdauer?

  • Dann sag ich genau so kurz: Gibt's nicht.
    __


    Willste mehr wissen?


    http://www.ligh.de/software/13818.rar
    http://www.ligh.de/software/mpegwalk.zip


    Sequence header (Blockcode 0xB3): "max. Bitrate" - ist aber zur Abschätzung der durchschnittlichen unbrauchbar.


    Für DVDs würde ich noch mal schauen, ob es detaillierte Informationen über den Inhalt von IFO-Dateien gibt; ansonsten gibt's bei elementaren MPEG-Video-Streams nur eines: Von vorn bis hinten die Frames zählen, dann die Datenmenge durch diese teilen.

  • Moin, die Frage wollte ich auch stellen. Dann gehört die Länge nicht zu den Videoinformationen!?


    Konnte FitCD 1.05 auch schon MPG, M2V öffnen? Dann könnte man in den Sourcen nachsehen.


    Nachtrag:


    In den Sourcen von MPEG2Schnitt müsste das auch stehen. Konnte ich aber unter Delphi 3 Prof nicht ansehen.

  • MPEG-Video ist ein Streaming-Format. Man soll sich jederzeit am Anfang eines GOPs auf den Stream aufschalten können (bei MPEG2 ist es hilfreich, wenn regelmäßig Picture- und Display-Extension-Blöcke verwendet werden; ansonsten könnten aber sogar die Slices genügen, wenn man blind decodiert, ohne die Bilddimensionen vorher zu kennen), und es muss nicht unbedingt ein Ende haben (siehe DVB), auch wenn ein Sequence-End-Block erlaubt ist, und in einigen Anwendungen Sinn macht.

  • Es gibt "MPEG Audio Version 1 Layer 3" (das ist üblicherweise bekannt als MP3) mit höheren Samplingraten (32/44,1/48 kHz) wie auch "MPEG Audio Version 2 Layer 3" für niedrigere Bitraten und Samplingfrequenzen (16/22,05/24 kHz), und sogar "MPEG Audio Version 2.5 Layer 3", wie Fraunhofer das für allerniedrigste Bitraten genannt hatte (8/11,025/12 kHz).


    Wie diese Komponente die Spieldauer ausrechnet, kann ich erst mal nur raten - wahrscheinlich "Dateigröße : Bitrate des ersten Blocks", was bei CBR ja funktionieren mag, bei VBR aber nicht (siehe auch Windows Media Player 6.4).

  • Interessant!
    Ich habe mal testweise eine VOB mit dem Mediaplayer geöffnet und unten wurde direkt die Zeit angezeigt ....... also ist diese nicht 100%ig??

    Deshalb geht Vdub auch for und "parsed" den gesamten Stream, nich?

    Hintergrund: Ich möchte in Packshot automatisch beim Input der SourceVob in dessen Bitratecalculator die Zeit eintragen lassen, genauso wie auch für den internen Resizer die Auflösungen etc. durchgegeben werden.

  • Eigentlich sollte sich die Anzahl der Frames aus der IFO auslesen/errechnen lassen. Mit IfoEdit und ChapterXtractor konnte man die Kapitelzeiten ausgeben. Nur die Sourcen dafür sind nicht offen.

  • Es gibt Header. Mehrere; regelmäßig. Ganz besonders in Transport- und System-Streams (also gemultiplexten MPEG-Daten): Da hat jeder Block einen Header, in dem drinsteht, aus welchem Stream jetzt ein Stückchen folgt (bei DVD sind es 2048 Bytes = 1 DVD-Sektor pro Block, und jeder davon beginnt mit einigen 'zig Bytes, die angeben, an welchen Stream der Rest des Blockinhaltes anzuhängen ist (außer bei Blöcken, in denen Stücke der Inhalte mehrerer Streams untergebracht sind).


    Ein DVD-Player ist ein klassisches Multi-Threading-Problem: Ein Thread arbeitet als Demultiplexer und fügt immer nur Stückchen für Stückchen aus dem Rest der Blöcke an die Streams an. Und für jeden Stream gibt es einen weiteren Thread, der die Streams abhängig von ihrer Bedeutung verarbeitet. Der Private Stream 1 beispielsweise wird auch wieder an einen Demultiplexer geleitet und splittet diesen wiederum nach Sub-Streams (Untertitelspuren und Nicht-MPEG-Audio-Spuren) auf.


    Insofern ist MPEGWALK eigentlich nicht korrekt aufgebaut, aber Turbo Pascal unter DOS konnte sowieso kein Multi-Threading...

  • Zitat von LigH

    Es gibt Header. Mehrere; regelmäßig.


    Meine Frage zielte jetzt darauf ab, dass ein CQ Tester nur einen Bruchteil des Videos encodet. Wenn am Anfang des m2v kein Header steht, kann man die Größe des Teilvideos einfach hochrechnen.

  • Hallo,
    um die Spieldauer einer Mpeg2datei zu ermitteln sehe ich 3 Möglichkeiten:
    1. Den Timecode des letzten Gruppenheaders auslesen und die Dauer der letzten Gruppe hinzurechnen. Da eine Gruppe ungefähr 0,5 Sek dauert kann man das bei einem Film von 1,5 Stunden sicher vernachlässigen. Das Problem ist das der Timecode, besonders bei DVB-Aufnahmen, nicht stimmen muß.
    2. Einige Stichproben im gesamten Film machen und dann die Länge schätzen. Also meinetwegen eine GOP im ersten Teil des Films auslesen und die "Dateilänge" und Bildzahl (also die Bitrate) dieser GOP feststellen und das dann noch einige male machen. Aus den Werten könnte man die Filmlänge ermitteln. Die Genauigkeit hängt von der Anzahl der Stichproben und dem Zufall ab.
    3. Die Bilder zählen. Das ist die einzige genaue Methode. Deshalb werden in Mpeg2Schnitt beim erzeugen der Indexdateien die Bilder gezählt. Aus den Indexdateien kann man natürlich auch die Spieldauer des Films gewinnen.

    Martin

  • Guten Abend,


    Zitat von Martin Dienert

    ... Deshalb werden in Mpeg2Schnitt beim erzeugen der Indexdateien die Bilder gezählt. ...


    Letzte Woche wollte ich mir ansehen, wie Du das Problem gelöst hast, hatte allerdings nur Delphi 3 Prof zur Verfügung, was logischerweise nicht reichte.


    Bisher habe ich in meinem Fall in VirtualDubMod die Nummer des letzten Frames nachgesehen.


    Für die Längenbestimmung von WAV-Dateien habe ich heute einige Beispiele gefunden. MPEG-Videos interessiert kaum jemanden.

  • Zitat von Martin Dienert

    1. Den Timecode des letzten Gruppenheaders auslesen und die Dauer der letzten Gruppe hinzurechnen. ... Das Problem ist das der Timecode, besonders bei DVB-Aufnahmen, nicht stimmen muß.


    Vor allem muss der Timecode auch nicht bei 00:00:00 anfangen, die meisten beginnen etwa um 01:00:00 oder um 10:00:00 (hat was damit zu tun, dass auf dem DigiBeta-Band noch etwas Vorlaufzeit nötig ist). Nur der Timecode der letzten GOP reicht also nicht, es muss auch der Timecode der ersten GOP gelesen und (nach den Regeln der Zeitangaben) subtrahiert werden.


    Dummerweise ist das Finden der letzten GOP nicht gerade einfach, rückwärts lesen in MPEG ist nicht ganz trivial...
    __


    Methode 3 macht DVD2AVI / DGIndex uns bereits vor.

  • Hallo LigH,
    zu 1. Das ist natürlich auch möglich. Bei meinen DVB-Aufnahmen macht der Timecode was er will. Spätestens nach dem demuxen (mit ProjektX) stimmt er aber, nur weiß man dann ja sowieso wie lang das Video ist. ;D

    Zitat

    rückwärts lesen in MPEG ist nicht ganz trivial...

    Wieso? Man sucht rückwärts nach Hex 00 00 01 B8 (Gruppenheader) und hat ihn. Oder irre ich mich da?

    Mir ist noch was zu dem Thema eingefallen:
    4. Bei einer gemuxten Mpeg2-Datei, darum geht es ja, die PTS-Zeiten vorn und hinten in der Datei auslesen und die Differenz berechnen. Ist die Endzeit kleiner als die Anfangszeit gabs einen Überlauf.

    Martin

  • Zitat von Martin Dienert

    Man sucht rückwärts nach Hex 00 00 01 B8 (Gruppenheader) und hat ihn. Oder irre ich mich da?


    Ja. Stell dir vor, in der VOB-Datei ist ein PCM-Stream...


    Okay, in elementaren M2V kommt ein solches Muster mit an Sicherheit grenzender Wahrscheinlichkeit nicht vor außer als Group-Block.