Fehler in der Framereihenfolge durch MT?

  • Hallo,

    in einem x264-Encode ist mir folgender Fehler aufgefallen: An einer Stelle enthält das Video einen Frame, der eigentlich erst wenige Augenblicke später kommen dürfte (und dort dann aber noch einmal vorhanden ist). Beim Ansehen macht sich das durch einen interessanten Sprung in der Bewegung bemerkbar. Mein Skript sieht folgendermaßen aus:

    Kann das Problem mit dem Mutlithreading zusammenhängen? Ich verwende Avisynth 2.6 MT (32 Bit) unter Windows 7 (64 Bit). Dafür würde zumindest die Tatsache sprechen, dass der Fehler beim Frame-weisen ansehen des Skriptes nicht auftritt, sondern erst während des Encodierens erzeugt wurde.

    Mir ist auch noch aufgefallen, dass das fertige Video 4 Frames mehr hat, als das Avisynth-Skript (zumindest behauptet das DirectShowSource). Insgesamt habe ich jetzt natürlich ein wenig das Vertrauen verloren, denn ein sorgloses Archivieren ohne sofortiges Ansehen und Prüfen eines Videos ist so natürlich nicht mehr möglich.

    Fällt euch irgendwas dazu ein? :)

    Grüße
    ph4nt0m

  • Ja, die meisten Sourcefilter mögen kein MT. Mit mode=3 kommt man bei AviSource meist durch, aber MPEG2Source() läuft nur mit mode=5 oder ohne MT ordentlich, wie ich selber festgestellt habe.
    Also einfach das erste SetMTmode ändern in 5,8 (wobei ich mit 8 Threads auch vorsichtig wäre, denn ich meine im englischen doom9 gelesen zu haben, dass die Faustregel besagt, es auf die Hälfte der vorhandenen Kerne zu setzen – jedenfalls frisst es viel RAM, was zu Instabilität führen kann).

    3 Mal editiert, zuletzt von Skiller (26. Mai 2013 um 00:22)

  • Sonderbarerweise hat SEt nun für AviSynth MT ab Version 2.60 alpha 3 oder 4 dokumentiert, dass man Mode 5 nicht mehr nutzen solle und Mode 3 genüge; wenn das im Fall von MPEG2Source nicht stimmt, ist das ein weiterer Grund, noch mal nachzuhaken, denn ich warte immer noch vergeblich darauf, dass mal die Details der Modi über 2 erklärt werden, und so etwas kann anscheinend nur SEt...

    Die Beschränkung der Kerne auf maximal 4 würde ich auch empfehlen, denn es gibt komplexe Filter, die in AviSynth sehr viel RAM benötigen, was sich pro Parallelisierung erhöht; und auch der nachfolgende Encoder, sicherlich x264, wird RAM und Rechenleistung brauchen.

  • Groucho2004 hat mich auf eine Erklärung von IanB verlinkt. Daraus geht hervor: Modi 3-6 unterscheiden sich nur in Details. Man sollte also im Grunde schon bei Modus 3 bleiben; aber es gibt Möglichkeiten, den Quellfilter zu entlasten, dass er nicht andauernd verschiedene Threads bedienen muss, die sich um die aktuelle Position der Decodierung streiten. Dies wird erreicht durch einen "Pufferfilter" zwischen dem Quellfilter und dem hauptsächlich multithreaded ausgeführten Filter, welcher ein paar Frames in der Nähe der aktuellen Position zwischenspeichert und neue Frames schön brav in der aufsteigenden Reihenfolge vom Quellfilter abfragt.

    Eine Variante ist der Filter RequestLinear() aus dem Plugin TIVTC von tritical. Der lässt sich auch schön detailliert konfigurieren, wie viele Frames davor und danach zur Pufferung bzw. einem schnellen oder kompletten Nachladen herangezogen werden sollen.

    In AviSynth 2.60 alpha 4 wurde außerdem der Filter Preroll() hinzugefügt, der mir allerdings nicht ganz so ausgefeilt scheint.

    Mein Vorschlag wäre also:

  • Erstmal vielen Dank für eure Hilfe. Es tut mir Leid, dass ich mich nicht früher gemeldet habe, aber ich habe überhaupt keine E-Mail-Benachrichtigung erhalten, obwohl ich das Thema selbstverständlich abonniert hatte :rolleyes_: und eure Antworten deshalb erst gerade gesehen. Dein Skript werde ich sehr gerne ausprobieren, LigH.

    In der Zwischenzeit hatte ich mir damit geholfen, in MeGUI den "pre-rendering job" zu nutzen. Dadurch laufen AviSynth und x264 nicht mehr parallel und die Gesamtlaufzeit ist nur unwesentlich gestiegen. Die beschriebenen Fehler blieben bislang zumindest aus. Ich nehme an, dass x264 auf sehr viele zurückliegende Frames zugreift (--ref 11) und AviSynth dabei durcheinander kommt. Ein lokaler Puffer innerhalb von AviSynth ist natürlich eine elegantere Lösung, LigH, als erst eine riesige Lossless-Datei zu erzeugen. ;)

    Könnt ihr mir noch etwas zu SetMemoryMax(n) sagen? Ich habe zwar 16GB Ram installiert, aber das 32bit AviSynth kann unter 64bit nur maximal 4GB nutzen, oder? Kann man auf dieser Basis eine allgemeine Empfehlung für n aussprechen, oder hängt es zusätzlich vom Skript bzw. den verwendeten Filtern ab?

  • x264 sollte eigentlich immer nur linear Frames anfordern, das nicht lineare anfordern geschieht i.d.R. durch Filter,...

    Zitat

    32bit AviSynth kann unter 64bit nur maximal 4GB nutzen, oder?


    benutze i.d.R. 768MB und hier und da 1024MB, mehr macht meiner Ansicht nach i.d.R. keinen Sinn, da es sich hier nur um den lokalen Speicher von Avisynth für Variablen handelt, der Speicher den eventuelle Filter verbrauchen ist da nicht drinne,..
    sprich wenn Du Avisynth 1500MB zu ordnest von den 3GB die es unter 64bit zur Verfügung hat (LARGE ADDRESS SIZE), dann sind nur noch 1500MB für die anderen Filter da.
    -> Der tatsächliche Speicherverbrauch ist auf <= 3GB eingeschränkt und wird vor allem durch die verwendeten Filter bestimmt.

    Cu Selur

  • Wie mir erklärt wurde, sind es tatsächlich volle 4 GB, wenn ein 32-bit-Prozess Large-Address-Aware unter einem 64-bit-System läuft. Dann sind die Treiber-Speicherfenster und das Betriebssystem ja nicht in diesem Prozess-Speicher reserviert. Aber davon unabhängig: Es lohnt sich sicher, die Grenze nach unten auszutesten; es wird sicher gute Gründe geben, dass AviSynth selbst einen relativ konservativen Standard vorgibt.

Jetzt mitmachen!

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