Beiträge von Sagaras

    Erst letztens musste ich auf eine Timeline [lexicon]GUI[/lexicon] zurückgreifen, da es mit AVISynth zu kompliziert wurde. Und zwars waren es Real Aufnahmen mit einer Kamera die ich dann zu einem Film verwurstet habe. Für 10 Minuten Film waren darin so ungefähr 60 Schnitte die ich machen musste. Zudem hat die Kamera in MOV aufgenommen.


    Das Problem wäre einfach in AVISynth das ich zwars MOV Datein reinladen könnte, aber das Schneiden sich unheimlich schwer gemacht hätte. Ganz zu schweigen davon das alle MOV Datein indexiert werden hätten müssen.


    30 Clips hätten so geladen werden müssen in AVISynth. Ich meine, es hätte geklappt kein Zweifel. Aber das Video hab ich mit nem Freund gemacht der noch Studiert und den Film mussten die machen weil se darauf Noten bekommen. (Medieninformatik ^^)


    Aber ich hab wenigsten das ganze zusammengeschnitten über eine [lexicon]GUI[/lexicon] (Nur zusammengeschnitten) und das ganze mit dem [lexicon]Lagarith[/lexicon] exportiert und den Sound als [lexicon]WAV[/lexicon] abgespeichert.


    Die weitere Bearbeitung fand dann wieder in AVISynth statt, Agiesub und [lexicon]Audacity[/lexicon].


    Der Skript dazu sah zum Schluss so aus in AVISynth:


    Also eine [lexicon]GUI[/lexicon] nehme ich erst, wenn die Zeit drücken sollte. Hätte ich mehr Zeit gehabt, hätte ich natürlich auch alles in AVISynth geschnitten. Weil AVISynth ist nun mal Zeitaufwendig. Ist nun mal so. Aber ist ein Skript fertig oder Funktionen, kann man diese immer wieder nehmen oder als Plugin im AVISynth Plugin Ordner legen und immer wieder nutzen ^^


    Das nächste Video brauch dann dank der neuen Funktionen nicht mehr mit so viel Aufwand betrieben werden, da ja schon alles da ist was man braucht. Entstehen neue Probleme werden diese gelöst und Archiviert.


    Bedeutet das das Arbeiten in AVISynth immer leichter wird. Man muss sich halt nur etwas aufbauen. ^^


    Ich habe vor kurzem bspw. ein Videos mit sieben Videospuren und zwei Audiospuren bearbeiten müssen. Das geht in [lexicon]AviSynth[/lexicon], aber da hätte ich dafür nicht eine halbe Stunde gebraucht.


    Stimmt, da muss man sich halt etwas mehr Zeit geben für in AVISynth. Aber lösbar wäre es auf jedenfall gewesen. ^^ Das ist dann meist auch die Lust dann die dahintersteckt oder Zeitdruck. AVISynth brauch nun mal etwas Zeit, dafür kann man ziemlich exakt und genau arbeiten was die Filter betrifft.

    Das ist natürlich auch kein Problem. Dazu muss man nur wissen was man braucht um es zu realisieren.


    Als erstes brauchen wir dieses Konstrukt von Overlay:


    Overlay(?, x=0, y=0, mask=?, opacity=1.0)


    opacity ist die Transparenz die wir benötigen. 1.0 ist absolut sichtbar und 0.0 ist absolut nicht sichtbar. Bedeutet: 0.5 währe Transparent


    Dann brauchen wir ApplyRange das ein Filter braucht und ein Start Argument
    Und Animate für die Fadein und Fadeout Realisierung das wie ApplyRange auch ein Filter nutzt aber dafür ein Start und ein End Argument benötigt.


    Um ein Fadein zu realisieren muss Overlay innerhalb von Animate erzeugt werden was innerhalb von ApplyRange läuft.
    Das sieht dan so aus:
    ApplyRange(563, 587, "Animate", 563, 587, "Overlay", p1, 468, 270, p2mask, 0.0, p1, 468, 270, p2mask, 1.0)


    Die 563 und 587 sind für ApplyRange und ebenso für Animate die Bereiche von den die Blende geht. Ab p1 stehen die Overlay Argumente zur Verfügung. Also von p1 bis 0.0 sind die Startargumente und vom zweiten p1 bis 1.0 die Endargumente für Animate. ApplyRange braucht nur ein Argument und das sind die Argumente von Animate.


    ApplyRange und Animate kann man dank das man Filter in ihnen anwenden kann beliebig groß verschachteln. Diese Konstruktion aber reicht völlig für viele Sachen.
    p2mask ist übrigens der Maskenfilter, wenn ein Bild über ein [lexicon]Alphakanal[/lexicon] verfügt. Dieser wird dann nicht angezeigt dank der Maske.


    Aus diesem ganzen Gedöns, kann man sich auch eine Funktion bauen die dann ein Fadein und ein Fadeout realisiert. Was brauchen wir für Angaben?
    clip clip0 - Das Bild auf das gezeichnet wird
    clip clip1 - Das Bild was gezeichnet werden soll
    clip clip1mask - Die Maske für Clip1
    int sframe - Der Startframe wo das ganze anfangen soll
    int eframe - Der Endframe wo das ganze aufhören soll
    int fadeinframe - Die Framelänge die das Fadein benötigt
    int dadeoutframe - Die Framelänge die das Fadeout benötigt
    int x2 - Der x Wert für Clip1 in Overlay an welcher Breitenposition positioniert werden soll
    und
    int y2 - Der y Wert für Clip1 in Overlay an welcher Höhenposition positioniert werden soll


    Damit sind alle Angaben vertreten die wir brauchen.


    Daraus entsteht die Funktion:

    Code
    Function Blende (clip clip0, clip clip1, clip clip1mask, int sframe, int eframe, int fadeinframe, int fadeoutframe, int x2, int y2) {
    }


    Jetzt wird sie noch ausgefüllt mit den Sachen die diese Funktion machen soll. Also das was ich weiter oben erklärt habe kommt nun in die Funktion rein und wird mit den Variablen gefüttert die für die Funktion zur Verfügung stehen.


    Das sieht dann so aus:

    Code
    Function Blende (clip clip0, clip clip1, clip clip1mask, int sframe, int eframe, int fadeinframe, int fadeoutframe, int x2, int y2) {
    clip0 = ApplyRange(clip0, sframe, eframe-fadeoutframe-1, "Animate", sframe, sframe+fadeinframe, "Overlay", clip1, x2, y2, clip1mask, 0.0, clip1, x2, y2, clip1mask, 1.0)
    clip0 = ApplyRange(clip0, eframe-fadeoutframe, eframe, "Animate", eframe-fadeoutframe, eframe,"Overlay", clip1, x2, y2, clip1mask, 1.0, clip1, x2, y2, clip1mask, 0.0)
    return clip0
    }


    Diese Funktion erzeugt nun eine Einblende und eine Ausblende. Das reicht eigentlich auch schon für deine Zwecke. Aufrufen würde ich die Blende nach dem Beispielmuster von oben mit exakt den gleichen Werten wie folgt:


    Code
    Blende (Bild1, Bild1maske, 563, 790, 24, 24, 468, 270)
    Function Blende (clip clip0, clip clip1, clip clip1mask, int sframe, int eframe, int fadeinframe, int fadeoutframe, int x2, int y2) {
    clip0 = ApplyRange(clip0, sframe, eframe-fadeoutframe-1, "Animate", sframe, sframe+fadeinframe, "Overlay", clip1, x2, y2, clip1mask, 0.0, clip1, x2, y2, clip1mask, 1.0)
    clip0 = ApplyRange(clip0, eframe-fadeoutframe, eframe, "Animate", eframe-fadeoutframe, eframe,"Overlay", clip1, x2, y2, clip1mask, 1.0, clip1, x2, y2, clip1mask, 0.0)
    return clip0
    }


    Clip0 muss nicht angegeben werden, wenn es sich um Last handelt. Also des letzten Wiedergabeclips. In der Funktion ist das aber unabdingbar das es angegeben wird. Zurückgeliefert wird Clip0 wo sich dann das Geschehen auf die Blende überträgt.

    Erstmal schon ein Anfang, nicht? ^^


    Als erstes zu deinem Skript:


    Bei dem Befehl MonoToStereo musst du davon absolut sicher sein, das es sich wirklich um Mono Waves handelt. Ansonsten wenn es Waves sind die Stereo enthalten und du diese durch MonoToStereo jagst, dann hast du 4 Channels anstatt 2. Das ist erst mal sehr sehr wichtig, weil du die Audiospuren ja auch mischen willst. Und 4 Channels auf 2 Channels ist halt ein bisschen blöd und fürt zu Fehlern ^^


    Dann sollten beide Wavespuren die du mischen willst die gleiche [lexicon]Bitrate[/lexicon] aufweisen und die gleiche Samplerate.


    Sprich deine Wave Quellen müsste so aussehen mit deinem Skript:


    Spur1 = Stereo, 44100 Hz, 16Bit
    Spur2 = Mono, 44100 Hz, 16Bit + Mono, 44100 Hz, 16Bit = Stereo, 44100 Hz, 16Bit


    Das kannst du dann mischen.


    Meine Empfehlung ist aber den Audioanteil in [lexicon]Audacity[/lexicon] zu schneiden und zu mischen und dann als eine [lexicon]PCM[/lexicon] Wave Spur zu exportieren. Stereo, 44100 Hz, 16Bit sollten reichen. Diese kann man dann im Skript ohne viel Umstände mit WaveSource reinladen.


    Glaub mir, du machst dir mit dem Ton einfach zu viel Arbeit und zu viel Stress im Skript.


    Ich mach dir mal deinen Skript da:


    Code
    AVISource("D:\Aufnahmen\test1.avi", audio=False).AssumeFPS(30,1).Lanczos4Resize(1920,1080)
    Bild1 = ImageSource("C:\Users\Keijin\Pictures\test.png")
    Spur1 = WAVSource("D:\Aufnahmen\test1 st0.wav")
    Spur2 = WAVSource("D:\Aufnahmen\test1 st1.wav")
    Spur2 = MonoToStereo(Spur2, Spur2)
    Spur = MixAudio(Spur1, Spur2)
    AudioDub(Spur)
    ApplyRange(0,90,"Overlay",Bild1,last.width-Bild1.width,0)


    Das wäre erst mal Übersichtlicher und Sparsamer ;D
    ApplyRange zeigt etwas von [lexicon]Frame[/lexicon] a bis [lexicon]Frame[/lexicon] b an. Das sind im Skript die ersten Zahlen 0 und 90. Overlay ist der Filter der in diesem Bereich wirken soll. Bild1 ist dein Bild was du zeigen möchtest, und last.width-Bild1.width ist die Rechnung von Gesamtbreite-Breite des Bildes.


    Bei Overlay wird immer von der linken oberen Ecke x und y angegeben. Das Bild erstreckt sich dann wie bei einem Rechteck auch nach x2 und y2.


    Sprich wenn du ein Rechteck hast zeichnest du von (x, y) nach (x2, y2)


    x und y gibst du als Position auf dem Gesamtbild an bei Overlay. x2 und y2 ergibt sich aus der [lexicon]Auflösung[/lexicon] des Bildes was du draufsetzen möchtest. Das kann man auch mit einem Resizer nachträglich ändern.


    Für eine Bauchbinde hätte ich also geraten:
    ApplyRange(0,90,"Overlay",Bild1,0, (last.height-Bild1.height)/2)


    Jetzt sollte das Bild in der Mitte der y Achse sein und ganz Links am Rand dran.
    Das kann man halt durch Rechnungen sehr gut platzieren. Mathe lässt grüßen ;D


    Wenn du dein Bild noch strecken willst oder weiter skalieren willst, kannst du das in der nächsten Zeile machen wo du dein Bild lädst.
    Darin schreibst du dann Bild1 = Bild1.Spline64Resize(Breite, Höhe)
    Dann wird eine Instanz von Bild1 erstellt und gleich wieder in Bild1 gespeichert.


    Propotional Skalieren tust du z.B. mit Spline64Resize(Bild1.width + 10, Bild1.Height + 10)
    Oder du zerrst es indem du sagst Spline64Resize(last.width, 30)


    Letzteres zerrt das Bild auf die Länge des Gesamtvideos und hat eine Höhe von 30. Also sehr Schmal.


    Wenn du ein zweite Bauchbinde einbringen willst, dann erstellst du einfach ein neues ApplyRange mit den gleichen Werten unter dem anderen. Außer das du den Framebereich nimmst wo dieses angezeigt werden soll. Also nicht mehr 0,90 sondern vllt 300, 390 oder so.


    Wenn du mit [lexicon]Audacity[/lexicon] mischen solltest, weil es vllt leichter ist, sieht dein Skript dann so aus (Inklusive der nächsten Bauchbinde):


    Code
    AVISource("D:\Aufnahmen\test1.avi", audio=False).AssumeFPS(30,1).Lanczos4Resize(1920,1080)
    Bild1 = ImageSource("C:\Users\Keijin\Pictures\test.png")
    Audio = WAVSource("D:\Aufnahmen\Gemischt.wav")
    AudioDub(Audio)
    ApplyRange(0,90,"Overlay",Bild1,0, (last.height-Bild1.height)-100)
    ApplyRange(150,210,"Overlay",Bild1,0, (last.height-Bild1.height)-100)

    Wobei es hirnlos erscheint etwas Verlustbehaftetes wie [lexicon]OGG[/lexicon] oder MP3 etc. in AVISynth hinzuzufügen. Der Grund ist der das das Script encodiert werden muss. Video als auch Audio. Demnach wird Audio ja noch mal unnötig encodiert. Bei einer [lexicon]WAV[/lexicon] Datei ist das was anderes. Da ist wieder das Prinzip [lexicon]Lossless[/lexicon] to [lexicon]Lossy[/lexicon].


    Der beste Weg wäre wie De-M-oN schon erklärt hat nur das Videofile zum Audio zu machen. Das kann halt auch nur ein normales Bild sein. Man gibt die End Frameposition an (Länge des Audios) und fertig ist das Ding.


    Image = ImageSource("Pfad", 0, 0, 30, false).Loop(Dauer des Videos * 30)
    return Image


    Ein return ist überflüssig ;D Das ist wie gesagt etwas für Funktionen oder wenn etwas abgeschlossen sein soll local für sich. Weil alle Variablen die vor dem Return stehen werden nach dem Return außer Kraft gesetzt. Da der Rückgabewert durch das Return geschieht was als nächstes passiert.


    Es reicht also: ImageSource("Pfad + Dateiname + Endung", start = 0, end = 59 * 30, fps = 30, false)


    Die 30 stehen für die FPS des Videos und die 60 für die Sekunden. Denn Sekunden mal FPS = Frames. Für ein Standbildvideo kann man auch glatt nur 1 [lexicon]FPS[/lexicon] nutzen. Das Bild bewegt sich ja eh nicht. xD


    Daher: ImageSource("Pfad + Dateiname + Endung", start = 0, end = 59, fps = 1)


    Jetzt dauert das Video nur 60 Sekunden bei 1 FPS. Das ist sehr sehr Platzsparend ;D Vor allem da sich das Bild ja eh nicht ändert xD


    60sek weil von 0 bis 59 sind 60.


    Noch kürzer wäre also: ImageSource("Pfad + Dateiname + Endung", 0, 59, 1)


    Als Funktion hätte ich das Beispiel von CruelDaemon vllt so verpackt:

    Zitat

    # Use a still-frame image with audio:
    audio = DirectShowSource("Gina La Piana - Start Over.flv")
    video = ImageSource("Gina La Piana.jpg", fps=25, start=1, end=ceil(25*AudioLengthF(audio)/AudioRate(audio)))
    return AudioDub(video, audio)


    Code
    Musikbild("Final Fantasy VI - Terra's Theme (Orchestrated with Lyrics).mp3", "FF6 - Tina.png", 25)
    Function Musikbild(string soundpfad, string bildpfad, float fps2) {
    audio = DirectShowSource(soundpfad)
    video = ImageSource(bildpfad, 1, ceil(fps2*AudioLengthF(audio)/AudioRate(audio)), fps2)
    return AudioDub(video, audio)
    }


    Damit können nun so fast jede Sounddatei geladen werden. Die FPS ist hier nun sehr wichtig. Je größer die FPS Rate, desto genauer wird das Video zur Audiospur angepasst. Das fällt dann nachher im Millisekundenbereich. Beispiel:
    25 FPS ergibt 1sek und 200 ms Video. Audiolänge ist aber 1sek und 152 ms


    Bei 60 FPS ergibt das Video 1sek und 183 ms
    Bei 120 FPS = 1sek und 166 ms
    usw...


    Bis ein Wert erreicht ist der exakt der Audiospur ist. Wie gesagt, das sind Millisekunden und sind nicht groß tragend.


    Der Skript ist einfach und handlich. Kopieren, Pfade und Datein austauschen und fertig. ^^ Bilder wären BMP, JPG, PNG und GIF bei ImageSource. Ebenso bei ImageReader.


    Beim 2. Script hast du soweit ich sehe beim Resizefilter einmal , und einmal x angegeben. Ich habe das jetzt bei meinen Script einfach auch auf , abgeändert (wobei ich auch als 2. ein AviSource genommen hatte). Geht das mit dem x also auch oder muss es , sein (also so wie ich es nun gemacht habe)?


    Danke für den Hinweis ^^ Bin halt auch nur ein Mensch der Fehler macht. xD
    Es muss ein , hin und kein x. Ich hab es noch mal korrigiert.


    Wenn ihr weitere kleine Fehler sehen solltet, könnt ihr mich auch per PN oder hier im Thread drauf aufmerksam machen ^^


    Eine weitere Lade Funktion wäre halt noch das was De-M-oN Vorgeschlagen hatte mit FFVideoSource. Sieht dann halt so aus:

    Code
    LoadPlugin("D:\MeGUI\tools\ffms\ffms2.dll")
    FFVideoSource("C:\Test\xyz.avi")


    Wenn Fehler auftreten sollten dabei mal das ganze so ergänzen:


    Code
    LoadPlugin("D:\MeGUI\tools\ffms\ffms2.dll")
    FFVideoSource("C:\Test\xyz.avi", threads = 1)


    Diese Ladefunktion von Videos ist der von AVISource oder DirectShowSource weit überlegen und ist in den meisten Fällen auch besser geeignet.


    Sound kann man darüber auch laden wenn man das möchte und zwars mit FFAudioSource. Sieht dann so aus:

    Code
    LoadPlugin("D:\MeGUI\tools\ffms\ffms2.dll")
    video = FFVideoSource("L:\Test\Aufnahmen\Test.avi")
    audio = FFAudioSource("L:\Test\Aufnahmen\Test.avi")
    AudioDub(Video, Audio)


    Hier wird ein [lexicon]Lagarith[/lexicon] codiertes Videos geladen und die Soundspur gleich mit aus der Datei. Man kann auch andere Quellen angeben wie MP3 oder was weiß ich ^^ Mit FFVideosSource und FFAudioSource kann man so gut wie fast alles laden. Das ganze basiert dann auf FFmpeg.

    Sofern HDMI, DVI oder derartiges genommen wird zum aufnehmen, dann kann es gut möglich sein das es 60FPS sind. Aber niemals bei Cinch. Also Composite FBAS, SCART oder Composite RGB. Weil das sind alles Analoge Übertragungen und basieren auf diese Geschichte die ich eben erklärt habe. Bei HDMI und DVI gerade bei der [lexicon]PS3[/lexicon] kann es unter Umständen sein das 60FPS erzeugt werden. Einfach um ein sauberes Bild zu liefern. Dann stehen aber auch mehr Frames zur Verfügung ^^


    Man kann ja auch PAL B, NTSC oder PAL_60 das Bild anzeigen lassen. Das beruht dann meist auf die Wiedergabe des Bildes. Ein PAL Spiel würde mit NTSC Einstellungen am PC oder am Fernseher die Zeilen falsch darstellen und das Bild nicht korrekt darstellen. Folge sind dann meist Verzerrungen.


    Irgendwo kann man doch bestimmt auch bei deiner Capture Card die FPS einstellen. Einfach von 60 auf 30 dann setzen. Das reicht dann Dicke aus. Zum einen belastest du deinen Rechner nicht mehr zusätlich und unnötig und zum anderen braucht man auch keine Frames runterberechnen lassen mehr mit ChangeFPS(). Weil sowas auch wieder ein Zeitfresser ist bei der Encodierung.


    Ob dein Video nachher PAL oder NTSC oder sonstwas ist, interessiert nach der Aufnahme nicht mehr. Dann ist es digital. Meist mit Interlaced bestückt auch noch. Das muss man dann auch erst wieder deinterlacen, damit das Bild wieder ganz ist und nicht so... mit hässlichen Streifen überfüllt ist xD


    Das macht sich bei 60FPS PAL_B total Scheiße mit AVISynth das wieder zu korrigieren. Da hab ich lieber 25FPS PAL_B. Vorteil beide haben dann 25FPS.


    Programme wie [lexicon]Camtasia[/lexicon], [lexicon]Sony Vegas[/lexicon] setzen das automatisch um beim reinladen. Bedeutet aber auch das da irgendwelche Filter wirken ob die nun gut oder schlecht sind das eventuell Zeit Unterschiede herschen. Das macht sich erst dann bemerkbar wenn man noch ein Mikrofonspur darüber legt und beide Materialien asynchron sind dann.
    Daher sollte man das mit den FPS nicht übertreiben und richtig wählen. Ansonsten gibt es nur wieder irgendwann Probleme mit anderen Aufnahmen. Und schwubs ist wird was asynchron, nur weil man falsch aufgenommen hat. ^^

    Dann liegt es wohl an meiner Avermedia Gamecapture, da die Datein als 60FPS aufgeführt werden.


    Ich hatte erst letztens jemanden gehabt der hat auch von einer Konsole aufgenommen und meinte auch wie du das das Spiel mit 60FPS abgespielt wird. 60FPS sind aber keine 60Hz. Die 60Hz braucht man um das Bild generieren zu lassen. Erfolgt dies zu langsam, entstehen unsaubere Abläufe des Spiels. Daher sind diese Abläufe bei Konsolen meist festgelegt. Bei neueren Monitoren wird meist automatisch zwischen NTSC und PAL_B und PAL_60 gewechselt, sobald er das entsprechende Signal bekommt vom Übertragungskabel. Die FPS entspricht aber bei der Übertragung meist der Hälfte der Hertz Zahl die an der Konsole vereinbart wurden.


    Beispiel PS1 Spiel: 60Hz. Die PS1 Videos laufen trotz 60Hz mit 15FPS nur. Und die Spiele je nach Spielversion mit 29.97 oder 25 FPS. Die 60Hz bzw 50Hz sind nur dafür da um es eventuell auf NTSC oder PAL Geräten abzuspielen und ein klares Bild zu generieren das nicht flackert, zu schnell oder zu langsam abläuft. Da 29.97 FPS ja etwas schneller ist, muss auch das Bild entsprechend der Frequenz schneller aufgebaut werden. Da ist dann meist 60Hz im Spiel. Spiele die beide Frequenzen unterstützen und auf PAL ausgelegt sind zum beispiel ist der Ablauf des Spiels auf 60Hz einfach flüssiger als bei 50Hz.


    Somit hat man z.B: PAL B 25 FPS mit 60Hz oder PAL B 25 FPS mit 50Hz
    Das erste würde aber optisch vom Bild her flüssiger aussehen, da das Bild schneller aufgebaut wird.


    Anderes Beispiel: PAL B 25 FPS 60Hz und NTSC 29.97 FPS 60Hz
    Pal B ist wesentlich langsamer als NTSC und das würde man auch am Spiel merken, obwohl bei beiden das Bild recht zügig mit 60Hz aufgebaut wird.


    1 Minute PAL B sind auf NTSC 50 sek und 50 ms


    Das eine ist also der Bildaufbau und die FPS ist die Abspielgeschwindigkeit. Zwei unterschiedliche paar Schuhe.


    Ich würde an deiner Stelle auch immer auf PAL setzen so weit es geht. Warum? PAL hat eindeutig ein größeres Bild.


    PAL_60 und NTSC: 525 Zeilen werden je Vollbild übertragen, von denen jedoch nur ca. 480 sichtbar sind. Folge: 480p
    PAL B 50Hz: 625 Zeilen werden je Vollbild übertragen, von denen ca. 576 Zeilen sichtbar sind.Folge: 576p

    Dann mach doch mal Bilder von den [lexicon]MeGUI[/lexicon] Settings. Und zwars ab Extra Configuration und External Programm Configuration.


    Eventuell noch mal ein Update ausführen und schauen ob mp4box upgedatet wird. Weil das ist auch erst seit neustem wieder drin das [lexicon]MeGUI[/lexicon] [lexicon]MP4[/lexicon] wieder ausgeben kann.


    Wie gesagt, bei mir macht er zwei Prozesse wenn ich in [lexicon]MP4[/lexicon] encodieren will.


    Welche Version hast du denn zur Zeit?


    Meine aktuelle [lexicon]MeGUI[/lexicon] Version ist zur Zeit: 2390 auf dem Develoment Update Server.


    Zudem wäre es interessant was in deiner Jobliste steht um ganz sicher zu gehen. Bei File Format müsste auf der ersten Seite [lexicon]MP4[/lexicon] ausgewählt sein. Willst du es encodieren müssten in Queue Tab oben zwischen Input und Log zwei Jobs auftauchen. Einmal von AVS zu h264 mit dem [lexicon]x264[/lexicon] [lexicon]Encoder[/lexicon] im Mode Video und ein Job von h264 zu [lexicon]MP4[/lexicon] mit MP4Box im Mode mux

    Dann erkläre ich es dir anhand deines Logs da:


    Dein Logeintrag: Job commandline: "C:\Users\Kaius\Desktop\Ablage und Verknüpfungen\MeGUI_2028_x86\tools\x264\x264.exe" --preset slow --crf 21.0 --keyint 300 --me hex --subme 7 --partitions all --sar 1:1 --output "C:\Users\Kaius\Desktop\Fraps\Wizard102.mp4" "C:\Users\Kaius\Desktop\Fraps\Wizard102.avs"


    Kurz: [lexicon]x264[/lexicon] --preset slow --crf 21.0 --keyint 300 --me hex --subme 7 --partitions all --sar 1:1 --output Wizard102.mp4 Wizard102.avs


    Geht nicht. Warum? Weil [lexicon]MP4[/lexicon] von x264.exe nicht mehr unterstützt wird. Seit dem neusten [lexicon]MeGUI[/lexicon] kommt MP4Box ins Spiel dafür.
    Der Beweis anhand deines Logs: [Error] [26.08.2013 02:30:56] [lexicon]x264[/lexicon] [error]: not compiled with [lexicon]MP4[/lexicon] output support


    Eigentlich müsste es so aussehen: [lexicon]x264[/lexicon] --preset slow --crf 21.0 --keyint 300 --me hex --subme 7 --partitions all --sar 1:1 --output Wizard102.h264 Wizard102.avs


    Und dann müsste direkt nach dem [lexicon]Encodieren[/lexicon] noch ein Prozess starten mit MP4Box der die h264 Datei in ein [lexicon]MP4[/lexicon] [lexicon]Container[/lexicon] muxt. Passiert aber nicht nach deinem Log. Also werden da entweder falsche oder alte [lexicon]MeGUI[/lexicon] Settings genutzt oder halt kein Update für die verschiedenen Module ausgeführt.

    Mein noobauge erspäht Dinge mit .mp4 - und soweit ich weiß wird mp4 von [lexicon]MeGUI[/lexicon] garnicht mehr unterstützt?


    Eigentlich wird erst in h264 encodiert und dann mit mp4box in [lexicon]MP4[/lexicon] gemuxt. Das heißt das man in [lexicon]MeGUI[/lexicon] auch [lexicon]MP4[/lexicon] auswählen kann. [lexicon]MP4[/lexicon] Support ist also dank MP4Box gegeben in [lexicon]MeGUI[/lexicon]. Ich könnte mir vorstellen das [lexicon]MeGUI[/lexicon] nicht geupdatet wurde.


    In seinem Errorlog entnehme ich aber das x264.exe in [lexicon]MP4[/lexicon] encodieren soll und das direkt. Und das unterstützt er nicht. Wie gesagt, ich gehe von keiner Upgedateten [lexicon]MeGUI[/lexicon] Version aus. Weil in der neuen Version kann man [lexicon]MP4[/lexicon] auswählen und dieser macht erst eine h264 Datei die er dann in einen [lexicon]MP4[/lexicon] [lexicon]Container[/lexicon] muxt dank MP4Box.


    Eine direkte Unterstützung von [lexicon]MP4[/lexicon] Containern gibt es nicht (mehr) bei der h264.exe

    Funktionen und ihre Nutzung + If Then Else - Abfragen


    Funktionen dienen in AVISynth zur erleichterten Bedienung von gewissen Routinen die aus vielen einzelnen Befehlen bestehen. Mit anderen Worten: Man verkürzt sich so Vorgänge die man immer wieder braucht.


    Großes Problem in AVISynth ist das Ansprechen eines Filters in einem bestimmten Zeitbereich/Framebereich. Was weiß ich, Filter xy soll von [lexicon]Frame[/lexicon] 20 bis [lexicon]Frame[/lexicon] 60 wirken. Aber der eigentliche Filter wirkt nur auf das gesamte Video.


    Um das zu realisieren in AVISynth gibt es ein Weg und der heißt Schneiden.


    Wir haben also unser Video. Ich nenne ihn mal clip0. Die Schnitte erfolgen in 3 Clips. Einen Anfangsclip, ein Bearbeitungsclip und ein Endclip. Daraus ergeben sich 4 Kombinationen:
    1. Nur Bearbeitungsclip
    2. Anfangsclip + Bearbeitungsclip
    3. Bearbeitungsclip + Endclip
    4. Anfangsclip + Bearbeitungsclip + Endclip


    Also 4 Möglichkeiten das Video wieder zusammzufügen. Von den 3 Clips interessiert nur der Bearbeitungsclip dann. Das ist der Bereich wo dann der Filter drauf wirkt.


    Der Anfangsclip ist der, der von [lexicon]Frame[/lexicon] 0 an startet und bis zu dem [lexicon]Frame[/lexicon] Bereich geht wo wir unseren Startframe setzen.
    Der Bearbeitungsclip besteht aus unseren Framestart und Frameend Position.
    Der Endclip besteht aus unseren Frameend Position und der maximalen Cliplänge des Original Videos.


    Wenn Filter xyz von [lexicon]Frame[/lexicon] 30 - 50 wirken soll, dann tritt Möglichkeit 4 in Kraft.
    Wenn Filter xyz von [lexicon]Frame[/lexicon] 0 - 50 wirken soll, dann tritt Möglichkeit 3 in Kraft
    Wenn Filter xyz von [lexicon]Frame[/lexicon] 30 - Video Endframe wirken soll, dann tritt Möglichkeit 2 in Kraft
    Und wenn Filter xyz von [lexicon]Frame[/lexicon] 0 - Video Endframe wirken soll, dann tritt Möglichkeit 1 in Kraft


    Das mal jetzt als Verständnis, damit man eine Vorstellung jetzt ungefähr hat ^^


    Als nächstes brauchen wir Abfragen um das ganze zu Realisieren. Dazu können wir uns einer If Then Else (Ist Dann Ansonst) Abfrage bedienen.


    Einfache Logik für Programmierer:
    If x = 3 then y= 2 else y=4


    Auf Deutsch:
    Ist x = 3 dann y = 2 ansonsten y=4


    In AVISynth:
    y = (x=3) ? 2 : 4


    Sollte doch verständlich sein, oder? Wenn Fragen sind, einfach fragen ;D


    Kommen wir nun zur Funktion. Eine Funktion sollte so aufgebaut werden, das sie für viele Sachen mehrmals verwendet werden kann. Sprich sie sollte Dynamisch sein. Zudem sollten die meisten Funktionen in AVISynth einen Wert zurück liefern. das machen wir mit Return. Wir senden also unsere Informationen an eine Funktion, die dann das entsprechende Ergebnis liefert.


    Ich möchte mit euch das bereits genannte Problem + die Lösungsansätze dafür nutzen um mit euch eine Funktion dafür zu entwickeln das Problem mit nur einen einzigen Befehl zu lösen.


    Ich möchte jetzt nämlich einen Filter verwenden den man immer wieder mal braucht. Und zwars Overlay.
    Was brauchen wir also alles für unsere neue Funktion? Overlay braucht 2 Clips, dann brauchen wir natürlich einen Start und einen Endframe und einen Bildbereich von x,y - x2,y2
    Das würde also ein Rechteck bedeuten. Das sind also 8 Werte die wir brauchen.


    Erstellen wir uns also unsere Funktion. Nennen wir sie einfach xyz. Ihr könnt diese Funktion so bezeichnen wie ihr wollt. Ich rate aber davon ab die Funktion so zu benennen wie andere Befehle ;D


    Also fangen wir an mit:

    Code
    Function xyz (clip clipx, clip clip0, int sw, int sh, int ew, int eh, int sframe, int eframe) {
    }


    clipx werde ich als das Video nehmen auf das gezeichnet werden soll, clip0 ist das Video auf das der Filter nachher wirken soll. sw, sh, ew und eh stehen für startwidth, startheight, endwidth und endheight. Quasi unser Bildbereich (x,y) - (x2,y2) . Und sframe und eframe stehen für unseren Framebereich auf das der Filter angewendet wird. Hier als startframe und endframe ;D


    Die Funktion ist noch relativ leer. Aber man kann sie aufrufen mit dem Befehl:
    xyz(last, v1, 0, 0, 320, 240, 0, 1800)


    Als Anschauhung gebe ich wieder ein Beispielskript vor:

    Code
    v1=BlankClip(length=1800, width=640, height=480, fps=25, color=$000000)
    v2=BlankClip(length=1800, width=640, height=480, fps=25, color=$FF0000)
    xyz(v1,v2,100,100,300,300,500,1000)
    xyz(v2,350,200,500,500,500,1000)
    Function xyz (clip clipx, clip clip0, int sw, int sh, int ew, int eh, int sframe, int eframe) {
    }


    Nehmen wir mal an v1 und v2 sind das gleiche Video. Ich hab das jetzt mal so erstellt damit man farblich erkennt was dann passiert nach dem Vorgang.


    Als nächstes geben wir unserer Funktion die einzelnen Schnitte vor für unsere 3 Clips die wir brauchen um unseren Filterbereich zu verwenden.
    Clip1 soll unser Anfangsframe sein. Da AVISynth uns einen Strich durch die Rechnung macht, wenn wir Trimen wollen von [lexicon]Frame[/lexicon] 0 oder [lexicon]Frame[/lexicon] 1 zu [lexicon]Frame[/lexicon] was weiß ich, muss eine Abfrage her.


    Diese lautet um es verständlich zu machen für andere User:

    Code
    If sframe = 1 then
    clip1 = clip0.Trim(0, sframe - 2)
    Else
    clip1 = clip0.Trim(0, sframe - 1)
    End If


    In AVISynth also:

    Code
    clip1 = (sframe == 1) ? clip0.Trim(0, sframe - 2) : clip0.Trim(0, sframe - 1)


    Das entspricht genau das gleiche Muster.


    Clip2 ist unser Bearbeitungsclip. Hier muss mit Crop unser Bereichsfenster gecroppt werden. Da der Cropbefehl auch Negative Zahlen braucht für rechts und unten, müssen wir wieder unsere Mathematik spielen lassen.


    Wie berechnen wir x2 und y2 unseres Rechtecks? Genau. Indem wir uns der Clipbreite und Höhe bedienen.
    Weil Breite - ew und Höhe - eh ergeben unsere x2 und y2 Position. Da es aber negative Zahlen sein müssen bei rechts und unten in Crop formen wir das um in: -Breite + ew und -Höhe + eh.


    Das ganze sieht dann also so aus:

    Code
    clip2 = clip0.Crop(sw, sh, -clip0.width + ew, -clip0.height + eh)


    Nun müssen wir noch dafür sorgen das der neue Clip2 wieder auf die gleiche Größe kommt wie der Ursprungsclip, damit Clip1, 2 und 3 wieder zusammengefügt werden können. Und das gecroppte clip2 soll auch wieder an der gleichen Position erscheinen von da wo wir es herrausgecroppt haben.


    Das machen wir mit Overlay. Gleichzeitig schneiden wir es auf Start und Endframe. Also den Bereich wo das ganze im Gesamtvideo angezeigt werden soll. Das machen wir dann mit dem Trim Befehl wieder.


    Also die nächste Zeile lautet dann:

    Code
    clip2 = Overlay(clipx, clip2, x = sw, y = sh).Trim(sframe, eframe)


    clip2 wird auf Clipx gezeichnet auf Position sw und sh die wie ja schon verwenet haben. Da es die exakten Größen hat weil das Video ja meist identisch ist bei nur einen Video ;D sieht man dann halt keinen Unterschied das da der Bereich neu aufgelegt wurde. Bei der Beispielvorgabe allerdings sieht man es dann durch den Schwarzen und Roten Clip dann um es euch auch mal zu zeigen was da passiert. ^^


    Jetzt brauchen wir natürlich noch unseren Clip3. Der muss 1 [lexicon]Frame[/lexicon] später anfangen und bis zum Schluss des Gesamtvideos gehen.
    Das ist jetzt ganz einfach. Das machen wir so:

    Code
    clip3 = clip0.Trim(eframe+1, clip0.framecount-1)


    So. Wenn wir das alles haben fehlt uns nur noch ein Rückgabewert des Videos. Hier kommen unsere 4 Möglichkeiten ins Spiel die wir abfragen müssen.
    Wieder einfache Logik erst mal zum Überblick:


    In AVISynth sieht das dann so aus:

    Code
    return (sframe == 0 && eframe == clip0.framecount - 1) ? clip2 : (sframe == 0) ? clip2++clip3 : (eframe == clip0.framecount - 1) ? clip1++clip2 : clip1++clip2++clip3


    Das wars dann auch schon. Die Funktion sollte damit fertig sein und ihr könnt diese auch mal testen. Das Return gibt wie gesagt die entsprechende Variable zurück. In unserem Fall hier ein Videoclip. Bei dem Return werden die entsprechenden Clips wieder zusammen gefügt. Da unsere Funktion sehr Framegenau ist, kommen keine Frames dazu oder werden weniger.


    Diese Funktion hier Überlagert ein Video auf ein anderes.


    Ihr könnt mit Clip2 nun anstellen was ihr wollt. Benutzt andere Filter oder was weiß ich. Ihr habt auf jedenfall eine Frameangabe von wo der Filter wirken soll. Das ist besser als ApplyRange, da bei dieser Methode mehr Kontrolle ist und man mehrere Filter einbauen kann die auf Clip2 wirken mit nur einem Befehl nachher.


    Hier noch mal das fertige Skript für euch:


    Wie ihr seht, taucht im Framebereich 500 bis 1000 ein Viereck auf und rechts daneben ein schmales Rechteck. Das sind die Bereiche die herausgecoppt wurden. Bei xyz(v2,350,200,500,500,500,1000) fehlt eine Clipangabe. Wie in den Tutorials davor erwähnt muss Last als Variable nicht angegeben werden sofern der erste Eingang des Filters ein Clip ist. Bei diesem eben genannten dick makierten Beispiel steht eigentlich xyz(last, v2,350,200,500,500,500,1000) da. Last ist das Resultat aus dem ersten xyz Aufruf mit xyz(v1,v2,100,100,300,300,500,1000).


    Mit dieser Funktion ist es also Möglich viele Sachen zu machen. Wenn dazu noch Fragen sind, immer stellen. Ich versuche sie dann auch zu beantworten. ^^

    @zu St.One: Sieht doch gut aus der Skript ^^ Was meinst du mit:


    Habe versucht eine Aufnahmedatei in [lexicon]MeGUI[/lexicon] zu ziehen und dann per Info() drauf, aber irgendwie will er die Datei nicht öffnen.


    Du musst den Skript reinladen oder die Video Datei im AVS Creator.


    Im Skript wird in RGB32 geladen. Zu sehen an dem ConvertToYV12()


    Du kannst es selbst nachsehen indem du dein Skript so veränderst:

    Code
    AVISource("F:\GamesNine\Filmchen\Testrender\Bausteine\Antichamber 3.avi", audio=true).AssumeFPS(30,1)
    Lanczos4Resize(2048,1152)
    Info()
    ConvertToYV12()


    Ich würde bei Spiele entweder den PointResizer verwenden (Der schärfste Resizer) oder den Spline64Resize (Der ist relativ scharf, aber macht die Aufnahme etwas verschwommen)
    Das mit den Resizern muss aufs Video abgeschätzt werden welcher der bessere ist. Häufig wird letzteres genommen, da wenn zu scharf Resized wird bei Spiele die recht Detailreich sind kommen unschöne Artefakte zum Vorschein.


    Ich hab euch mal so ein ResizeTester geschrieben, wo ihr anhand eines Bildes die Unterschiede zwischen den Resizern sehen könnt. Das ganze wird als Bitmap (*.bmp) gespeichert und ihr könnt dann mit einem Bildbetrachter mal ganz nah ranzoomen wo die Unterschiede sind zu den Resizern.


    Hier mal der Code dazu:


    Und hier noch ein Testbild dafür: Testbild


    Ihr könnt auch jedes andere Bild nehmen. Ladet den AVISynth Script kurz in [lexicon]MeGUI[/lexicon] oder wenn ihr AVISynth vor [lexicon]MeGUI[/lexicon] installiert habt auch in Virtual Dub kurz rein. Danach könnt ihr alles wieder zu machen und das erzeugte Vergleichsbild ist im selben Ordner wie das Testbild was ihr geladen habt.


    Damit ihr mal die Unterschiede seht. Weil ja jedesmal gefragt wird ;D


    So sieht dann das Bild hinterher aus z.B. :


    Wie gesagt, ihr könnt auch jedes andere Bild laden und nachschauen. ;D


    Und hier hab ich noch für alle mal ein Video bezüglich der Farbkonvertierungen zu YV12 von RGB32/RGB24 und YUY2 aus.
    Damit ihr mal seht was wir meinen, wenn wir sagen das eine Konvertierung bezüglich der Farben schädlich ist für euere Videos. Der Farbverlauf hat damit nix zu tun. Es geht jetzt nur um die Farben allgemein.
    Das betrifft den Thread: [ Text-Tutorial ] Korrekter Farbraum von Videos in AVISynth + Reperaturvorgang Lagarith für AVISource


    Bei dem Video hier seht ihr die Wirkung wenn von RGB32 -> YV12 gewandelt wird, YV12 -> YV12 und YUY2 -> YV12
    http://www.youtube.com/watch?v=01hE9WJWW_0&hd=1
    Die Qualität des Videos könnt ihr ja auf YT noch weiter hochstellen.
    Eure Player arbeiten wiederum ganz anders als der Youtube Player. Deshalb könnt ihr das Video auch mal bei euch testen als Original: Farbvergleich_YV12_RGB32_YUY2_zu_YV12.mkv


    Das sind jetzt so ziemlich alle Infos die wir mitunter immer wieder prädigen im Forum ;D

    Sind in der [lexicon]MeGUI[/lexicon] Vorschau immer noch 2 Frames


    Ja klar sind das noch zwei Frames. von 0 bis 1 sind zwei Frames ;D


    Daher brauchst du auch nur das Ende angeben mit end=0 und die Startposition ist eh immer 0 und für ein Bild brauch man keine FPS Angabe.


    Dein Skript: ..., 0, 1, 1) bei ImageReader. Das heißt: ..., start=0, end=1, fps=1)


    start und fps kannst du weglassen. Stattdessen brauchst du nur end angeben mit ..., end=0)


    Bei Virtual Dub lädst du vermutlich falsch. Zieh einfach die AVS Datei in Virtual Dub rein und fertig. Das wars dann schon.

    Ist das ein Problem, was nur seitens YouTube herrscht und man gezwungen wird zu warten (was es wohl nicht ist) oder kann man selbst etwas konkret dagegen unternehmen, dass es erst gar nicht dazu kommt?


    Wenn es ein Problem seitens Youtube ist, kannst du nix dagegen tun. Halte die Videos so lange privat bis sie richtig dargestellt werden und veröffentliche dann. Sollte das Problem länger als 2 Wochen bei einem Video sein, dann dürften an den eigenen Settings zum Encode oder sonstwas sein. Da YT aber nicht Beeinflusst werden kann, abwarten. Ich meine, man hat ja selbst vorher seine Videos auf dem Rechner kontrolliert ^^

    Meine Frage:
    Was ist da los und wie kann ich auf YouTube die gleichen Farbwerte wie im Original erzielen?


    Youtube wird es mit YV12 wiedergeben. Genauso wie der [lexicon]MeGUI[/lexicon] die Videos in YV12 erzwingen wird durch eine Farbkonvertierung. Das Thema mit falschen Farbkanälen hatten wir schon mal gehabt hier.


    Du solltest vllt darauf mal achten als was das Video bei dir in AVISynth geladen wird. Am besten Im Skript mal den Befehl Info() am Ende des Skriptes schreiben. Dann bekommste alle Infos zum geladenen Video.


    Weil eine Konvertierung von YV12 -> RGB32 -> YV12 kann durchaus solche Farbübergänge erzeugen, da Qualitätsverlust herrscht, infolge der Konvertierung die zusätzlich wirkt.
    Ist aber bei vielen Spielen ein sehr geringer Faktor. Meist liegt es an der Youtubekonvertierung. Deshalb sollte man Youtube auch ne Woche mal Zeit geben und abwarten was mit den Videos passiert. Ich hatte schon Videos hochgeladen, die wurden erst nach ner guten Woche besser. Keine Ahnung was die zurzeit treiben. Mein Konto war heut Mittag auch so ziemlich nicht erreichbar bei YT xD Also basteln die schon wieder ^^ Naja, die basteln ja ständig da rum xD Aber irgendwie Hilfreiche Dinge bekommen se nicht gebacken zu implementieren wie den Aspect Ratio das sich der User das aussuchen kann wie er die [lexicon]Auflösung[/lexicon] bezüglich des Seitenverhältnis haben möchte xD

    Ich encodiere über einen [lexicon]Frameserver[/lexicon] von Premiere CS6 aus mit [lexicon]MeGUI[/lexicon].
    Mit dem AVISource Befehlt funktioniert das auch ohne Probleme, aber wie letztens festgestellt wurde encodiert [lexicon]MeGUI[/lexicon] ja dann in RGB und wieder zurück, was man anscheinend mit dem FFShow Befehl beheben kann.


    Nein, das macht er nur bei bestimmten Datein die erzeugt wurden, da die Header Datein von Programm zu Programm unterschiedlich geschrieben werden. AVISource ist auf ein bestimmtes Muster geeicht, nämlich den, den die Codecs mit sich bringen. Beim MSI [lexicon]Afterburner[/lexicon] in [lexicon]Lagarith[/lexicon] läd AVISource nämlich ohne irgendwas zu ändern gleich YV12 rein.


    Das kannste bei dir auch mal überprüfen, indem du nach AVISource ... bla bla bla eine neue Zeile machst wo steht: Info()


    Dann siehst du oben links die Informationen vom Video wie es gerade in AVISynth geladen wurde. Mitunter auch den Farbraum. Sollte der richtig sein, brauchst du da keine großartigen Sachen machen. Selbst RGB32 ist nicht weiter schlimm und versetzt deine Videos auch nicht gerade dem ultimativen Qualitätsverlust. Den Unterschied sieht man rein gar nicht ohne genauere Pixelanalyse. Da ja wieder in YV12 konvertiert wird. RGB32 muss sogar in AVISynth gewählt werden, wenn man mit Masken arbeitet. Demnach kann es also gut sein das deine Datei in RGB32 von dein Adobe aus schon so verschickt wird.