Warum dieser Guide?
Ich finde, in dem Forum hier wird oft & viel auf [lexicon]MeGUI[/lexicon] und damit ja auch auf Avisynth hingewiesen, aber an wirklicher Hilfe für Anfänger mangelt es oft. Da ein Fetzen, da ein Bisschen. Der Thread soll allen helfen, die nicht wirklich Ahnung haben und ein zentraler Sammelpunkt für einen Einstieg in Avisynth, Rahmen platzieren, Facecams einfügen, Banner einblenden bis hin zur Audiobearbeitung (Rauschentfernung, Equalizer, Kompressor) ohne andere Programme werden.
Was macht Avisynth?
Avisynth ist ein Frameserver. Das bedeutet erstmal, dass eine Frame rein geht und weiter gegeben wird. Oder halt mehr als eine Frame, je nach dem, wieviele reingepumpt werden. Avisynth kann mit Video und Audio umgehen und wir haben die Möglichkeit, beides verändert weiter zu geben. Wie bei allen Programmen (Premiere, Vegas, etc), welche für die Videobearbeitung vorgesehen sind.
Das Prinzip ist immer das Gleiche: Rohmaterial => Veränderung => Ausgabe.
Warum sollte ich Avisynth nutzen?
Gegenfrage: Warum nicht? Es ist das mächtigste Tool, das es kostenlos gibt wenn es um Videobearbeitung geht. Mit kostenpflichtigen Programmen möchte ich es nicht vergleichen, denn das ist schwer möglich.
Natürlich kann ich gutes Geld für (nutzlose) Programme ausgeben, die mir eine Timeline geben und es ein bisschen bequemer machen. Aber meine Philosophie ist, dass es nicht nötig ist, wenn ich auch alles so erreichen kann. Zumal AviSynth in einigen Bereichen mehr bietet ohne auf andere Programme angewiesen zu sein (erweiterte Audiobearbeitung).
Was kann ich machen, wenn ich die Wall of Text hier besiegt habe?
Im ersten Post:
• Ändern der Größe von Videos
• Videos und/oder Bilder überlagern (Facecam/Rahmen/etc)
• Cutten von Videos (Mehrere Folgen aus einer Aufnahme, eine Folge aus mehreren Aufnahmen)
• Erweiterte Videobearbeitung
Im zweitem Post:
• 2 Audio-Spuren muxen & abmischen
• Erweiterte Audiobearbeitung
• Ergänzungen
Bevor es losgeht!
• Code kopieren bringt nichts
• Gebt euch ein paar Tage Zeit für das Ganze
• Am Ende wird es einen Anhang geben, bitte dort unbedingt vorbeischauen, dort wird es eventuell Ergänzungen geben
• AvsPmod kann ganz praktisch sein, wenn man experimentiert
• Bei Fragen schreibt bitte in den Thread
• Wer Englisch kann sollte auf den IRC-Channel ausweichen, da sind echte Profis
• Fehler bitte hier posten und mir eine PN schreiben
Für Umsteiger
Egal, was du bis jetzt benutzt hast, ob Premiere, Camtasia, AviSynth wird anders sein. Wenn du die Software gekauft hast (und so dumm warst, 300€ für Schrott auszugeben) suchst du am besten nach einem Tutorial um den Frameserver zu nutzen (was bei Schrott ja leider nicht geht). Wenn du die Software gecrackt hast, dann geh dich kurz schämen und lies dann weiter. Es gibt keinen Grund für Cracks, wenn man AviSynth kennt.
Das erste Script
Halt. Nicht so schnell. Hier einfach Code hin zu klatschen bringt rein gar nichts und würde wohl für mehr Verwirrung sorgen.
Erstmal wieder zurück zur Einführung: Es gibt immer eine Ausgabe. Das heißt, ein Avisynth-Script muss immer etwas zurück geben. Am Anfang ist der Befehl "return" noch nicht wichtig, wenn wir nur Video laden und bearbeiten wird automatisch erkannt, dass dies der return-Wert sein muss.
Avisynth ist eine Scriptsprache. Die Maus kannst du erstmal abstöpseln, die brauchen wir nicht mehr zwingend.
Die Dateien werden mit der Endung .avs gespeichert. Achtet darauf, wenn ihr einen Editor nutzt, die speichern gerne mal als txt, vor allem das Windows Notepad. Ich persönlich nutze Sublime Text 2, aber ich nutze ihn auch nicht nur für AviSynth. Notepad (Win+R und notepad eingeben) reicht allemal.
Also, wir laden erstmal die Rohdatei in das Script:
Das speichern wir ab (auf die Endung achten, .avs) und öffnen es in MeGui (das ... hinter der grauen Zeile "AviSynth Script"). Das sollte problemlos übernommen werden, falls das nicht der Fall ist, habt ihr was falsch gemacht (Aufnahme existiert nicht, Syntaxfehler, MeGui zeigt den Fehler aber an). Man könnte die Datei auch im Windows Media Player öffnen und den Fehler dort sehen, bzw. das Ergebnis, wenn alles stimmt.
Nächste Schritte
Jetzt wird es ein bisschen zügiger voran gehen. Ich werde die einzelnen Funktionen und noch ein bisschen Syntax erläutern, aber es nicht mehr so detailreich ausschmücken.
Unser nächstes Script soll das Video auf "Original" skalieren, um bei Youtube die beste Qualität zu ermöglichen.
Kommentare im Code beginnen mit #. Alles was dahinter und in der gleichen Zeile steht wird beim auslesen ignoriert.
Wir laden also erstmal das Video:
Es gibt verschiedene Resize-Filter, alle findet man unter http://avisynth.org/mediawiki/Resize
Ich persönlich verwende Spline64Resize, aber ihr könnt den Befehl einfach ersetzen (zum Beispiel mit "BicubicResize", ist aber nicht zu empfehlen). Experimientert einfach mal ein bisschen rum mit den Filtern, dann lernt ihr am besten. Aber zurück zum Thema.
In die nächste Zeile schreiben wir also den Befehl für die Skalierung. Der Filter kann hoch und runter skalieren.
Der Befehl streckt das Bild auf 2048 Pixel Breite und 1152 Pixel Höhe und entspricht dem 16:9-Format. Für 4:3-Spiele beträgt die Breite 1536 Pixel.
Die fertige Datei enthält dann also 2 Zeilen:
Natürlich könnte man auch auf 720p skalieren, die Zahlen wären dann halt (1280,720).
Jetzt ist es kurz interessant, das ganze aus der Sicht von Avisynth zu sehen:
Zeile 1: Oh, da ist ein Video
Zeile 2: Oh, ein Filter. Ich habe aber nur das Video um ihn anzuwenden. Na, dann mach ich das halt.
Man könnte den Code auch anders schreiben:
Das schaut für Avisynth schon ein bisschen anders aus:
Zeile 1: Oh, da ist ein Video und danach ein Filter, den ich auf das Video anwenden soll.
Der Unterschied ist momentan nicht wichtig und am Anfang werden wir zur besseren Übersichtlichkeit zeilenweise arbeiten. Auf dauer sollte man sich aber angewöhnen per "."" die Filter direkt hinter der Source anzuwenden.
[lexicon]AviSynth[/lexicon] erkennt auch immer noch automatisch den return-Wert, das bearbeitete Video in diesem Fall. Das wird auch noch länger der Fall sein, wir können uns also erstmal darauf verlassen.
Videos und/oder Bilder überlagern
Wir haben eine Facecam, einen Rahmen für einen 4:3-Spiel oder - war letztens sehr interessant für mich - eine Aufnahme eines Nintendo DS Emulators, die in einen Rahmen gesetzt werden muss, welcher aber einen Balken zwischen den Schirmen hat.
Kleiner Disclaimer: Habe nie mit Facecams gespielt, habe gehört, dass die Synchronisierung schwer ist. Ich kann den Aufwand mit AviSynth nicht einschätzen, ein Userbericht dazu wäre recht praktisch.
Wir werden jetzt kleine Zuweisungen kennen lernen. Sie können mit Variablen aus Programmiersprachen verglichen werden, allerdings können wir nur bestimmte Dinge zuweisen, wie etwa AviSource().
Damit alleine passiert nicht viel, aber ich erkläre es kurz:
"Spiel = " weißt der Variable Spiel etwas zu. In dem Fall "AviSource("D:\Aufnahme.avi")". Ich nehme das gleiche Video nochmal bei Fratze, weil ich kein anderes zur Hand habe, aber theoretisch ist das die Aufnahme mit der Webcam. Zur Synchronisierung gibt es später mehr, erstmal ist es wichtig, das ganze zu platzieren.
Wenn wir das Script jetzt so in MeGui laden kommt ein Fehler, probiere es am besten selber kurz aus.
Dort steht dann "Reason: The script's return was not a video clip".
Wie vorher angesprochen brauchen wir also einen return-Wert.
Den definieren wir so:
Wir haben aber noch gar keine "Variable" die FertigesVideo heißt.
Wir könnten auch einfach Spiel, Fratze oder Hintergrund zurück geben, aber das ist ja nicht das Ziel. Wir lernen jetzt also Overlay() kennen.
Hier der Wiki-Artikel dazu:
http://avisynth.org/mediawiki/Overlay
Diese Funktion erlaubt es jeweils 2 Objekte übereinander zu legen.
Beispiel:
Das zweite Element wird über das erste gelegt. Aber natürlich kann man damit auch das obere Element ändern, bevor man ausgeben lässt. Legen wir jetzt also Fratze auf das Ergebnis OhneFratze:
Keine Angst, das schaut komplizierter aus, als es ist:
Wir legen Fratze über OhneFratze, aber da hinter Fratze ein Punkt ist, wird der Filter dahinter ausgeführt, bevor das Ergebnis zurück gegeben wird, in dem Fall die Skalierung.
y und x sind die Abstände zum Rand, der Punkt (0|0) liegt links oben und die zu platzierenden Objekte werden links oben ausgerichtet. Zum Beispiel kann man damit auch ganz einfach einen Rahmen um eine Facecam legen. Man kann immer nur 2 Objekte überlagern, weswegen wir 2 mal ein Overlay brauchen, weil wir ja 3 Objekte haben.
Das gesamte Script sieht also so aus:
Die Zahlen denke ich mir zufällig aus, das muss nicht gut aussehen, wenn du es jetzt kopierst. In [lexicon]MeGUI[/lexicon] sollte sich immer eine Vorschau öffnen, falls nicht klickt einfach auf "Reopen Video Preview". Wenn ihr am Script etwas geändert habt müsst ihr es wieder laden und wieder schauen. Aber 1 mal platziert sollte es ja stimmen. Ansonsten macht einen Screenshot vom Spiel und der Cam, platziert es im [lexicon]Gimp[/lexicon] und messt mit dem Auswahl-Tool die Entfernung.
Aber wir können auch noch ein bisschen weiter gehen und Überblendungen transparent machen und wenn wir das Bild nur für bestimmte Frames laden können wir einen kleinen Banner einblenden:
Das gibt uns einen zu 50% transparenten Banner, der 1 Minute nach Start eines Videos, das mit 30fps encodet wird für 5 Sekunden angezeigt wird.
Wer einen bestimmten Bereich aus dem Video ausschneiden muss kann auf crop() zurückgreifen:
http://avisynth.org/mediawiki/Crop
Zu den Zahlen:
Links, Oben, Breite, Höhe
Es wird in der Entfernung 1 von links und oben ein Bild mit den Maßen 1x1 ausgeschnitten.
Wir könnten auch so schreiben:
Jetzt bedeuten die Zahlen etwas anderes:
Links, Oben, Rechts, Unten
Also wir das Video jetzt jeweils um 1 Pixel aus jeder Richtung beschnitten. Das - ist der entscheidende Unterschied, sonst sieht der Befehl gleich aus.
Videos Cutten
Ich kümmere mich erstmal um das leichtere: Mehrere Rohdateien zu einer Zieldatei zusammenfügen. Das können wir gleich in dem Aufruf von Avisource machen:
Man beachte das , zwischen den 2 Dateien. Das kann man beliebig oft machen, immer wieder ein , dazwischen.
Nun Videos verkürzen, dafür nutzen wir Trim().
Zur Syntax von Trim():
Die erste Stelle (100) gibt die Frame an, ab der das Video weiter gegeben wird. Alles davor wird weg gelassen.
Die zweite Stelle (200) gibt die letzte Frame an. Alles danach kommt am Encoder nicht an.
Eine 3. Option wäre "pad", was sich darum kümmert, das Audio und Video synchron sind. Will man das nicht, schreibt man noch ein ",false" in die Klammern (an 3. Stelle).
Mehr dazu hier: http://avisynth.org/mediawiki/Trim
Ich hab euch ja oben folgendes versprochen: "mehrere Folgen aus einer Datei".
Dazu müsst ihr jeweils die Frames finden und für jede Folge eine neue Datei anlegen. Mit dem Video Preview von [lexicon]MeGUI[/lexicon] könnt ihr die genauen Frames finden. Eine bequemere Methode ist mir gerade nicht geläufig, ich persönlich nehme die Folgen immer getrennt auf. Vielleicht hat ja ein anderer User einen Tipp.
Erweiterte Videobearbeitung
Hier werde ich euch noch ein paar nette Funktionen vorstellen, die ich persönlich benutze, sie sind aber alle kosmetischer und nicht praktischer Natur.
FadeIn/Out:
Ein sanfter Übergang vom/ins Schwarze.
http://avisynth.org/mediawiki/Fade
Bsp.:
20 ist die Anzahl der Frames, fps=30 gibt an, dass der Fade-Effekt mit 30 fps ausgegeben werden soll.
Es gibt FadeIn, FadeOut und FadeIO. Das letzte kombiniert FadeIn und FadeOut. Dann gibt es noch 0 und 2 (wie im Beispiel) dahinter. Das bezieht sich auf die [lexicon]Frame[/lexicon] bei der der Fade startet/endet. Bei 0 liegt das komplett schwarze Bild bei [lexicon]Frame[/lexicon] 0, bei 2 bei [lexicon]Frame[/lexicon] 2. Da ich nicht sicher bin, wie Youtube es genau handhabt nutze ich vorsichtshalber 2, nicht dass am Ende eine nicht ganz schwarze [lexicon]Frame[/lexicon] am Anfang oder Ende ankommt. (Youtube hatte ja mal die Eigenschaft, die letzte Sekunde abzuschneiden)
Tweak:
Farben ändern.
http://avisynth.org/mediawiki/Tweak
Tweak macht es möglich, alle möglichen oder nur eine bestimmte Farbe zu ändern. Sättigung und und Kontrast sind die Filter, die ich persönlich einsetze, aber das ist geschmackssache.
Manche meinen, man solls nicht machen, manche finden es ganz nett, ich persönlich mag es. Der Unterschied ist bei 1.2 nur im direktem Vergleich sehen.
Aber der obige Befehl ist nicht sehr performant, immerhin wird 2 mal Tweak aufgerufen. Um das zu beschleunigen können wir auch anders rangehen:
Man sollte immer so weit zusammenfassen wie möglich.
Hier gibt es eine Übersicht aller Filter:
http://avisynth.org/mediawiki/Internal_filters