AVI-Aquisitor

  • Hallo!

    Ich versuche mittels AVIStreamGetFrame Frames aus einem AVI-File auszulesen um sie weiter zu bearbeiten.
    Die Funktion gibt mir einen Pointer zurück auf das aktuelle Frame. Das Problem ist, dass der Pointer auf das Pixel rechts unten im Bild zeigt und mein Bild daher verkehrt ist. Noch dazu ist das Bild in meiner Struktur in R-G-B gespeichert und ich bekomms in G-B-R von der Funktion zurück. Es sieht dann ungefähr so aus:

    [Blockierte Grafik: http://i17.photobucket.com/albums/b73/WuZweng/simpsons.jpg]

    Weiß jemand eine Lösung? Wenn ich die meine Struktur umbau, dass ich zumindest die Farben richtig hinbekomm, bleibt noch immer das Problem mit dem Verkehrten Aufbau. Ich möcht auch nicht alle Pixel unbedingt neu in meine Datenstruktur reinkopieren, weils doch bei 25fps ziemlich viel is. Überseh ich irgendwas, oder isses wirklich aussichtslos mit der Funktion?

    640K ought to be enough for anybody. :eek2:

  • Bei dem Ausgangsformat keine Chance ! - Zuerst den ganzen Film in ein MOV oder AVI mit folgenden Settings wandeln, dann erst Frames extrahieren (und nach dem Grafik Export z.B in Photoshop "De-interlacen" (Filters/Video/De-Interlace !!!):


    DV-Pal, 720x576 Pixels, Stereo, 16 Bit, 44,1 khz, Best Quality

  • Ich glaub du verstehst nicht was ich meine. Ich hab ein Programm geschrieben, welches AVI-Files einlesen soll (weil ich nichts anderes brauch) und ich brauch dann in meiner Datenstruktur die einzelnen Frames. Dazu les ich jedes Pixel des aktuellen Frames ein. Durch die oben genannte Funktion bekomm ich den Pointer auf das aktuelle Frame, nur sind die Daten dort anders gespeichert. Das hat jetzt nichts mit Photoshop o.ä zu tun. das Bild oben ist ein Frame eines Videos.

    Und was meinst du mit "DV-Pal, 720x576 Pixels, Stereo, 16 Bit, 44,1 khz, Best Quality" ?

    640K ought to be enough for anybody. :eek2:

  • auch wenn du mich durch einen gemeinen trick zu dem thread gelockt hast:D :
    muss man vllt. irgendwo die headerlänge angeben? hatte das selbe problem mit den falschfarben (aber nicht gespiegelt und unter visual basic), habe die headerlänge angepasst -> funktioniert.

  • Irgendwie muss ich die Leute ja anlocken =)

    Also es gibt tatsächlich einen Parameter der den Bitmapheader festlegt. Nur ist da nichts zu machen. Ich hab alles versucht. RGB wirds sicher nimmer und wegen dem verkehrten Bild steht dort, wenn man die Höhe des Bildes mit einer negativen Zahl angibt, dann liest er beginnend mit dem top-left-pixel, ansonsten mit dem top-down-pixel, wie's ja bei mir is. Nur gibts eine Access-Violation, wenn ich die Höhe negativ angebe.. ahhh..

    640K ought to be enough for anybody. :eek2:

  • Ich hab jetz schon viel probiert und hab bemerkt, dass der Pointer für den Datenbereich nicht stimmt. Das seltsame ist, dass ich die richtigen Farben bekomme, wenn ich den Pointer einfach ein Byte höher setz. Ich versteh die Struktur nicht. Verkehrt isses noch immer. Falls irgendwer Ideen hat, nur her damit, ich bin im Moment ratlos.

    640K ought to be enough for anybody. :eek2:

  • Zitat von Swoncen

    Hat sich erledigt. Endlich geschafft.


    Woran lag es jetzt? War der Pointer falsch gesetzt?

  • Naja ich hab mir mehrere Tuturials durchgelesen und der eine hat den Pointer so berechnet, der andere wieder anders. Das lustige war, dass beim einen die RGB-Werte vertauscht waren und beim anderen der Pointer zu hoch war, damit hat was vom Bild gefehlt (von links oben), aber bei dem waren die RGB-Werte richtig.. sehr seltsam das ganze. Ich hab dann einfach mit dem Pointer herumprobiert, bis das Pointer genau beim ersten Pixel begonnen hat und da wars dann wieder mit den RGB-Werten falsch. Also hab ich den Pointer um ein Byte nach oben gesetzt und es hat gepasst. Das das Bild verkehrt liegt, liegt angeblich am Video. Naja zumindest hab ich das Video in richtiger Form und umdrehen kann ichs bei meinem ersten Bearbeitungsprozess sowieso ohne Zeitverlust, weil ich da sowieso den Hintergrund subtrahier =)

    Code
    [size=10]pDIB = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pFrame, i-iFirstFrame);
    [/SIZE][size=10][COLOR=#008000][COLOR=black]vsi_Image->SetDataPtr((uint8*)(pDIB + 1));[/COLOR]
    [/COLOR][/SIZE]



    So schauts dann aus. vsi_Image ist eine Instanz von meiner Imageklasse. Schon komisch, dass es im Netz nichts einstimmiges gibt. Ich wette es gibt noch eine Möglichkeit das Bild umgedreht zu bekommen. :rolleyes:

    640K ought to be enough for anybody. :eek2:

  • Neue Entdeckung: Wenn man die Daten von obiger Funktion als BMP speichert, ist das Bild verkehrt, wenn mans als Video speichert nicht.. :shinner:

    640K ought to be enough for anybody. :eek2:

  • Sind nicht eigentlich Bitmaps verkehrt? Wenn du ein bmp im Browser ansiehst, mit ner langsamen Verbindung, baut sich das Bild von unten nach oben auf.

    In einen FBO rendern ist wie eine Schachtel Pralinen - man weiß nie, was man kriegt.

Jetzt mitmachen!

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