MPEG4 stream Rohdaten in ein AVI schreiben

  • Hallo

    ich habe einen Videostream einer Kamera über ein selbstgeschriebenes Java-tool gespeichert und möchte diesen nun in einen container stecken (habe mich an AVI versucht, weil ich hier am besten an die dateiaufbauspezifikationen gekommen bin). Dafür habe ich mir einen RIFFWriter gebaut. Es kommt laut VLC auch eine scheinbar ganz gute Datei heraus - aber ein paar macken sind offensichtlich noch drin.

    Im "Meldungenfenster" von VLC steht "broken or missing index" und beim Abspielen selbst kommen bei jedem Frame, was er versucht zu decodieren Fehlermeldungen Wie "1. marker bit is missing" und sowas. Ich weiß aber wirklich nicht mehr so richtig, was ich hier falsch gemacht habe. Ich sehe zumindest keine Fehler mehr. Habe mit einem hexeditor die werte des Indexes umgerechnet (sowohl offset als auch länge) und komme (zumindest bei den Frames, die ich getestet habe) immer auf die richtigen Werte. Kann sich jemand vielleicht mal die Datei anschauen? Ich weiß wirklich nicht, was ich falsch gemacht habe.

    Es ist ein MPEG-4 stream im simpleprofile - alle 25 frames ein Keyframe. 2048kbps und 25fps

    Könnte es daran liegen, das ich als streamheader und avimainheader xvid angegeben habe? Ist ja nicht wirklich xvid-codiert. Aber in der spezifikation der kamera steht nur, dass es ein MPEG-4 stream ist - da hab ich der Einfachheithalber halt xvid reingeschrieben. Zumindest lässt sich das Video zur Laufzeit mit xvid decodieren und korrekt anzeigen.

    danke danke danke an denjenigen, der mir helfen kann
    ich bin wirklich am Ende mit meinem Latein :(

    Steve


    files:
    das videofile: http://www.blackcraze.de/upload/testvideo.avi

    der gespeicherte Stream im Rohformat: (erstes Keyframe nach 21 Bildern - die fehlen allerdings im videofile) http://www.blackcraze.de/upload/storedstreamdata

  • :welcome:

    Da du selber programmierst -- sollte das vielleicht in "Softwareentwicklung" verschoben werden?

    AVI-Dateien beinhalten nicht nur die Videodaten, sondern auch eine Liste der Keyframes, damit schnell zu einem sofort decodierbaren Frame gesprungen werden kann, wenn man in der Timeline springt. VirtualDub kann (evtl. mit dem erweiterten Datei-Öffnen-Dialog) die Neuindexierung durchführen.

    Vielleicht kannst du die Quelltexte von "avc2avi" einsehen, das dürfte helfen. Dieses Programm kann speziell AVC/H.264-Rohdaten (*.264) in AVIs verpacken.

  • hi,

    danke erstmal für den Tip mit dem Programm - ich werde gleich mal testen, ob das funktioniert. Die Liste (idx1 list) habe ich angelegt (für jedes Frame einen Eintrag). Ich habe darin auch einige Einträge stichprobenmäßig überprüft. Sowohl die länge der Liste, als auch die Einträge scheinen mir korrekt zu sein.


    ################# EDIT #####################

    Das Programm scheint (teilweise) gut zu funktionieren. Ich habe zumindest das erste Bild des Videos erkennen können. Was afaik daran liegt, dass nur das erste Frame indiziert wurde. Ich versuche jetzt mal aus der Datei schleu zu werden. Vielen Dank :)

  • Aber in der Indexliste können afaik auch "nicht-Keyframes" indiziert werden. Dafür gibt es meines meines Erachtens ein Flag

    Syntax:

    00dc (4 byte)
    flags (4 byte) - (0x00000010 steht für Keyframe)
    offset (4 byte)
    length (4 byte)


    ###################### EDIT ######################

    Ich denke, dass ich den fehler gefunden habe. Sind wohl einige bytes innerhalb des algorithmus verfälscht worden.

    Frage:
    Woran erkenne ich, dass das vorliegende Frame ein Keyframe ist?

  • Soweit ist mir das bekannt. Es geht mir aber um einen Programmiertechnischen Ansatz. Gibt es eine bestimmte bitfolge oder so - irgendwie muss ja auch VDub erkennen, dass das ein neues Frame ist. Die haben doch bestimmt nen Header - ich find nur nix im Netz dazu :-/

  • Im Grunde muss man das Rohdatenformat verstehen, wenn man aus MPEG4 ein AVI erzeugen will. Was bei MPEG1 und MPEG2 die "GOP = Group of Pictures" ist, die eine Tabelle der darin enthaltenen Frametypen mitführt, das ist in MPEG4 die "GOV = Group of VOPs (Video Object Planes)". Der Standard ISO/IEC 13818 beschreibt deren Struktur in Teil 2 (verlinkt ist ein 7zip-Archiv einer noch nicht endgültigen Ausgabe).

    Die große Schwierigkeit bei AVI ist, dass B-Frames eigentlich nicht unterstützt werden. Ein Ansatz zur Umgehung dieses Schwachpunktes ist der "Packed Bitstream": Hier werden ein P-Frame und benachbarte B-Frames zusammengefasst, und die folgenden B-Frames als "Drop-Frames" gespeichert. Diese Schwachstelle des AVI-Formates ist auch der Hauptgrund, warum man diesen veralteten Container eigentlich nicht für MPEG4-Video verwenden sollte.

  • Da die Kamera aber sowieso im simpleformat sendet, hab ich ja eh keine B frames - nur I und P - danke für den Link - ich schau's mir mal an.

    ################ EDIT ################

    Also - es funktioniert erstmal - keine Fehler mehr in den VLC-Meldungen mehr
    Aber es läuft zu schnell - wens interessiert - ich lade das video mal hoch.

    http://www.blackcraze.de/upload/rohdaten_NEW.avi


    ################ EDIT ################

    scheinbar sind doch noch P-Frames drin
    mit den 387 frames komm ich auf die 15 sekunden bei 25fps *kopfkratz*

  • tach auch !

    Und Du bist sicher, daß die Cam mit 25 FPS aufnimmt und nicht mit 15 FPS?
    (Frames pro Sekunde)

    Das wäre die simpelste Erklärung für das "zu schnell".

    15 aufgenommen und mit Einstellung 25 gemuxed läuft halt zu schnell.

    Gruss BergH

  • Hallo
    Hab den Stream eingelesen,also "Roh-material" ist dies nun ja wirklich nicht.
    Dann anschliessend umgewandelt in DV-AVI,aber nur damit ich in Edius pro Frameweise hüpfen kann und gleichzeit das Bild am ext.Kontr.Moni anschauen kann.
    Aufgefallen ist mir dass manchmal eine Ziffer der Stopp-Uhr [0,1 Sek.]nur einmal pro Frame gezeigt wird statt 2x.

    Screen...so wird das File erkannt.

    Datenrettungen Normwandlungen Restaurierungen Digitalisierungen

  • okay - also bevor es jetzt zu total verwirrung kommt lade ich mal aktuelle versionen der daten hoch - die alten links sollten jetzt nicht mehr funktionieren.

    Ich habe das Programm, was den Stream abspeichert leicht modifiziert. es werden jetzt schon die für avi benötigten einträge angelegt. Die datei sollte jetzt so aufgebaut sein:

    • 4 byte zur identifizierung des streams innerhalb des containerformats - bei mir "00dc" - da ich nur einen stream habe.
    • 4 byte um die größe dieses eintrages anzugeben (ohne die 8 byte von index und größenbeschreibung)
    • jetzt kommen die videodaten


    das ganze wiederholt sich jetzt für jedes Frame. Ich kann aber nur I-Frames und P-Frames unterscheiden. Habe noch nicht herausbekommen, wo sich ein PFrame befindet. "LigH" meinte ja, die seien in manchen P-Frames enthalten und ich muss nach diesen einfach nur "leere" listeneinträge erstellen, weil BFrames nicht von AVI unterstützt werden.

    -------

    Das I-Frame beginnt immer mit dem folgenden code:
    00 00 01 B0 - dann kommt 1 byte mit informationen, die scheinbar das format des Frames beschreiben - der hexwert ist bei mir 03
    danach kommt der startcode für die extension
    00 00 01 B5 - dann 19 bytes für die beschreibung der extensions

    09 00 00 01 00 00 00 01 20 00 84 40 FA 28 A0 21 E0 A3 1F
    habe noch nicht nachgerechnet, was das alles bbedeutet.

    und dann der 00 00 01 B2 startcode nach dem Nutzerspezifische Daten kommen - nach dem stehen einige daten der kamera im Klartext - der abschnitt wird offensichtlich vom decoder ignoriert.

    abschließend kommt ein 00 00 01 B6 und dann kommen die Videodaten des Iframes

    -------

    dann kommt wieder ein "00dc" und eine länge für den nächsten listeneintrag und dann kommt ein p-Frame

    das sieht eigentlich ganz ähnlich aus - nur dass das erst mit 00 00 01 B2 anfängt und dann die Kameraspezifischen daten kommen dann das 00 00 01 B6 und dann die Framedaten

    -------


    und so geht es immer und immer weiter bis zum ende.
    So sehen die "Rohdaten" aus, die ich von der Webcam bekommen habe. Also brauche ich um diese daten "nur" noch ein Containerformat basteln. Das ist ja auch schon fast fertig. Ich denke zumindest, dass ich die RIFF-Struktur ordentlich hinbekommen habe. Am ende der datei habe ich jetzt eine indexliste (idx1) eingefügt, die jedes Frame mit dem Startcode 00dc (also alle einzelnen IFrames UND PFrames) indiziert. Das ist meines Erachtens auch richtig.

    Wie ich das jetzt verstanden habe, muss ich jetzt noch für jedes B-Frame einen leeren Listeneintrag in der movi-Liste (also in den "Rohdaten", die von der kamera gekommen sind) einfügen UND diesen eintrag dann natürlich auch in der "idx1" Liste am Ende der Datei indizieren. Das muss sein, weil AVI keine BFrames unterstützt, und diese sozusagen auch nicht anzeigen kann. Aus diesem grund läuft auch das Video zu schnell, weil eben manche B-Frames (die evtl. ein P Frame enthalten) nur für den Zeitraum eines Frames angezeigt werden, obwohl es ja eigentlich zwei frames sind.

    Woran erkenne ich denn, ob und wenn ja, wie viele BFrames in einem PFrame enthalten sind? Diese information brauche ich jetzt, um die indexliste erstellen zu können.

    Das Video kommt gaaaaaaaaaanz sicher mit 25fps - 100%tig

    ###################################
    ganz großes Dankeschön an alle Helfer :)
    ###################################

    Ich freu mich wirklich über so viel Hilfe - wenn das besser ist, könnt ihr mich auch gern über ICQ erreichen. 97049582
    Manchmal ist das besser fürs Verständnis :)


    ############ EDIT #################
    die links zu den dateien:

    gespeicherte "Rohdaten" (schon leicht präpariert für die AVI-Sache): https://localhost/www.blackcraze.de/upload/rohdaten
    die verpackten "Rohdaten": https://localhost/www.blackcraze…te_rohdaten.avi

    @ Goldwingfahrer
    wie ich das sehe, hattest du das "fertige" (also schon in corrupter RIFF form) avi eingelesen. Die daten (Aufösung fps und noninterleaved) habe ich sozusagen "einprogrammiert".

  • Also ich habe mir das Datenpacket nocheinmal ganz genau angesehen und nach sämtlichen headerstartcodes nach MPEG4 Standard gesucht. Es sind keine weiteren Startcodes zu finden, was mich zum schluss gebracht hat, dass es eben doch nur 16 Frames Pro sekunde sein können. Ich habe die Kamera dann einmal im 16 FPS modus und einmal im 25 fps modus laufen lassen. Es kam das gleiche datenvolumen für die gleiche zeit heraus - und auch die gleiche Framezahl.
    Jetzt frag ich mich doch - wieso gibt man einen 25fps Modus im Webinterface der Kamera für MPEG4 an, wenn es keinen gibt? Versteh ich nicht *kopfkratz* - naja zumindest hat die Sucherei ein Ende.

    Problem ist gelöst - die Applikation läuft einwandfrei.
    nochmal riesengroßes Danke an alle Helfer :)

  • Die hat mehrere Schnittstellen. Ist eine "Sony Ipela SNC-RZ50P". Habe folgendes auf der Konfigurationsseite der Kamera gefunden:

    Kamera kann sowohl JPEG über HTTP als auch MPEG4 oder h.264 über RTP - h.264 ist damals ausgefallen, weil die cam nur 8 fps liefert. Bei JPEG waren bis zu 30 fps und bei MPEG4 25 angegeben.
    Allerdings kann man auch JPEG und MPEG4 parallel laufen lassen - was angefordert wird, wird geliefert - wenn ich das auswähle, kann ich maximal 16fps angeben. Ich nehme mal an, dass sich da jemand beim erstellen des Dropdownfeldes in der MPEG4 Auswahlkriterien vertippt hat :so-nicht:

    Super - danke Sony :D

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!