Zeitlupe in Echtzeit mit AviSynth

cipoint

Cadet 4th Year
Registriert
Nov. 2005
Beiträge
67
Ich möchte Videos in Zeitlupe wiedergeben (z.B. mit dem Media Player Classic). Dafür möchte ich ffdshow und einen AviSynth-Script verwenden. Bisher habe ich er erfolglos mit MVTools2 und SVP probiert (Scripts siehe Anhang). Die Frame-Interpolation klappt zwar (z.B. von 30 auf 60 FPS), ich kann aber die Ausgabe-FPS nicht einstellen, so dass die Videos nicht langsamer wiedergegeben werden. AssumeFPS zeigt keine Wirkung.

Kann mir jemand helfen?
 

Anhänge

  • slowmo.zip
    698 Bytes · Aufrufe: 122
Ich will's nicht beschreien - aber ich glaube, dass das so nicht klappen wird. Ich kann mir jedenfalls gut vorstellen, dass ffdshow alle AviSynth-Befehle ignoriert, die Einfluss auf die Laufzeit haben (wie eben AssumeFPS). Das würde nämlich dem DirectShow-Subsystem entgegen arbeiten, welches primär auf eine möglichst synchrone Bild- und Tonausgabe ausgelegt ist.

Aber zumindest der 'Media Player Classic - Homecinema' hat eigene Buttons in seiner Wiedergabeleiste, um in einen Zeitlupen-Modus zu schalten. In Kombination mit ffdshow und SVP sollte es eigentlich möglich sein, die Framerate hoch zu rechnen und dann über den Player in eine weiche Zeitlupenwiedergabe zu schalten...
 
Hallo und Danke für deine Antwort. Wenn ich die Framerate eines 30fps-Videos auf 60fps per AviSynth-Skript in ffdshow hochrechne und die Wiedergabebegschwindigkeit in MPC dann halbiere, sollte ich logischerweise eine um die Hälfte verlangsamte Wiedergabe mit 30fps bekommen. In der Praxis funktioniert das nicht. Je nach Skript lässt sich die Wiedergabegeschwindigkeit in MPC entweder gar nicht verändern, oder aber, das Video ruckelt sehr stark und unregelmäßig.

Eine Idee ist mir gerade gekommen: Man könnte das AviSynth-Skript auch in VirtualDub laden und das Video dort abspielen. Vielleicht würde AssumeFPS in diesem fall funktionieren. Ich frage mich nur, wie ich dem AviSynth-Skript mitteile, welche Datei in VirtualDub gerade geöffnet wurde. Mit AviSource("bla.avi") ist man ja recht unfexibel. Gibt es da etwas Ähnliches wie ffdshow_source()?
 
cipoint schrieb:
Hallo und Danke für deine Antwort. Wenn ich die Framerate eines 30fps-Videos auf 60fps per AviSynth-Skript in ffdshow hochrechne und die Wiedergabebegschwindigkeit in MPC dann halbiere, sollte ich logischerweise eine um die Hälfte verlangsamte Wiedergabe mit 30fps bekommen. In der Praxis funktioniert das nicht. Je nach Skript lässt sich die Wiedergabegeschwindigkeit in MPC entweder gar nicht verändern, oder aber, das Video ruckelt sehr stark und unregelmäßig.
Also ich hab's gerade mal getestet (mit LAV-Videodecoder + ffdshow RAW Video Filter + SVP innerhalb der AviSynth-Sektion vom ffdshow RAW Video Filter) und es hat eigentlich recht ordentlich funktioniert :confused_alt: ...


cipoint schrieb:
Eine Idee ist mir gerade gekommen: Man könnte das AviSynth-Skript auch in VirtualDub laden und das Video dort abspielen.
Vorschlag: spiele das AviSynth-Script mit dem Media Player Classic ab - das geht nämlich auch.


cipoint schrieb:
Vielleicht würde AssumeFPS in diesem fall funktionieren.
Keine Ahnung, warum ich nicht auch die Idee hatte (ich werd wohl langsam alt ;) ) - aber: ja, in diesem Fall würde es tatsächlich funktionieren.


cipoint schrieb:
Ich frage mich nur, wie ich dem AviSynth-Skript mitteile, welche Datei in VirtualDub gerade geöffnet wurde. Mit AviSource("bla.avi") ist man ja recht unfexibel. Gibt es da etwas Ähnliches wie ffdshow_source()?
Es gibt L-SMASH-Works (= besser) und FFMS2 (= etwas schlechter). Beide basieren (genau wie ffdshow) auf den Decoder-Bibliotheken von FFmpeg.

Für L-SMASH-Works:
  • die LSMASHSource.dll gehört in den AviSynth Plugin-Ordner
  • ein Video lädt man per
    Code:
    LWLibavVideoSource("C:\Pfad_zur\Video.datei")
  • das erste Laden dauert immer ein wenig, da zuerst eine Index-Datei erstellt wird (nötig für fehlerfreies, framegenaues Springen innerhalb der Datei)
  • öffnen lassen sich alle Datei- und Kompressionsformate, die auch FFmpeg decodieren kann (siehe hier)


Für FFMS2:
  • die ffms2.dll, fmsindex.exe und FFMS2.avsi kommen in den AviSynth Plugin-Ordner
  • ein Video lädt man per
    Code:
    LoadCPlugin(C:\Pfad_zur\ffms2 .dll")
    FFVideoSource("C:\Pfad_zur\Video.datei")
    ... oder per
    Code:
    Load_Stdcall_Plugin(C:\Pfad_zur\ffms2 .dll")
    FFVideoSource("C:\Pfad_zur\Video.datei")
    ... falls mit LoadCPlugin eine Fehlermeldung kommt
  • das erste Laden dauert immer ein wenig, da zuerst eine Index-Datei erstellt wird (nötig für fehlerfreies, framegenaues Springen innerhalb der Datei)
  • öffnen lassen sich alle Datei- und Kompressionsformate, die auch FFmpeg decodieren kann (siehe hier)
 
Aha, jetzt funktioniert es. Ich lade mit DirectShowSource("bla.avi") eine Datei im AviSynth-Skript und lade das Skript dann im MPC. Dann funktioniert auch AssumeFPS() bestens und die Wiedergabegeschwindigkeit lässt sich im MPC auch noch einstellen.

Mich stört nur noch eins: Ich muss den Pfad der Videodatei immer per Hand in das Skript eintragen. Praktisch wäre es, wenn ich die Videodatei per Doppelklick öffnen könnte. Welche Optionen gäbe es da? Spontan fällt mir ein Konsolenskript ein, welches beim Doppelklick auf eine Videodatei aufgerufen wird und dann den Dateipfad ins AviSynth-Skript reinschreibt und das Skript im MPC öffnet. Ich weiß allerdings nicht, ob Windows ein Skript als Standardanwendung für Videodateien akzeptiert.
 
Zurück
Oben