Wie kriege ich AviSynth dazu die voll Prozessorleistung zu nutzen?

  • Schönen guten Tag allerseits,

    ihr scheint euch ja recht gut mit AS (Avisynth) auszukennen und ich hoffe, dass ihr mir mir bei folgendem Problem weiterhelfen könnt:

    Ich hole mal ein bisschen weiter aus. Das Video um das es geht war ursprünglich ein P2 DVCPro 100 MXF File (1920*1080, 100 Mbit), von dem Video haben wir den MXF-Header entfernt und so ein Dif-File generiert. Dieses Dif gilt es nun mit AS wiederzugeben. Spiele ich es ohne AS ab, z.B. im Mediaplayer Classic oder im GraphEdit läuft das Video einwandfrei. Einwandfrei heißt flüssig und mit synchronen Audio (Audio ist *****ded). Die Wiedergabe sorgt für eine Prozessorauslastung von ca. 50-60 %. Will ich nun das gleiche Video mit AS wiedergeben, läuft es in Zeitlupe und das Audio läuft ca. 3-4 Sekunden vor. Dabei geht die Prozessorauslastung nie über 30%.

    Jetzt die Frage:

    Wie bekomme ich AS dazu die zur Verfügung stehende Leistung zu nutzen, bzw. das Video flüssig und, fast noch wichtiger, mit synchonen Audio wiederzugeben?

    Ich verwende im moment einfach nur folgendes Script:

    SetMemoryMax(128)
    clip1= DirectShowSource("D:\29.dif", fps=25)
    return clip1

    Für Hinweise jeglicher Art wäre ich sehr dankbar!

    MfG

  • :welcome:

    Die Schwierigkeit hierbei liegt wahrscheinlich unter anderem darin, dass AviSynth immer decodiert, das decodierte Video und Audio dann aber auch erst mal im RAM aufbewahrt, und anschließend das Video in vollem Umfang langwierig zur Grafikkarte kopieren muss.

    Ein DirectShow-Renderer dagegen wird bei der Decodierung möglichst das Video direkt in den Speicher der Grafikkarte schreiben, was aufgrund eines Nur-Schreib-Bereiches beim Hardware-Overlay besonders schnell und effizient abläuft.

    AviSynth ist grundsätzlich nicht für eine Echtzeit-Vorschau gedacht. Wenn es für Echtzeit schnell genug ist, gut und schön ... aber Hauptschwerpunkt ist die qualitativ hochwertige und flexible Filterung, sowie eine breite Unterstützung von Quellformaten (als Brücke für die Tools, die ansonsten bloß AVIs via VfW unterstützen).

  • Guten Mogen,

    danke für die Antwort und den Wilkommen Smiley. Auch wenn mich die Antwort nicht unbedingt glücklich macht. Heißt das, dass es keine Chance gibt, das Ding mit AviSynth flüssig zum laufen zu kriegen? Dass wäre ja unschön. Vielleicht irgendeinen Tipp, was ich noch ausprobieren könnte, oder sagst du, dass da nichts zu machen ist?

  • Wie Dir sicherlich schon aufgefallen ist, wird nur noch ein Kern der CPU genutzt, da Avisynth nicht MultiCore tauglich ist. Es gibt jedoch ein Plugin für Avisynth names MT, siehe: http://avisynth.org/mediawiki/MT
    Den "setmtmode()"-Befehl mal vor dem Laden des Quellvideos probieren.
    Ausserdem könntest Du ja mal "setmemorymax()" mal variieren, mehr Speicher zuweisen oder die Zeile ganz weglassen.

    Wenn es Dir um das Benutzen von Avisynthfiltern beim Abspielen geht, gäbe es auch noch die Alternative, das Video mit ffdshow als Decoder wiederzugeben, dort sind schon ein paar brauchbare Filter eingebaut, die man nach Bedarf aktivieren kann.

    Weiß allerdings nicht, ob ffdshow Dein Video überhaupt decodieren kann.

    mawi2006

    Intel Q9550@2500 MHz / Motherboard Name Asus P5N-VM WS / Grafikkarte NVIDIA Quattro FX470 / 4x2 GB 800 MHz / DVD-RAM DVR-216DBK / LiteOn IHas 322 / HDD: 500 GB HD502HJ / SSD: Solidata K5 64GB

  • Hi,

    danke für deinen Hinweis. Das Plugin probiere ich gleich mal aus. Ich hab's just in diesem Moment vernünftig zum Laufen gekriegt, indem ich statt der Datei, den Graphen aus Graphstudio einbinde. Siehe da --> Flüssig und synchon. Allerdings würde das heißen, dass wir dann für jedes Video on the fly einen Graphen erzeugen müssen...mal gucken wie das geht. Jetzt versuch ich mal deinen Ansatz. Danke!

    //Edit//

    Hier das Script:

    SetMemoryMax(128)
    clip1= DirectShowSource("c:\temp\29.grf",seek=false,audio=false)

    clip0a0= WavSource("c:\temp\30_A0.wav")
    clip0a1= WavSource("c:\temp\30_A1.wav")
    clip0a2= WavSource("c:\temp\30_A2.wav")
    clip0a3= WavSource("c:\temp\30_A3.wav")
    clip0aud=MergeChannels(clip0a0,clip0a1)
    schnitte2=AudioDub(clip1,clip0aud)
    return schnitte2

Jetzt mitmachen!

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