mpeg schneiden ohne netz und doppelten boden

  • hi
    erstmal: nettes Board habt ihr hier!


    zweitens gleich mal ein Problem:
    (ich weiss nicht, ob dass eine newbie-frage ist, fang aber sicherheitshalber mal hier an, bevor ich jemanden nerve)


    Ich möchte einen mpeg Film machen, der extra zerschossen aussieht. Die Idee dahinter ist, dass man daran sehen können soll, wie mpeg funktioniert.
    Dazu will ich die I-Frames in den GOPs mit anderen I-Frames aus einem anderen Film austauschen, sodass die Bewegungsvektoren usw. aus dem ersten Film auf die I-Frames aus dem anderen Film angewendet werden und ein wunderbarer Pixelsalat entsteht.


    Ich habe an dieser Idee auch schon rumgebastelt und mir cuttermaran und mpeg2schnitt angeschaut, aber das will nicht funktionieren, weil die Programme "zu sicher" sind und deswegen den Effekt den ich haben will nicht zulassen. Ich suche also ein Programm oder irgendeine Möglichkeit, wo genau das möglich ist: mpegs zu schneiden ohne dass das Programm, meine "Fehler" wieder rausrechnet bzw. garnicht erst erlaubt. Hat jemand dazu eine Idee?




    Ich kann ja mal erklären, was ich da gemacht habe:
    1. Zwei avi Filme erstellen, mit genau der gleichen Länge, Format usw.
    (400 Frames, PAL, unkomprimiertes Microsoft AVI, Progressive: kein interlace)
    2. Diese beiden Filme in TMPEGEnc als Elementary Streams genau gleich encodiert:
    MPEG-2 Video, ES, CBR
    GOP Structure: IPPPPPPPPPPPPPPP (1 I-Frame, 15 P-Frames)
    Haken bei: include GOP Sequence Header
    Keine Haken bei: Output bitstream for edition (Closed GOP) und Detect scene change
    3. Die ES (m2v hiessen die glaub ich) in Mpeg2Schnitt geladen
    4. Jeweils den I-Frame aus der einen Sequenz herausgeschnitten und dann die 15 P-Frames aus der anderen Sequenz.
    5. Schnitt angewendet.


    Das Problem ist, dass Mpeg2Schnitt, den ersten P-Frame der anderen Sequenz als einen I-Frame encodet hat, sodass ich anstatt Pixelsalat, einen Film erhalten habe, in dem immer kurz ein anderes Bild aufblitzt.


    Bei Cuttermaran war das auch nicht möglich, da durfte ich solche Schnitte gar nicht erst setzen.


    Ich hab natürlich auch schon intensiv gesucht, aber es ist anscheinend schwer Tipps zum kaputtmachen zu finden. :redface:


    danke für jeden Tipp
    philm

  • Hallo philm,


    da dein Film recht kurz ist, das Ganze sicher nur einmal gemacht werden soll und du eventuell den Aufbau von Mpeg2-Dateien kennst (sonst würdest du ja keinen Lehrfilm erstellen) würde ich dir einen Hexeditor empfehlen.


    Übrigens hat Mpeg2Schnitt nichts encodet sondern das nächstgelegene mögliche Bild zum schneiden gesucht. Das ist in deinem Fall das dazugehörige I-Frame gleich vor dem ersten P-Frame der GOP. Dein Film ist also länger geworden.
    IIPPPPPPPPPPPPPPPI...


    Martin

  • Spontan fällt mir dazu nur ein anderen Ansatz zur Lösung ein, die (hoffe ich) auch einfach zu handeln ist.


    Entweder erstelle mit VirtualDub eine Avi-Datei, wo zum Beispiel in einer Sequenz von 15 Bildern, zwei Bilder ausgetauscht werden. Geht natürlich auch über AviSynth, wo man mit trim einige Bilder aus einen 2. Clip einflügt.


    Damit den TmpgEnc füttern, weil dieser Encoder einer Funktion hat, die ihn dazu zwingt die von dir gewünschten Frames zu nutzen, so das der Encoder kein I-Frame beim Szenenwechsel nutzt, sondern ganz normal eine 15er GOP schreibt.

  • ja hallo
    danke für die Tipps


    werd mich mal die Woche ans ausprobieren setzen


    Wobei die virtualdub/tmpegenc Lösung sich erstmal einfacher anhört.


    Das mit dem hexeditor klingt dafür ziemlich interessant...
    Nein, ich kenne mich leider nicht so gut aus mit mpeg-2, dass wird also zuallererst einmal ein "Lehrfilm" für mich. Insofern werde ich mir die Sache mal im Hexeditor anschauen.
    Einen Tip vielleicht noch, wo man nachschauen kann (Link oder auch Buch), um diese Datenstrukturen von mpeg-2 zu lesen?


    grüße
    philm

  • Hallo Gleitz,


    Zitat

    Damit den TmpgEnc füttern, weil..., sondern ganz normal eine 15er GOP schreibt.

    Tmpgenc wird diesen Film nach allen Regeln der Kunst berechnen. Darf er an einem Szenenwechsel kein I-Frame setzen wird das P-Frame den gesamten Unterschied zum vorherigen Bild (des anderen Films) also Alles speichern. Das P-Frame ist dann vom Inhalt her ein I-Frame. "Verpixelungen" wie sie philm sehen möchte werden so nicht erzeugt, bestenfalls Klötzchen wenn die Bitrate zu niedrig ist.


    Martin

  • Mit einen Hexeditor würde ich das nicht machen. Besser wäre ein kleines Programm. Damit werden die elementaren Videostreams geladen und nach dem GOP-Header der erste Picture Startcode gesucht. Das ist das I-Frame. Dann werden die Daten bis zum nächsten Picture Startcode getauscht. Möglicherweise müssen noch Headerlängen angepasst werden. Sollte, glaube ich, nur bei MPEG-2, notwendig sein.

  • Hei,
    ich bin's wieder.
    was Martin Dienert zu Tmpegenc gesagt hat, finde ich einleuchtend.
    Ich habe also mal angefangen, die ersten I-Frames mit dem Hex-Editor auszutauschen. (ein kleines Programm wär natürlich super, aber da ich selber nicht programmiere, werde ich jetzt nicht jemand anderes fragen, für eine einmalige Aktion ein Programm zu schreiben...)
    Der Linktipp von Borax war da schon mal sehr hilfreich - schön übersichtlich diese Seite.
    Nachdem ich mich ein bißchen in das Thema reingegoogelt habe, bin ich auf das Programm avimaster Gui gestoßen, der die einzelnen Header identifiziert und Positionen angibt:


    http://www.thozie.de/dnn/AVIMaster/tabid/53/Default.aspx


    So musste ich nicht selbst überlegen, wie ich das am praktischsten mache...
    Auch weil im Hex-Editor, der I-Frame nur mittelbar zu finden ist (der Frame nach dem GOP-Header) was wohl wahrscheinlich damit zusammenhängt, dass der Frame-Typ in drei bit des Headers geschrieben wird.


    Über Headerlängen habe ich jetzt garnicht nachgedacht... (sollte ich das?)


    Auf jeden Fall ist das erste Ergebnis schon mal vielversprechend.


    (jetzt muss ich wahrscheinlich an den Kompressionsparametern drehen, da sich das richtige Bild ziemlich schnell wieder einstellt. ich brauche da wahrscheinlich eine Kompressionseinstellung, die hauptsäch über motion prediction, die nächsten p-frames baut.)


    Also Danke erstmal für die Hilfe.
    Grüße
    jan

  • Hallo,


    Frank
    Da ja ein ganzes Bild (Header und Daten) getauscht wird müßte am Header eigentlich nichts geändert werden. Aber vielleicht täusche ich mich auch. Nach meiner Meinung gibt es in Mpeg2-Elementardateien keine Headerlängen (oder ich habe sie noch nicht benötigt). Ein neuer Header wird am Startcode (00 00 01) erkannt. Auch diese Meinung stützt sich nur auf meine Erfahrungen und mangelhaften Studien des Standards (mangels Englischkenntnisse).


    philm


    Ändert sich viel im Film sind auch die Bildfehler bald verschwunden da es nichts mehr gibt was noch vom I-Frame stammen könnte. Ich denke für einen solchen speziellen Film müsste das Quellmaterial entsprechend passend sein.
    Beispiel:
    Es wird mit einem Stativ gearbeitet damit sich der Hintergrund nicht ändert und jemand läuft durchs Bild.


    Martin

  • habe zum thema mpg2 schneiden auch eine frage. ich habe die mpg2-datei mit projectX demuxed und dann mit mpg2schnitt geschnitten. nun habe ich eine geschnittene audio- und videodatei und möchte diese gerne wieder muxen, also zu einer datei zusammenfügen. mit tmpg kann ich dies aber nicht machen, da meine 30tage-probezeit abgelaufen ist. kann mir jmd. weiterhelfen?

  • Kleiner Nachtrag zum Thema
    (falls das jemanden interessiert, ich weiss, dass ist lange her, dass der Thread lief)
    Das Problem ist, dass die Ergebnisse nicht besonders anschaulich werden,
    weil neben den vielen neu auftauchenden Macroblocks (wie sie Markus Dienert richtig vorhergesagt hat), die, die tatsächlich bleiben, fast immer danach noch dct(glaube ich)-korrigiert werden.
    Man müsste also, um das Prinzip der motion vectors gut zu erklären, diese Fehlerkorrekturen irgendwie deaktivieren. Vielleicht über MacroblockMode:
    (Siehe: http://www.cs.unc.edu/~kmp/mpe…Video.MacroblockMode.html)
    Da ich mich jetzt an die wunderbare Erklärung von Fr An (http://www.fr-an.de/fragen/v06/index.htm) gehalten habe, (noch technischer ist dann bahnhof für mich) und dort die Struktur des Macroblocks noch nicht vorkommt, bin ich einfach nicht weitergekommen ;)
    ...
    Aber ich habe jetzt einen Lösungsansatz gefunden, den ich dann verwenden werde, wenn ich wieder Zeit dazu habe: Das ist zwar ästhetisch eigentlich nicht sehr schön, weil das dann nicht wirklich ein "gehacktes MPEG2" ist, aber für die Anschaulichkeit ziemlich ordentlich, scheint mir:
    Und zwar mit dem MVtool MotionCompensate für Avisynth tatsächlich nur die Bewegung auf ein anderes Bild übertragen, wie es in diesem Thread vorgeschlagen wird:
    http://forum.doom9.org/archive/index.php/t-84185.html


    Ich habe bis jetzt nur reingeschaut, aber eine Sache sind mir schon aufgefallen:
    Mir scheint, man muss die alte Version mvtools-v1.4.13 benutzen, sonst kann man nicht mit dem vorherigen errechneten Frame weiterrechnen. Das heisst, die "Verzerrung" des Ausgangsframes kommt immer nur einen Frame weit, dann wird wieder der originale Frame geladen.


    Ausserdem habe ich bei meiner Suche noch zwei Sachen gefunden,
    die in diesem Zusammenhang interessant sein könnten:


    MPeg2event, eine MPEG2 library:
    http://wwwx.cs.unc.edu/~kmp/mp…blosxom.cgi/overview.html


    VCDemo, eine Software, um verschiedene Aspekte der Bild-und Videokomprimierung vorzuführen:
    http://ict.ewi.tudelft.nl/index.php?Itemid=124



    Grüße


    philm

  • Hello,
    falls hier jemals nochmal jemand reinschauen sollte
    fürs Protokoll zwei imho ganz gute Lösungen.


    1. Mit Avidemux kann lassen sich nämlich ganz einfach I-Frames löschen und ersetzen, eine Anleitung zum "datamoshen findet sich hier:


    http://www.youtube.com/watch?v=tYytVzbPky8


    Aber im Prinzip braucht es die Anleitung nicht. Avidemux zeigt an der jeweiligen Stelle der Timeline an, ob es da gerade ein I- oder ein P- Frame ist. Wichtig ist eigentlich nur, darauf zu achten, fürs "Ausspielen" Copy zu wählen, also nicht neu zu codieren, und nicht "Smart Copy" zu wählen, da fragt das Programm dann nach.


    2. MVTools2 kann wieder Rekursion.
    Wenn es also nur die Bewegungsvektoren sein sollen, die auf ein anderes Bild angewendet werden sollen, ohne dass in den P-Frames einzelne Macroblocks ersetzt werden, Fehler korrigiert werden usw., dann geht das mit MVTools2: Bei "MCompensate" anstatt des ursprünglichen Clips, einfach den "msuperclip" des Bildes reingeben, auf das man die vektoren anwenden will und "recursion = 100" eintragen. Es geht allerdings nur mit pel = 1 (muss man auch eintragen, weil default ist 2, glaube ich) Aber das ist ok, es kommt ja eh Pixelchaos raus ;) Dieses Chaos lässt sich allerdings sogar ein wenig glätten, indem man die overlap-Funktion verwendet.


    voila