Suche nach der schnellsten Möglichkeit, (temporäre) MPEG-2 Videos zu erzeugen

  • Hi zusammen,

    wie der Titel bereits andeutet, bin ich auf der Suche nach der schnellsten Möglichkeit, MPEG-2 Videos aus einem AVI-Synth-Script zu erzeugen. Die Qualität ist dabei NICHT von Bedeutung.

    Der Hintergrund ist der folgende. Schon seit längerem bin ich auf der Suche nach einer passenden Möglichkeit, Aufnahmen von HD-Sendern Framegenau und mit demselben Komfort zu schneiden, wie ich es von normalen SD-Aufnahmen über ProjectX und Cuttermaran gewöhnt war. Nach langem hin und her probieren von diversen Tools (darunter auch der neue Smart Cutter von TMPGEnc), die jedoch fast immer zu Artefakten an der Schnittstelle geneigt haben, scheint es ohne Reencode nicht möglich zu sein, einen sauberen Stream als Ergebnis zu bekommen.

    Ich hatte dann die Idee, aus der HD-Aufnahme so schnell wie Möglich ein MPEG-2 Video zu erzeugen, welches dann in den Cuttermaran geladen werden kann. Anschließend kann ich das Video im Cuttermara schneiden (so wird mir gleichzeitig die Audio-Spur geschnitten) und aus dem gespeicherten Projektdatei können dann die Cut-Points extrahiert werden, dich dann zu einer Cutlist für AVISynth nutzen kann. Und das resultierende Script ginge dann direkt an x264 in ein CRF-Encode. Mit dem Ergebnis könnte man dann je nach Bedarf weiter verfahren (z.B. MKVs draus machen).

    In AVISynth lade ich die Ausgangsaufnahme mit DGAVCIndex, was auch sehr gut funktioniert. Zum erstellen der MPEG2 Datei habe ich bereits den HCEnc ausprobiert, allerdings komme ich nicht wirklich weit über ~25fps hinaus, was also doch recht lange dauert.

    Beim Testen von ffmpeg als Encoder hat sich dann ergeben, dass ich fast ~60fps erhalte, was schon deutlich besser ist. Jedoch habe ich die *.ts-Datei direkt in ffmpeg geladen, was dazu geführt hat, dass die Anzahl der Frames zwischen dem AVISynth-Script und der ffmpeg erzeugten MPEG-2 File voneinander abwichen, was natürlich nicht gut ist, da die MPEG-2 Datei die Basis für die Schnittpunkte bilden soll.

    Als Lösung dachte ich mir, ich füttere einfach das AVISynth-Script direkt an ffmpeg. Und genau hier fangen die Probleme an. Ich habe es partout nicht geschafft, das AVISynth-Script an ffmpeg zu verfüttern. Und auch mit dem mencoder habe ich da noch keine großen Erfolge erzielt.

    Daher meine Frage (die ich zuerst einmal etwas allgemein halten wollte): was ist die schnellste Möglichkeit die ihr kennt, um aus einem AVISynth-Script welches DGAVCIndex nutzt eine MPEG-2 Videofile zu erstellen?

    Und im speziellen: Wie kann ich ein AVISynth-Script welches DGSource als Quellfilter verwendet an ffmpeg weiterreichen?
    Und als Alternative: Wie würde es aussehen (bzw. wie könnten die Settings von mencoder lauten) um aus dem AVISynth-Script (schnell) ein MPEG-2 Videofile zu erstellen?

    Aber vielleicht gibt es für die Ursache meines Problems auch schon eine viel elegantere Lösung ;-). Über eure Antworten würde ich mich freuen!

    MFG

  • :grübeln: Ich glaube, ich hab da zunächst was völlig missverstanden, nochmal genau durchlesen...
    _

    Du willst also das MPEG2-Video nur erzeugen, um darauf basierend die Schnittpunkte zu finden, aber die endgültige Konvertierung wird dann vom Original mit dem AviSynth-Skript durchgeführt?

    Nun gut. Es mag ffmpeg-Builds geben, die auch AviSynth-Skripte verarbeiten können. Nicht jede Variante wird das können, dazu muss sie VfW oder die AviSynth-Schnittstelle direkt unterstützen. Wenn überhaupt, könnte die Variante, die in MeGUI verwendet wird, geeignet sein.

    Aber ich glaube, auch den HC-Encoder kann man so konfigurieren, dass er ziemlich schnell arbeitet.

    Dennoch glaube ich nicht, dass das ein optimaler Workflow ist. AviSynth-Skripte schneiden und die Schnittliste als Trim-Befehle übernehmen sollte auch in VirtualDubMod möglich sein. AviSynth kann auch Tonspuren laden und mitschneiden, und das Ergebnis lässt sich auch in Audio-Encoder leiten (dabei hilft auch die MeGUI). Bei AVC-Video (x264) eignet sich AAC-Audio (QAAC) als Ziel, und beides passt in MKV wie MP4 als Kontainer.

  • Bei ffmpeg auch darauf achten, daß man nicht versucht mit 64 bit-ffmpeg ein 32 bit AviSynth-Skript direkt zu öffnen.

    Mit meinem etwas älteren QuadCore erreiche ich mit HC Geschwindigkeiten im dreistelligen fps-Bereich bei HD-Auflösung. Schau dort doch noch mal nach, ob Du auch schnelle Einstellungen (profile "fast", 1 pass, SMP). Evtl. bietet sich auch ein schnelles Downsizing in AviSynth an, um Encodierzeit zu sparen.

    Dennoch glaube ich nicht, dass das ein optimaler Workflow ist. AviSynth-Skripte schneiden und die Schnittliste als Trim-Befehle übernehmen sollte auch in VirtualDubMod möglich sein. AviSynth kann auch Tonspuren laden und mitschneiden, und das Ergebnis lässt sich auch in Audio-Encoder leiten (dabei hilft auch die MeGUI).

    Die Frage ist halt, ob hier verlustbehaftetes Scheiden beim Ton erwünscht ist? Wenn ja, ist VirtualDub wirklich eine gute Idee. Mit den aktuellen Versionen kann man ja inzwischen sogar direkt zu x264cli, qaac etc. pipen.

  • Vielen Dank für eure beiden schnellen Antworten! :)

    Ja, der Workflow ist nicht optimal, das ist wohl wahr, aber irgendwie ist er im Moment die praktikabelste Möglichkeit die ich sehe, denn die Audiospur würde ich am liebsten nicht neu encoden müssen, sondern wie "früher" bei SD auch einfach nur entsprechend den Schnittpunkten schneiden. Ebenfalls sollte der Schnitt auch komfortabel durchführbar sein, auch da habe ich mit den Schnittfunktionen in MeGUI herumprobiert, aber das klappt alles nicht so schön schnell und komfortabel wie im Cuttermaran (insbesondere das Suchen der Schnittpunkte ist wirklich langsamer, wenn man in MeGUI direkt das AVISynth-Script lädt, so kommt es mir zumindest vor). Daher dieser umständliche Weg über ein temporäres MPEG2 Video... aber am Ende hoffe ich, dass das ganze dann per Script automatisiert ablaufen kann und nur noch im Cuttermaran die Schnittpunkte gefunden werden müssen.

    Bei ffmpeg habe ich bereits herumprobiert, es mittels avs2yuv zu encoden. Bedauerlicherweise fängt ffmpeg dann garnicht an zu encoden, sondern zeigt in jedem Encodingschritt an, bei Frame 0 zu sein und mit 0 fps zu encodieren und das bei q=0... also irgendetwas stimmt da noch nicht. Ich habe es auch nur mit einer älteren ffmpeg-Version überhaupt soweit kommen lassen können, die neueren Versionen brachen bei mir leider auch mittels avs2yuv direkt ab, das werde ich aber noch einmal näher untersuchen... vielleicht habe ich da unbedacht die 64bit Variante verwendet und schaue mir die commandline noch mal genauer an und poste sie mal.

    Aber vielleicht wäre das ja gar nicht mehr nötig... denn mit dem HCenc auf "fast" habe ich bereits ca. 46-50 fps erreicht, danke für den Tipp, das war mir vorher irgendwie entgangen (oder ich habe mich an die falschen fps erinnert oder im 2-Pass-Mode gearbeitet ;) ). Aber eine Frage bleibt mir da noch:

    Zitat von sneaker2

    Mit meinem etwas älteren QuadCore erreiche ich mit HC Geschwindigkeiten im dreistelligen fps-Bereich bei HD-Auflösung. Schau dort doch noch mal nach, ob Du auch schnelle Einstellungen (profile "fast", 1 pass, SMP). Evtl. bietet sich auch ein schnelles Downsizing in AviSynth an, um Encodierzeit zu sparen.

    Hier würde mich interessieren, wie du fps im dreistelligen Bereich erzielt hast. Hier habe ich als Quelle eine Full-HD Aufnahmen mit h.264 Videostream und alles was im AVISynth-Script steht ist ein DGSource und ein BilinearResize auf 720x576 Pixel. Aber ich habe es auf einem i7 860 (@2.8 GHz) nur auf knapp 46-50 fps geschafft. Ausgewählt habe ich im HCEnc das Profil "fast" und habe dann mit einem Const-Quantizer encodiert. Welche Einstellungen wären noch erforderlich/nützlich um die Geschwindigkeit weiter zu steigern? Und was meinst du genau mit schnellem Downsizing in AVISynth? Gibt es da noch eine schnellere Methode als ein BilinearResize? :)

    Danke schon mal!
    MFG

  • PointResize().

    Aber das willst du nicht. :seher:

    Nein, viel schneller dürfte es wohl nicht gehen mit HCEnc. Unter 9 sollte man auch die DC Precision nur in Ausnahmefällen stellen (bei der knappen SVCD-Bitrate war das der letzte Kompromiss). Von mehreren Rechenkernen dürfte der HCEnc mangels Parallelisierung auch nicht sehr profitieren. Vielleicht macht x262 (kein Vertipper) das irgendwann mal...

    Und AviSynth MT zur Beschleunigung nur eines Resize? Da bezweifle ich spürbare Verbesserungen.

    Das Multithreading in x264 ist sehr gut, der kann MPEG2-Encoder locker überholen. Dafür kann man das AVC-Ergebnis praktisch nicht schneiden...

  • Hier würde mich interessieren, wie du fps im dreistelligen Bereich erzielt hast. Hier habe ich als Quelle eine Full-HD Aufnahmen mit h.264 Videostream und alles was im AVISynth-Script steht ist ein DGSource und ein BilinearResize auf 720x576 Pixel. Aber ich habe es auf einem i7 860 (@2.8 GHz) nur auf knapp 46-50 fps geschafft. Ausgewählt habe ich im HCEnc das Profil "fast" und habe dann mit einem Const-Quantizer encodiert. Welche Einstellungen wären noch erforderlich/nützlich um die Geschwindigkeit weiter zu steigern? Und was meinst du genau mit schnellem Downsizing in AVISynth? Gibt es da noch eine schnellere Methode als ein BilinearResize? :)

    Kann es sein, daß Du wegen Deiner langsamen Grafikkarte einen Flaschenhals bei der Dekodierung hast? Wie schnell ist denn ein einfacher AviSynth-Benchmark ohne Enkodierung?

  • Danke für eure Tipps! :)
    Der x262 wäre vielleicht wirklich vielversprechend... wäre cool, wenn er verfügbar wäre.

    Beim MKVCutter wäre das Problem aber, dass er nicht framegenau arbeitet wenn ich es richtig gesehen habe...

    Hmm... was den Flaschenhals betrifft, im Einsatz ist eine GTX 275, ich hoffe, dass sie nicht der Flaschenhals ist ;-). Aber dennnoch würde mich einmal interessieren, wie man einen Benchmark in AVISynth ohne Encoding durchführen würde. Einfach per VirtualDub in MJPEG encoden? Wobei dann vielleicht die HDD limitiert.

    Aber vielleicht sind die 50fps ja auch das Limit auf der Hardware hier. Was bedauerlich wäre, wenn man bedenkt, dass x264 auf schnellsten Einstellungen ein gutes Stück schneller wäre...

  • Für einen ordentlichen Benchmark wäre es wichtig, das von AviSynth gelieferte Video zu ignorieren, damit keine nachfolgende Verarbeitung noch weitere Rechenzeit beansprucht. Dafür könnte man z.B. das Kommandozeilenprogramm AVS2AVI verwenden (für AviSynth 32-bit von Moitah / für AviSynth 64-bit - nicht zu empfehlen!*):

    Code
    avs2avi.exe script.avs -c null -o n

    Es gab noch ein anderes typisches Benchmarkprogramm, aber das finde ich gerade nicht...

    Zu x262: Verfügbar ist er als Kommandozeilen-Encoder, allerdings noch längst nicht empfehlenswert. Nicht umsonst steht da die Warnung: Caution, this experimental version!
    _

    *Die Verwendung von AviSynth 64-bit ist derzeit generell nicht empfehlenswert: Seine Entwicklung ist noch nicht bis zu einer stabilen Version gekommen, und es fehlen jede Menge darauf umgeschriebene Plugins.

  • Zitat

    Es gab noch ein anderes typisches Benchmarkprogramm, aber das finde ich gerade nicht...


    AVSMeter -> http://forum.doom9.org/showthread.php?t=165528 ?

    Zitat

    im Einsatz ist eine GTX 275, ich hoffe, dass sie nicht der Flaschenhals ist ;-).


    Vermutlich schon. :)
    Beim Dekodieren von FullHD Material mittels DGSource kommt man i.d.R. ne nach VP Chip so auf:
    VP2 => ~45 fps
    VP3 => keine Ahnung
    VP4 -> ~60 fps
    VP5 -> ~135 fps
    (FFmpegSource2 ist i.d.R. flotter geht aber über die CPU und nicht über den VP-Chip der Grafikkarte)

    Da Deine GTX 275 eine VP2 Karte ist, ist bei durchschnittlich 45fps Ende. :D -> FFmpegsource2, oder ein anderer SourceFilter könnte durchaus einiges an Speed bringen. ;)

    Cu Selur

  • Gibt auch noch AVSTimer -> http://www.avstimer.de.tf/ (aber die de.tf Domains sind bei mir immer unerträglich lahm)

    Cu Selur

    Ps.: nur mal so am Rande: Wenn man mit Avisynth nix macht, außer die Quelle öffnen (+ resizen) und ffmpeg als Encoder verwendet würde es sich auch anbieten die Quelle direkt mit ffmpeg zu öffnen. ;)

  • Da Deine GTX 275 eine VP2 Karte ist, ist bei durchschnittlich 45fps Ende. :D -> FFmpegsource2, oder ein anderer SourceFilter könnte durchaus einiges an Speed bringen. ;)

    Hier mal eine GeForce 9600 GT mittels DGDecNV 2045:

    Code
    AVSMeter 1.4.8 by Groucho2004AviSynth 2.60, build:Mar  9 2013 [13:28:27]Active MT Mode: 0Number of frames:                   1253Length (hh:mm:ss.ms):       00:00:52.208Frame width:                        1920Frame height:                       1080Framerate:                        24.000 (24000/1000)Colorspace:                         YV12Frames processed:                1253 (0 - 1252)FPS (min | max | average):       29.79 | 55.80 | 42.81CPU usage (average):             5%Thread count:                    2Physical Memory usage (peak):    190 MBVirtual Memory usage (peak):     307 MBTime (elapsed):                  00:00:29.268

    gegen einen AMD Phenom-II X4 mittels FFMS2 2.18:

    Deine 275 GTX hat keinen schnelleren Videodecoderchip, aber ein Core i7 dürfte den Phenom sicher schlagen.

  • Hi zusammen,

    vielen Dank für eure zahlreichen und hilfreichen Antworten, da lag die Lösung des Problems des langsamen Encodes ja an einer Stelle, die ich nie vermutet hätte... D.h. dann wohl entweder eine neue Graka oder doch FFMS2. Komme ebenfalls auch auf die ca. 45 fps im Benchmark mit AVSMeter (was auch zu erwarten war nach den neusten Infos ;) ).

    Habe ohne Resizing mit FFMS2 dann auch tatsächlich über 100 fps erreicht, mit PointResize ca. 79 fps (der auch noch reichen würde - man kann ja die Szenen zum Schneiden im Cuttermaran noch erkennen ;) ):

    Im Anschluss mit BilinearResize dann nur noch ca. 63 fps, also nicht mehr so viel schneller.

    Allerdings habe ich, wenn ich FFMS2 verwende noch ein Problem: Direkt mit den *.ts-Dateien der Aufnahme scheint der Indexer nicht gut zurecht zu kommen, sodass ich die Aufnahme mit MKVMerge einfach in eine MKV-Datei gepackt habe. Aber leider tut sich FFMS2 auch damit noch schwer, er hängt manchmal längere Zeit und ein seek geht gar nicht gut. Er erkennt auch selbst die Framerate nicht, sondern die musste ich mit AssumeFPS(25) noch hinzufügen. Hat FFMS2 da noch Schwierigkeiten, insbesondere mit DVB-S2 Aufnahmen?

    Aber es ist auf alle Fälle gut zu wissen, woran es liegt, dass er nicht schneller encodiert hat :).

    Danke und MFG!

  • Hat FFMS2 da noch Schwierigkeiten, insbesondere mit DVB-S2 Aufnahmen?

    Leider ja, weshalb wir für solche Fälle eigentlich immer DGSource empfehlen. Man kann noch versuchen, ffms2 etwas zu tunen (threads=1 und seekmode=-1), aber auch das kann immer noch zu Problemen führen.

  • Das FFMS2 Source mit mkv files Probleme hat ist mir bis dato noch nicht untergekommen.

    Tja, das ist die Frage. Ich weiß es nicht so genau. Interlaced ist für ffms2 auch so ein Problemfall.
    Mir fällt aber gerade auch auf, daß "threads=1" bei einem Flaschenhals bei der Dekodierung eh keine so pralle Empfehlung ist.

Jetzt mitmachen!

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