x264 framegenau dekodieren?

  • Hallo,

    ich bin jetzt schon seit mehreren Tagen auf der Suche, wie ich ein x264-Video im mkv-Container framegenau dekodieren kann. Ich möchte also die exakte Framenummer eines Bilds sehen.

    Die einzige Möglichkeit die bei mir (theoretisch) funktioniert, ist eine avs-Datei zu erstellen und die mkv-Datei per DirectShowSource in VirtualDubMod zu laden.
    Die Frameanzeige ist jedoch nicht exakt. Wenn ich mir eine bestimmte Stelle (z.B. einen Szenenwechsel) suche und die Framenummer notiere, sie erneut öffne und zur gleichen Szene gehe, unterscheidet sich die Nummer manchmal um 1-2 Frames. An VirtualDub scheint es nicht direkt zu liegen, denn in AviDemux ist das gleiche zu beobachten.
    Ich habe auch schon erlebt, dass an einer Stelle zwei Mal hintereinander das gleiche Bild angezeigt wurde (also z.B. Frame 1234 und 1235 gleich waren), beim Neuladen der avs-Datei jedoch nicht mehr...

    Nach dem was ich bisher gelesen habe liegt das wohl grundsätzlich an DirectShow und/oder den B-Frames. Aber es muss doch irgendwie möglich sein, die Zahl der Bilder ist doch fest?!

    Was ich noch probiert habe ist per VirtualDubMod direkt die mkv-Datei zu öffnen, was auch grundsätzlich geht, das Video wird allerdings nicht dekodiert (Couldn't locate decompressor for format 'yyyy' (unknown)...), trotz aktuellem ffdshow mit VfW-Interface... :/

    AviDemux bietet seit kurzem anscheinend auch eine Importfunktion für mkvs, die offiziell aber noch kein x264 unterstützt... Bei mir lassen sich die Daten zwar öffnen und auch einigermaßen dekodieren (je nachdem was man bei den beiden Fragen nach alternativem Modus (bei dem die Framegenauigkeit verloren gehen soll) und Neuindizieren angibt), allerdings wird nur ein Teil der Datei eingelesen, also z.B. nur 10.000 Frames statt 150.000...

    Hat jemand vielleicht einen Tipp wie ich die Probleme einer der drei Methoden in den Griff kriegen kann? Oder vielleicht ein ganz anderes Programm? Im Prinzip würde mir auch ein Videoplayer reichen, der die aktuelle Framenummer korrekt anzeigt und frameweise Sprünge zulässt.

    Falls sich jetzt jemand fragt, warum es mir auf 1-2 Frames ankommt: Ich möchte die Tonspuren von DVDs an HDTV-Material anpassen und dazu wissen, ob und wie sich die Versionen unterscheiden...

    Vielen Dank schonmal! :)

  • Keine Ahnung ob es hilft, aber kannst ja das Tool mal probieren DGAVCDec 1.0.0 alpha 6. Damit kannst du raw h264 Dateien einlesen und anschließend framegenau dekodieren.

    Zitat

    Falls sich jetzt jemand fragt, warum es mir auf 1-2 Frames ankommt: Ich möchte die Tonspuren von DVDs an HDTV-Material anpassen und dazu wissen, ob und wie sich die Versionen unterscheiden...


    und du meinst später hört man, dass es um 1-2 frames verschoben ist? Das wären noch nicht mal 100ms. :) (bei den üblichen fps natürlich)

  • Zu Anfang das obligatorisches Schild: :welcome:
    Servus.

    Die einzige Möglichkeit die bei mir (theoretisch) funktioniert, ist eine avs-Datei zu erstellen und die mkv-Datei per DirectShowSource in VirtualDubMod zu laden.

    Viele Personen sind sich einig für Weiterverarbeitung und qualitatives Decoding von Videomaterial das "DirectShowSource" zu vermeiden.

    Was ich noch probiert habe ist per VirtualDubMod direkt die mkv-Datei zu öffnen, was auch grundsätzlich geht, das Video wird allerdings nicht dekodiert (Couldn't locate decompressor for format 'yyyy' (unknown)...), trotz aktuellem ffdshow mit VfW-Interface... :/

    Keine Sorge, das ist nichts Außergewöhnliches. Das VfW für X264 dient nur zum Encoding und nicht zur Dekodierung von Videomaterial.

    Oder vielleicht ein ganz anderes Programm?

    Ich empfehle bei AVISynth zu bleiben und "ShowFrameNumber" oder "ShowSMPTE" anzuwenden wenn die Framenummern auch unter Betrachung mit einem Mediaplayer sichtbar werden sollen.
    Anstelle von "DirectShowSource" solltest du dafür jedoch zu "AVCSource" greifen. Dieses für AVISynth erhältliche Plugin findest du hier: DGAVCDec
    Beiliegend ist eine verständliche Readme mit Beispielskript.
    Um an den "Elementary Stream" deines H264-Videos zu gelangen hilft dir das frei erhältliche "MKVExtract", welches ein Bestandteil von MKVToolnix ist.
    Zur einfacheren Handhabung von MKVExtract kannst du MKVExtractGUI verwenden.

    Falls sich jetzt jemand fragt, warum es mir auf 1-2 Frames ankommt: Ich möchte die Tonspuren von DVDs an HDTV-Material anpassen und dazu wissen, ob und wie sich die Versionen unterscheiden...

    Und auch hier könnte AVISynth durch Einsatz der Funktionen "Stackhorizontal" und "Stackvertical" helfen, in der Dokumentation steht worauf man alles achten muss.

    [EDIT] FatFaster
    Schnapp dir ein paar Videos, übe an denen "DelayAudio" aus und du wirst sehen wie ausschlaggebend die Richtung ist, in welche der Ton abweicht. Selbstverständlich wieder subjektiv einzuschätzen aber 100ms sind meinerseits unerträglich.

  • Im Prinzip würde mir auch ein Videoplayer reichen, der die aktuelle Framenummer korrekt anzeigt und frameweise Sprünge zulässt.

    Hallo,

    ich würde ffdshow als Decoder verwenden. Bei dem kann man sich mittels "OSD" die Framenummer anzeigen lassen. Nimmt man als Player den MPC, kann man mit "Pfeiltaste rechts" frameweise vorspringen, leider nicht frameweise zurück.

    Gruß

    akapuma

    Wer weiß, wovon er redet, kann es sich leisten, sich verständlich auszudrücken.
    Besucht auch meine Homepage: http://akapuma.info

  • DGAVCDec war genau, was ich gesucht habe. Jetzt funktioniert es exakt.
    Auch vielen Dank an matthiasb für die Tipps mit ShowFrameNumber und Stackvertical, damit lassen sich die Unterscheide perfekt finden. :)

    und du meinst später hört man, dass es um 1-2 frames verschoben ist? Das wären noch nicht mal 100ms. :) (bei den üblichen fps natürlich)


    Es geht mir nicht nur darum, dass sich das Gesamtvideo am Ende um 1-2 Frames unterscheiden kann, sondern dass einzelne Frames keine exakte Position haben. Wenn in einem Film also beispielsweise insgesamt 5 oder auch 10 Frames an einzelnen Stellen fehlen oder zu viel sind (und das fällt dann ins Gewicht) ist es unmöglich, sie per DirectShowSource zu finden, da sie ja anscheinend jedes Mal an einer anderen Stelle sind... Also kann man sie z.B. nicht gezielt löschen/duplizieren.

    Vielleicht reicht ja schon, in ffdshow's VfW-Codec das Decodieren von H.264 zu aktivieren. Falls VirtualDubMod diese MKV noch laden kann. Aber Ton hören kann man damit vermutlich auch nicht - mangels ACM-Codecs für z.B. AAC.


    Rein interessehalber würde ich das gerne mal ausprobieren. Mit den aktuellen ffdshow tryouts (beta2a_2007032 und rev1245_20070604) funktioniert es aber anscheinend nicht. In der VFW-Konfiguration unter Codecs steht bei H.264 "libavcodec". Oder muss ich da noch was anderes aktivieren?

    ich würde ffdshow als Decoder verwenden. Bei dem kann man sich mittels "OSD" die Framenummer anzeigen lassen. Nimmt man als Player den MPC, kann man mit "Pfeiltaste rechts" frameweise vorspringen, leider nicht frameweise zurück.


    Auch eine interessante Funktion, ist mir noch garnicht aufgefallen. Die Avisynth-Methode in VirtualDub ist natürlich wesentlich komfortabler. Aber trotzdem Danke! :)

  • Mit den aktuellen ffdshow tryouts (beta2a_2007032 und rev1245_20070604) funktioniert es aber anscheinend nicht. In der VFW-Konfiguration unter Codecs steht bei H.264 "libavcodec". Oder muss ich da noch was anderes aktivieren?

    Nein, genau das meinte ich... Wenn die neuesten Versionen das nicht können, dann vielleicht ältere. Oder der "United x264 Codec" von DeathTheSheep.

    Oder es liegt daran, dass in dem MKV die Videospur "nativ" gespeichert ist. Dann kriegt VirtualDubMod nichts vom Video mit, weil es diese Variante nicht versteht. Der FourCC "ÿÿÿÿ" (Hex: FF FF FF FF) ist ein Hinweis darauf.

  • Vermute ich auch, dass VirtualDub den Typ nicht erkennt. Als mp4 oder avi allerdings auch nicht...


    Jetzt habe ich aber ein anderes Problem: Ich möchte das Video per MeGUI in x264 encodieren und erhalte nach dem ersten Pass folgenden Fehler im Log:

    Code
    [h264 @ 0116700C]Internal error, IDCT permutation not set

    Meine avs-Datei:

    Code
    LoadPlugin("..\Tools\DGAVCIndex\DGAVCDecode.dll")
    AVCSource("hd.dga", deblock=false)
    AssumeFPS(25)
    
    
    Trim(0, 350) ++ Trim(414,0)
    DeleteFrame(26000)
    DeleteFrame(74215)
    DeleteFrame(145213)

    Ist bei zwei Filmen das gleiche. Per DirectShowSource gab es den Fehler nicht.

Jetzt mitmachen!

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