Mehrere AVI Dateien mit neuen Tonspuren per AviSynth Script in einem Rutsch verbinden

  • Hab hier mehrere einzelne zugeschnittene AVI Dateien,
    die ich gerne alle in einem Rutsch per AviSynth Script decodieren möchte.
    Dazu soll noch die alte Tonspur der jeweiligen AVI Dateien ignoriert werden
    und die neuen veränderten WAV Dateien mit gleicher länge direkt mit eingebunden werden!

    Wie müsste ich mein Script nun ab ändern,
    damit ich mehrere AVI Files auf einmal ( Hintereinnander ) mit einem einzelnen AviSynth Script decodieren kann?

    Leider funktioniert dieses Script nicht :(

  • Du hast offenbar nicht den Sinn der impliziten Variable "last" verstanden (die überall dort angenommen wird, wo sie weggelassen wurde, aber eigentlich irgend eine Variable stehen müsste, z.B. um das Ergebnis einer Filter-Funktion aufzunehmen). Ich erweitere mal dein Skript so, wie AviSynth es eigentlich verarbeitet; blau ist alles, was AviSynth annimmt:

    Code
    LoadPlugin("C:\AviSynth\NicAudio 2.0.6\NicAudio.dll")  v = AVISource("C:\Test1.avi",audio=false,pixel_type="RGB24") a = RaWavSource("C:\Test1new.wav") [COLOR='#0000FF']last =[/COLOR] AudioDub(v, a) [COLOR='#696969'][I]# merkt sich das Ergebnis dieser AudioDub()-Funktion[/I][/COLOR] v = AVISource("C:\Test2.avi",audio=false,pixel_type="RGB24") a = RaWavSource("C:\Test2new.wav") [COLOR='#0000FF']last =[/COLOR] AudioDub(v, a) [COLOR='#696969'][I]# vergisst den vorherigen Inhalt und merkt sich nun das Ergebnis dieser AudioDub()-Funktion[/I][/COLOR] v = AVISource("C:\Test3.avi",audio=false,pixel_type="RGB24") a = RaWavSource("C:\Test3new.wav") [COLOR='#0000FF']last =[/COLOR] AudioDub(v, a) [COLOR='#696969'][I]# vergisst den vorherigen Inhalt und merkt sich nun das Ergebnis dieser AudioDub()-Funktion[/I][/COLOR][COLOR='#0000FF']return last[/COLOR] [COLOR='#696969'][I]# gibt nur dieses letzte Teilergebnis aus[/I][/COLOR]

    Eigentlich merkt AviSynth sogar durch vorherige Optimierung, dass die ersten beiden Teile nie in der Ausgabe landen. Tatsächlich bearbeitet wird also nur:

    Code
    LoadPlugin("C:\AviSynth\NicAudio 2.0.6\NicAudio.dll") [COLOR='#696969'][I]# ----------[/I][/COLOR]v = AVISource("C:\Test3.avi",audio=false,pixel_type="RGB24") a = RaWavSource("C:\Test3new.wav") AudioDub(v, a)

    Was du vergessen hast, ist, das Zwischenergebnis jedes Teil-Clips in einer Variablen zwischenzuspeichern, und am Ende alle Zwischenergebnisse zu einem kompletten Film zusammenzufügen.

    Hinweis: AlignedSplice() bzw. ++ sorgt dafür, dass (evtl. durch Abschneiden oder Einfügen von Stille) die Synchronität der Teil-Clips beim Zusammenfügen erhalten bleibt, wenn z.B. die Länge der Tonspur nicht der Länge der Videospur entspricht. UnalignedSplice() fügt – voneinander unabhängig – das Video einerseits und das Audio andererseits zusammen und beachtet keine Synchronität; es gibt Fälle, in denen das so korrekt ist, z.B. wenn die Teil-Clips mal ein zusammenhängendes Video waren, das auf bestimmte Art geteilt wurde.


  • Was du vergessen hast, ist, das Zwischenergebnis jedes Teil-Clips in einer Variablen zwischenzuspeichern, und am Ende alle Zwischenergebnisse zu einem kompletten Film zusammenzufügen.

    Code
    LoadPlugin("C:\AviSynth\NicAudio 2.0.6\NicAudio.dll")  v = AVISource("C:\Test1.avi",audio=false,pixel_type="RGB24") a = RaWavSource("C:\Test1new.wav") [COLOR=#008000][B]c1 =[/B][/COLOR] AudioDub(v, a)  v = AVISource("C:\Test2.avi",audio=false,pixel_type="RGB24") a = RaWavSource("C:\Test2new.wav") [COLOR=#008000][B]c2 =[/B][/COLOR] AudioDub(v, a)  v = AVISource("C:\Test3.avi",audio=false,pixel_type="RGB24") a = RaWavSource("C:\Test3new.wav") [COLOR=#008000][B]c3 =[/B][/COLOR] AudioDub(v, a)[COLOR=#008000][B]c1 ++ c2 ++ c3[/B][/COLOR] [COLOR=#696969][I]# Kurzform für AlignedSplice(c1, c2, c3)[/I][/COLOR][COLOR=#0000FF]return [/COLOR]ConvertToYV12(interlaced=true)

    Vielen Dank, damit hat es funktioniert :)
    Hab das Script unter VirtualDub geladen und mir erst mal den kompletten Film angesehen.

    Als ich dieses Script nun an den x264 Encoder übergeben wollte, ist mir noch eingefallen, da fehlt doch noch etwas!!!
    Wie komme ich eigentlich an die im Hintergrund decodierte Audiospur des kompletten Filmes ran??
    Den ganzen Tag habe ich mir Gedanken darüber gemacht, bis mir folgende Lösung eingefallen ist:
    Habe das Script unter VirtualDub geladen und einfach die komplette WAV Datei abgespeichert
    und schon hatte ich eine ca. 1 GB grosse WAV Datei vorliegen,
    die ich nun an BeSweet oder einen sonstigen Audio Encoder übergeben kann..

    Gibt es eigentlich einen Audio Encoder, den man ein AviSynth Script zu futtern geben kann?
    In meinem Fall: decodierte WAV im Hintergrund direkt zu AAC oder MP3

    Dank VirtualDub, habe ich ja trotzdem die komplette Audiospur verbunden bekommen.
    Fehlt nur noch die komplette Videospur per x264 Encoder übergabe!
    Ist das eigentlich Okay, wenn man den x264 Encoder ein AviSynth Script übergibt,
    wo im Hintergrund gleichzeitig: Video- und Audiospur decodiert werden??

    Hab das Script ein wenig abgeändert um jetzt nur den kompletten Video Inhalt zubekommen:

    Code
    c1 = AVISource("C:\Test1.avi",audio=false,pixel_type="RGB24") 
    c2 = AVISource("C:\Test2.avi",audio=false,pixel_type="RGB24") 
    c3 = AVISource("C:\Test3.avi",audio=false,pixel_type="RGB24")
    
    
    c1 ++ c2 ++ c3
    
    
    return ConvertToYV12(interlaced=true)

    Damit klappt es Super :)

    8 Mal editiert, zuletzt von H264x (19. Februar 2014 um 15:51)

  • Warum einfach, wenn es auch so umständlich geht?

    Was meinst du wohl, was ein Konvertierprogramm wie MeGUI so macht? ... Es lässt die Videoausgabe eines AviSynth-Skriptes von einem Videoencoder wie x264 encodieren, und die Audioausgabe eines AviSynth-Skriptes von einem Audioencoder wie LAME oder QAAC.

    Es stört den Video-Encoder x264 überhaupt nicht, wenn das AviSynth-Skript auch eine Audio-Ausgabe hat. Die wird ignoriert. Ebenso wird der Video-Anteil nicht mit übergeben, wenn MeGUI einem Audioencoder die Tonspur aus dem AviSynth-Skript übergibt.

  • Viele Wege führen nach Rom und wenn es so klappt, wie ich es beschrieben habe, dann ist es für mich zufriedenstellend :)
    Es ist zwar Umständlich alles Manuell zu machen, aber so versteht man ( nach und nach ) die einzelnen Schritte.
    wie z.B.
    x264 Qualitäts Encoding auf Manueller Basis per Batcheingabe ( Sehr Umständlich, aber jeder Schritt kann mitverfolgt und gegebenfalls noch korregiert werden... )

    http://forum.gleitz.info/showthread.php…ll=1#post441461

    Ich mag keine Konvertierprogramme wie MeGUI etc..
    Ausser StaxRip ( Das ist die Ausnahme, weil es für mich das Beste ist )

    Als nächstes werde ich mal auf Manueller Basis den LAME oder QAAC mit einem AviSynth Script füttern.

  • Hoffentlich weißt du auch wie, direkt lesen die das Skript nicht als Audioquelle. Da müsstest du manuell pipen (z.B. die Ausgabe von avs2pipemod), wie es MeGUI automatisch intern macht.

    Es gibt Audio-Encoder, denen man per Parameter mitteilen muss, dass sie sich nicht auf die Längenengabe im WAV-Header verlassen dürfen, sondern die Samples lesen müssen, solange die Quelle noch Daten liefert.

  • Nachtrag im Script.
    Hatte vergessen folgende Zeile noch einzufügen, wenn man das Video an dem x264 Encoder übergeben möchte:

    Code
    ConvertToYV12()

    Trotzdem bekomme ich folgende Warnmeldungen vom x264 Encoder:

    Zitat


    resize[warning]: converting from bgr24 to yuv420p
    x264[warning]: interlace + weightp is not implemented
    x264[info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
    x264[info]: profile High, level 4.0

    resize[warning]: converting from bgr24 to yuv420p --> Ich verwende überhaupt kein resizen!!
    x264[warning]: interlace + weightp is not implemented
    Wird Interlaced nicht übernommen?
    Hab doch extra --TFF in der x264.exe Befehlszeile angegeben...

    Und was bedeutet: weightp ??

    profile High, level 4.0 entsteht übrigens Automatisch durch --preset veryslow
    und > profile High, level 3.0 entsteht Automatisch durch --slow
    Das ist mir schon mal aufgefallen :)
    Aber warum das so ist, weiss ich auch nicht...

    Hier mal mein x264 Batch Befehl:

    Code
    "C:\x264.exe" --preset veryslow --tune film --crf 20 --tff --output "E:\Test123.h264" "C:\Test123.avs"

    Einmal editiert, zuletzt von H264x (18. Februar 2014 um 18:45)

  • Wenn du ConvertToYV12() hinter "return" einfügst, wird es ignoriert, weil das Video da ja schon das Skript verlassen hat. Außerdem: Wenn dein Video interlaced ist, hättest du ConvertToYV12(interlaced=true) verwenden müssen, sonst gibt es Matschfarben, wo Komplementärfarben sich gegeneinander verschieben. Es hätte also z.B. so aussehen müssen:

    Code
    c1 = AVISource("C:\Test1.avi",audio=false,pixel_type="RGB24") 
    c2 = AVISource("C:\Test2.avi",audio=false,pixel_type="RGB24") 
    c3 = AVISource("C:\Test3.avi",audio=false,pixel_type="RGB24")
    
    
    c1 ++ c2 ++ c3 [COLOR='#696969'][I]# wenn eh kein Ton dabei ist, ist auch egal ob + oder ++[/I][/COLOR]
    
    
    ConvertToYV12(interlaced=true) [COLOR='#696969'][I]# [B]return[/B] wird auch implizit ausgeführt; manchmal ist es aber nötig, es an die richtige Stelle zu schreiben[/I][/COLOR]

    Dann ist auch der Parameter --tff wichtig, damit x264 auch Interlaced-YV12 verarbeitet.

    Auch wenn kein Resize-Befehl in x264 ausgeführt wird, bei der Vorbereitung darauf wird bemerkt, dass RGB- und nicht YV12-Video ankam. Sei froh, dass x264 hier doch noch mal selber konvertiert, ohne eingebundene libav-Videofilter hätte es hier abgebrochen, weil's kein YV12 bekommt.

    "interlace + weightp is not implemented": Wenn Interlaced-Encodierung aktiv ist, dann unterstützt x264 keine gewichteten Abhängigkeiten in P-Frames. Das wird halt deaktiviert und weitergearbeitet. Deshalb ist es bloß eine "Warnung".

    Welches Profile@Level angenommen wird, hängt von mehreren Faktoren ab, wie geschätzte Bitrate, Bildfläche, Framerate, Komplexität der Encodierung (langsamere Presets sind komplexer, können also evtl. höhere Level zur Folge haben). Wenn man zu einem bestimmten Abspielgerät kompatibel bleiben muss, muss man u.U. bestimmte Optionen aus Presets noch einzeln limitieren und auch den VBV festlegen.

  • Wenn du ConvertToYV12() hinter "return" einfügst, wird es ignoriert, weil das Video da ja schon das Skript verlassen hat. Außerdem: Wenn dein Video interlaced ist,

    Super, danke dir, jetzt bekomme ich folgende Meldung:

    Code
    [B]avs [info]: 720x576i 0:0 @ 25/1 fps (cfr) [/B]x264[warning]:  interlace + weightp is not implementedx264[info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2x264[info]: profile High, level 4.0Jetzt sollte es Stimmen :-)



    hättest du ConvertToYV12(interlaced=true) verwenden müssen, sonst gibt es Matschfarben, wo Komplementärfarben sich gegeneinander verschieben. Es hätte also z.B. so aussehen müssen:.

    Das vergesse ich jedes mal!
    Jetzt hängt ein Denkzettel mehr am Monitor ;)

    Dann ist auch der Parameter --tff wichtig, damit x264 auch Interlaced-YV12 verarbeitet.

    Genau, an den habe ich noch gedacht:

    Code
    "C:\x264.exe" --preset veryslow --tune film --crf 20 [COLOR=#0000ff]--tff[/COLOR] --output "E:\Test123.h264" "C:\Test123.avs"



    Welches Profile@Level angenommen wird, hängt von mehreren Faktoren ab, wie geschätzte Bitrate, Bildfläche, Framerate, Komplexität der Encodierung (langsamere Presets sind komplexer, können also evtl. höhere Level zur Folge haben). Wenn man zu einem bestimmten Abspielgerät kompatibel bleiben muss, muss man u.U. bestimmte Optionen aus Presets noch einzeln limitieren und auch den VBV festlegen.

    Was mich wundert ist, warum manche so eine ewig lange Commando Befehlskette benutzen um eventuell aller beste Qualität zu erzielen:
    ( Das war im Jahr: 2011 )
    z.B. http://forum.videohelp.com/threads/341663…l=1#post2127384

    Mittlerweile haben wir das Jahr: 2014 und der x264 ist ja auch stehst weiter entwickelt worden.
    Diese Zeile sollte doch völlig ausreichen um das meiste abzudecken: ( ausser Spezielle Feinheiten )

    Code
    "C:\x264.exe" --preset veryslow --tune film --crf 20 [COLOR=#0000ff]--tff[/COLOR] --output "E:\Test123.h264" "C:\Test123.avs"


    oder nicht??

    Hier ist doch alles drin!
    Siehe MediaInfo von dem fertig Encodierten Film mit x264: ( Test123.h264 > hier im Beitrag schon genannt )
    http://img.xrmb2.net/images/104278.png

    Laut MediaInfo:
    z,B. --Film macht Automatisch deblock:1:-1:-1 usw..
    oder --preset veryslow ist für weitere Befehle verantwortlich usw..
    so das man doch keine lange Commando Befehlskette aus alten Tagen mehr braucht?
    Oder verstehe ich das falsch...



    Wenn man zu einem bestimmten Abspielgerät kompatibel bleiben muss, muss man u.U. bestimmte Optionen aus Presets noch einzeln limitieren und auch den VBV festlegen.

    Gut, das brauche ich nicht.


    2 Mal editiert, zuletzt von H264x (19. Februar 2014 um 16:42)

  • Es ist wohl richtig, dass ewig lange Optionslisten heute nicht mehr empfehlenswert sind. Schließlich haben die x264-Entwickler ja auch wirklich viel Zeit investiert, um die Kombination aus Presets und Tunings sinnvoll zu gestalten. Das wird allerdings nichts daran ändern, dass in den Metadaten des Videostreams (welche MediaInfo ausliest) von x264 die daraus resultierenden einzelnen Optionen vermerkt werden, nicht preset/tune usw.

    Davon abgesehen:

    Ich persönlich halte das Preset "veryslow" sogar noch für übertrieben komplex. Ob du das so langsam "brauchst", wirst nur du wissen.


  • Davon abgesehen:

    Ich persönlich halte das Preset "veryslow" sogar noch für übertrieben komplex. Ob du das so langsam "brauchst", wirst nur du wissen.

    Dazu habe ich folgende Einstellung getroffen:

    Videos mit einer Spielfilmlänge von 1 - 20 Min: --preset veryslow
    Videos mit einer Spielfilmlänge von 20 - 40 Min: --preset slower
    Videos mit einer Spielfilmlänge von 40 - 120 Min: --preset slow ( Reicht im Grunde genommen völlig aus )

    Bei kurzen Clips ist mir das egal, da mein i5 genug Rechenpower hat :)

Jetzt mitmachen!

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