Avisynth Textausgabe

  • Ich möchte gerne die Field Order eines interlaced Avi mit einem Avisynth-Script analysieren und das Ergebnis in ein Textfile schreiben.

    Ich möchte dazu folgendes oder ein ähnliches Script benutzen :

    Code
    function CheckTopFirst4(clip v1){global top_hits=1global bot_hits=1global text1 = ""global text2 = ""global text3 = ""global text4 = ""v1 = assumeframebased(v1)global tff=assumetff(v1).separatefields().bob()global bff=assumebff(v1).separatefields().bob()istff = tff.subtitle("Is frame TFF: TRUE").frameevaluate("top_hits=top_hits+1.0")isnottff = tff.subtitle("Is frame TFF: FALSE").frameevaluate("bot_hits=bot_hits+1.0")outclip = conditionalfilter(tff,istff, isnottff, "yDifferenceFromPrevious(tff)+ydifferenceToNext(tff)","<","yDifferenceFromPrevious(bff)+yDifferenceToNext(bff)",false)outclip = frameevaluate(outclip,"text1 = "+chr(34)+"STATS: TFF = "+chr(34)+" + string(100.0*top_hits/(top_hits+bot_hits)) + " + chr(34) + "%"+chr(34))outclip = frameevaluate(outclip,"text2 = "+chr(34)+"STATS: BFF = "+chr(34)+" + string(100.0*bot_hits/(top_hits+bot_hits)) + " + chr(34) + "%"+chr(34))outclip = scriptclip(outclip, "Subtitle(text1,y=50)")outclip = scriptclip(outclip, "Subtitle(text2,y=70)")text3 = string(100.0*top_hits/(top_hits+bot_hits))text4 = string(100.0*bot_hits/(top_hits+bot_hits))Call(BlankClip, "c:\Programme\Avisynth\PlugIns\2_5_x\nicecho.exe e:\capture5\report.txt " + text3 + "x" + text4 + "\n", "-2") return outclip}


    Ich rufe diese Funktion mit diesem Script auf :

    Code
    v=SegmentedAVISource("e:\capture1\capture.avi")
    v2=ConvertToYV12(v)
    CheckTopFirst4(v2)


    Das Problem ist jetzt, das in der Textdatei 'report.txt' nur 0.00000 steht, anstatt eine Liste mit den Prozentzahlen, die man auch auf dem Bildschirm sieht, was mache ich falsch ?

  • liegt wahrscheinlich an der CALL Function von Nic, guck mal hier:

    http://forum.doom9.org/showthread.php?s=&threadid=46506

    Hab lange nicht mehr wirklich gescripted mit Avisynth soweit ich mich entsinne hat die aber öfter mal Probleme gemacht.

    Falls Dein Englisch einigermaßen brauchbar ist würde ich Dir empfehlen Nic ne Email oder ne PM zu schreiben (bei doom9.org im Forum), selbst wenn es nicht an der CALL Methode liegt kann der sicher helfen. :)

    Cu Selur

  • Call wird hier (durch das -2) nur 1x VOR dem encoding aufgerufen (Call ist ja eher gedacht zum Aufrufen von anderen Programmen oder batch-files).

    Die Variablen, die von FrameEvaluate gesetzt werden, werden von Call einfach nicht gelesen.
    Es gibt auch keine Funktion "Ausgabe in File".

    Evtl. geht es, wenn du Call selbst von einem FrameEvaluate aufrufen lässt (ist aber ziemlich brutal, da ich mir nicht sicher bin, was passiert, wenn Call / NicEcho zu oft fast gleichzeitig aufgerufen werden).

    Die sauberste Lösung wäre eine eigene Funktion "String-Ausgabe in Datei zur Laufzeit".

    (vielleicht hab ich Zeit dazu, dürfte nämlich ganz einfach und generell recht nützlich sein).

  • ich werds eher als reine String-Ausgabe machen und die string()-Funktion entsprechend erweitern (ist eh fällig und was ich im Code gesehen habe ganz leicht mit einem zweiten Argument machbar).

  • Ich hake mich hier mal ein. Die folgende Frage habe ich auch schon mal im englischen Doom9 gestellt, da hat mich aber wahrscheinlich keiner so richtig verstanden, daher probiere ich's hier nochmal.

    Es ist ja möglich, mithilfe von AVISynth herauszufinden, an welchen Stellen innerhalb eines Films viel und wo wenig Action ist. Wäre es möglich, das in Form einer Frameliste auszugeben, könnte man den MVBR-Modus zusammen mit Force Picture Type Setting von TMPGEnc benutzen, um ein Szenen-optimiertes Encoding zu erreichen.
    Möglich wäre es ja dann, den Q-Wert an die jeweiligen Szenen anzupassen, was aber beileibe nicht das einzige wäre, was man machen könnte.
    Prinzipiell kann man damit den CQ- und 2pass-Modus um Längen schlagen. Das Problem ist halt, eine solche Liste zu bekommen - und sie TMPGEnc auch noch unterjubeln zu können.
    Vielleicht hat ja jemand Ideen dazu.

  • Na, wenn WarpEnterprise's geplante Report-Funktion das bald kann, dann sollte das kein Problem mehr sein, sofern wenigstens ein Zahlenwert pro Bild ermittelt und als String ausgegeben werden kann. Denn rechnen läßt es sich ja pro Frame ganz vorzüglich in AviSynth.

  • Write() und String(variable, format):
    http://www.avisynth.org/users/warpente…ll_20030920.zip

    Code
    Version.FadeIn(50).ConvertToYV12       # ein test-video# print von frame number, Zeit und AverageLuma für diesen Frame# Chr(34) ist notwendig, da man sonst keine Anführungszeichen in einen String bekommtWrite(last, filename, "current_frame", "time(" + chr(34) + " %H:%M:%S " + chr(34) + ")", "AverageLuma")

    Details in der (engl.) Doku.

    Gut dass Kika sein Anwendungsbeispiel erwähnte: jetzt hab ich auch eingebaut, dass man eine Zeile NICHT ausgibt.

    VORSICHT: das Clip, das man im Write dem AverageLuma füttert, darf man DANACH nicht mehr verwenden, sonst wird das ganze irgendwie rekursiv und crasht (also einfach eine tmp-Variable einbauen - kostet nichts, da eh alles im cache).

    Die String-Funktion ist wie die eingebaute, kann aber optional mit einem Formatstring gesteuert werden:

    Code
    String(1.23, "%f")     '1.23'
    String(1.23, "%5.1f")  '  1.2'
    String(1.23, "%1.3f")  '1.230'
  • @ Tsunami et all

    Hallo,

    so etwas Ähnliches habe ich auch schon gesucht, d.h. ich wollte die Fieldorder sichtbar machen, und die zwei Möglichkeiten (TFF +BFF) nebeneinandergestellt sehen

    Im Internet, Author leider unbekannt, fand ich dann irgendwo folgende Lösung:
    ==============================

    For YUY2 and RGB material:

    function CheckTopFirst(clip v1) {
    v2 = v1.subtitle(v1.GetParity()?"TF":"BF")
    v3 = v2.GetParity()?v2.ComplementParity():v2
    t0 = v3.ComplementParity()
    t1 = t0.separatefields()
    t2 = compare(t1.trim(1,0),t1)
    b1 = v3.separatefields()
    b2 = compare(b1.trim(1,0),b1)
    return stackvertical(t2,b2)
    }
    Usage:

    v=AviSorce("file.avi") CheckTopFirst(v)
    Then preview a few frames. It will use Compare to evaluate the two possibilities and vertically stack the results. This shows 2 useful pieces of info. First the preview of either the top or bottom half of the screen will probably be jerky, so choose the other one.

    But just as reliable is the "Avg Mean Abs Dev" value that is displayed for each. Choose either the top (TopFirst?=1) or bottom (TopFirst?=0) clip that has the LOWEST value for Avg Mean Abs Dev.


    =======================

    Meine Funktion sah nun wie folgt aus: CheckField.avs

    function CheckTopFirst(clip v1) {
    v2 = v1.subtitle(v1.GetParity()?"TF":"BF")
    v3 = v2.GetParity()?v2.ComplementParity():v2
    t0 = v3.ComplementParity()
    t1 = t0.separatefields()
    t2 = compare(t1.trim(1,0),t1)
    b1 = v3.separatefields()
    b2 = compare(b1.trim(1,0),b1)
    return stackvertical(t2,b2)
    }


    =============================

    Als Avisynthscript hatte ich dieses benutzt:

    LoadPlugin("D:\SVideo-CD\AVSGEN\bin\MPEG2DEC.dll")
    LoadPlugin("D:\SVideo-CD\AVSGEN\bin\Decomb.dll")
    LoadPlugin("D:\SVideo-CD\AVSGEN\bin\AVISynth_Spatial.dll")
    LoadPlugin("D:\SVideo-CD\AVSGEN\bin\MPEGDecoder.dll")
    LoadPlugin("D:\SVideo-CD\AVSGEN\bin\Convolution3D.dll")
    AVISource("J:\Test.avi")
    Import("J:\CheckField.avs")
    LanczosResize(720,576,1/3,1/3)
    Crop(0,4,720,568)
    AddBorders(0,4,0,4)

    ==============================

    Nun bekam ich leider keine 2 vertikal nebeneinanderliegenden Clips die ich hätte vergleichen können, sondern nur einen (und das weder in VirtualDub noch im Mediaplayer). Dieser Clip schien mir zudem unverändert. Es erfolgte auch keine Fehlermeldung bei VirtualDub. Allerdings bin ich auch nicht gerade ein Skriptprofi...
    Aber vielleicht kann man mit den Ansätzen schon etwas anfangen.

    Gruß
    HME

Jetzt mitmachen!

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