AviSynth, Rahmen und komische Randeffekte um das Video

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • AviSynth, Rahmen und komische Randeffekte um das Video

    Anzeige
    Hallo zusammen,

    ich möchte die Tage mit einem neuen Projekt anfangen, habe soweit alles vorbereitet, die Aufnahme funktioniert von der Konsole, einen verhassten Rahmen habe ich auch erstellt und auch die AVS Scripts habe ich schon zusammengebastelt. Leider scheine ich irgend etwas falsch zu machen, denn je nach aktueller Farbe vom Video an den Rändern sieht es so aus, als würde das Video vom Rahmen abstehen, obwohl es eigentlich ganz klar in den Alpha Kanal des Hintergrunds hinein gelegt ist.

    Vielleicht sehe ich aber auch einfach den Wald vor Bäumen nicht, weshalb ich euch einfach mal meine Scripts und Video Files zur Verfügung stelle:
    Script mit dem das Video und der Rahmen geladen werden und das Video in den Rahmen eingefasst wird.

    Quellcode

    1. file = "D:\Profiles\Alex\Eigene Videos\Let's Play\Yoshi's Story\!Raw\YS.avi"
    2. Video = AVISource(file)
    3. Video = Video.AssumeFPS(Float(Round(Video.Framerate*1000))/1000).crop(25,3,-21,-5)
    4. Rahmen = ImageReader("Rahmen.png", 0, 0, Video.framerate, pixel_type="RGB32")
    5. Rahmenmaske = Rahmen.ShowAlpha(pixel_type="RGB32")
    6. BlankClip(length=Video.framecount, width=Rahmen.width, height=Rahmen.height, fps=Video.framerate).KillAudio()
    7. Overlay(Video,279,74)
    8. Overlay(Rahmen, mask=Rahmenmaske)
    9. KillAudio().AudioDub(Video)
    Alles anzeigen



    Script in dem das andere Script geladen und weiter verarbeitet wird.

    Quellcode

    1. ### Lade Plugins und setze die globalen Variablen ###
    2. LoadPlugin("D:\SagaraS Scriptmaker\Plugins\resamplehq.dll")
    3. Global breite = 2560
    4. Global hoehe = 1440
    5. Global AR = 0
    6. ### Lade Videoquellen ###
    7. AVIload("C:\Users\AlexMarco\SkyDrive\UtgardusLP\Projekte\Yoshi's Story\Scripting\YS.avs", 2, 0, 0, -0, -0).FadeIn0(30).FadeOut0(30)
    8. ### Filter Verarbeitungszone ###
    9. ### Funktion für Video-Laderoutine ###
    10. Function AVIload (String file, int loading, int cl, int co, int cr, int cu) {
    11. (loading == 1) ? FFIndex(file) : nop()
    12. clip0 = (loading == 3) ? LWLibavVideoSource(file) : (loading == 2) ? Import(file).KillAudio() : (loading == 1) ? FFVideoSource(file, threads=1) : AVISource(file, false)
    13. rate1 = (Round(Float(clip0.framerate * 1000)) / 1000) / 2
    14. rate2 = Round(clip0.framerate) / 2
    15. rate = (rate1 == rate2) ? 1 : 1001
    16. ratefaktor = (rate == 1001) ? 1000 : 1
    17. clip1 = (rate == 1001) ? clip0.AssumeFPS(Round(clip0.Framerate) * 1000, rate) : clip0.AssumeFPS(round(clip0.framerate), rate)
    18. clip1 = clip1.Crop(cl, co, cr, cu)
    19. clip1 = (clip1.width == breite && clip1.height == hoehe) ? clip1 : (AR == 1) ? ((float(Clip1.height * breite) / clip1.width) / 2 == round((float(Clip1.height * breite) / clip1.width) / 2)) ? ((float(Clip1.width * hoehe) / clip1.height) / 2 == round((float(Clip1.width * hoehe) / clip1.height) / 2)) ? clip1 : clip1.ConvertToRGB24(matrix = "Rec601") : clip1.ConvertToRGB24(matrix = "Rec601") : clip1
    20. clip1 = (clip1.width == breite && clip1.height == hoehe) ? clip1 : (AR == 1) ? (((clip1.width * hoehe) / clip1.height > breite) ? Clip1.ResampleHQ(breite, ceil(float(Clip1.height * breite) / clip1.width), Kernel = "Spline16", dstcolorspace="RGB24", srcmatrix = "TV.601", dstmatrix = "TV.601") : Clip1.ResampleHQ(ceil(float(clip1.width * hoehe) / clip1.height), hoehe, Kernel = "Spline16", dstcolorspace="RGB24", srcmatrix = "TV.601", dstmatrix = "TV.601")) : clip1.ResampleHQ(breite, hoehe, Kernel = "Spline16", dstcolorspace="YV12", srcmatrix = "TV.601", dstmatrix = "TV.601")
    21. back = (clip1.width == breite && clip1.height == hoehe) ? clip1 : (AR == 1) ? (0 == 1) ? ImageReader("", 0, clip1.framecount, clip1.framerate).ChangeFPS(round(clip1.framerate) * ratefaktor, rate).ResampleHQ(breite, hoehe, Kernel = "Spline16", dstcolorspace="YV12", srcmatrix = "TV.601", dstmatrix = "TV.601") : BlankClip(clip1.framecount, breite, hoehe, "YV12", round(Clip1.framerate) * ratefaktor, rate).KillAudio() : clip1
    22. Return (clip1.width == breite && clip1.height == hoehe) ? clip1.ConvertToYV12(matrix = "Rec601") : (AR == 1) ? Overlay(back, clip1, (back.width - clip1.width) / 2, (back.height - clip1.height) / 2) : clip1
    23. }
    Alles anzeigen



    Der Rahmen
    Quellvideo
    Das fertig encodierte Video


    Vielen Dank für eure Hilfe!


    Aktuelle Projekte
    Mass Effect 2 | The Legend of Zelda: Skyward Sword

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Utgardus ()

  • 1. Wärs besser wenn du das Quellvideo als unkomprimiert oder zumindest Lagarith o.ä speicherst, weil ich hab kein Fraps und somit auch keinen Decompressor für den FPS1-Codec weshalb ich von VDub & AviSynth 'nen Error bekomme.

    2. Arbeite doch einfach direkt mitm Skript vom SSM. Es ist doch viel umständlicher ein externes Skript dafür herzuziehen.

    3. Wenn schon ein externes Skript, dann aber auch richtig.^^

    Spoiler anzeigen

    Quellcode

    1. AVISource("D:\Profiles\Alex\Eigene Videos\Let's Play\Yoshi's Story\!Raw\YS.avi", false).AssumeFPS(25).Crop(25, 3, -21, -5)
    2. rahmen = ImageSource("Rahmen.png", 0, 0, last.FrameRate, pixel_type="RGB32")
    3. rahmenmaske = rahmen.ShowAlpha(pixel_type="RGB32")
    4. BlankClip(length=last.FrameCount, width=rahmen.width, height=rahmen.height, fps=last.FrameRate).KillAudio().Overlay(last, 279, 74)
    5. Overlay(rahmen, mask=rahmenmaske)


    4. Das Skript im SSM sähe ohne das externe so aus:

    Spoiler anzeigen

    Quellcode

    1. ### Lade Plugins und setze die globalen Variablen ###
    2. LoadPlugin("C:\Zeugs\SagaraS Scriptmaker\Plugins\resamplehq.dll")
    3. Global breite = 2560
    4. Global hoehe = 1440
    5. Global AR = 0
    6. ### Lade Videoquellen ###
    7. AVIload("D:\Profiles\Alex\Eigene Videos\Let's Play\Yoshi's Story\!Raw\YS.avi", 0, 0, 0, -0, -0).FadeIn0(30).FadeOut0(30)
    8. ### Filter Verarbeitungszone ###
    9. rahmen = ImageSource("Rahmen.png", 0, 0, last.FrameRate, pixel_type="RGB32")
    10. rahmenmaske = rahmen.ShowAlpha(pixel_type="RGB32")
    11. BlankClip(length=last.FrameCount, width=rahmen.width, height=rahmen.height, fps=last.FrameRate).KillAudio().Overlay(last, 279, 74)
    12. Overlay(rahmen, mask=rahmenmaske)
    13. ### Funktion für Video-Laderoutine ###
    14. Function AVIload (String file, int loading, int cl, int co, int cr, int cu) {
    15. (loading == 1) ? FFIndex(file) : nop()
    16. clip0 = (loading == 3) ? LWLibavVideoSource(file) : (loading == 2) ? Import(file).KillAudio() : (loading == 1) ? FFVideoSource(file, threads=1) : AVISource(file, false)
    17. rate1 = (Round(Float(clip0.framerate * 1000)) / 1000) / 2
    18. rate2 = Round(clip0.framerate) / 2
    19. rate = (rate1 == rate2) ? 1 : 1001
    20. ratefaktor = (rate == 1001) ? 1000 : 1
    21. clip1 = (rate == 1001) ? clip0.AssumeFPS(Round(clip0.Framerate) * 1000, rate) : clip0.AssumeFPS(round(clip0.framerate), rate)
    22. clip1 = clip1.Crop(cl, co, cr, cu)
    23. clip1 = (clip1.width == breite && clip1.height == hoehe) ? clip1 : (AR == 1) ? ((float(Clip1.height * breite) / clip1.width) / 2 == round((float(Clip1.height * breite) / clip1.width) / 2)) ? ((float(Clip1.width * hoehe) / clip1.height) / 2 == round((float(Clip1.width * hoehe) / clip1.height) / 2)) ? clip1 : clip1.ConvertToRGB24(matrix = "Rec601") : clip1.ConvertToRGB24(matrix = "Rec601") : clip1
    24. clip1 = (clip1.width == breite && clip1.height == hoehe) ? clip1 : (AR == 1) ? (((clip1.width * hoehe) / clip1.height > breite) ? Clip1.ResampleHQ(breite, ceil(float(Clip1.height * breite) / clip1.width), Kernel = "Spline16", dstcolorspace="RGB24", srcmatrix = "TV.601", dstmatrix = "TV.601") : Clip1.ResampleHQ(ceil(float(clip1.width * hoehe) / clip1.height), hoehe, Kernel = "Spline16", dstcolorspace="RGB24", srcmatrix = "TV.601", dstmatrix = "TV.601")) : clip1.ResampleHQ(breite, hoehe, Kernel = "Spline16", dstcolorspace="YV12", srcmatrix = "TV.601", dstmatrix = "TV.601")
    25. back = (clip1.width == breite && clip1.height == hoehe) ? clip1 : (AR == 1) ? (0 == 1) ? ImageReader("", 0, clip1.framecount, clip1.framerate).ChangeFPS(round(clip1.framerate) * ratefaktor, rate).ResampleHQ(breite, hoehe, Kernel = "Spline16", dstcolorspace="YV12", srcmatrix = "TV.601", dstmatrix = "TV.601") : BlankClip(clip1.framecount, breite, hoehe, "YV12", round(Clip1.framerate) * ratefaktor, rate).KillAudio() : clip1
    26. Return (clip1.width == breite && clip1.height == hoehe) ? clip1.ConvertToYV12(matrix = "Rec601") : (AR == 1) ? Overlay(back, clip1, (back.width - clip1.width) / 2, (back.height - clip1.height) / 2) : clip1
    27. }
    Alles anzeigen


    Wie gesagt nimm doch direkt das SSM-Skript. Und damit ichs mir nochmal genauer anschauen kann noch gerecht exportieren, weil ich hab einfach ein anderes Video dafür hergenommen und konnte jetzt keine Fehler feststellen.

    Ansonsten wird bestimmt Sagaras hier vorbeischauen und sieht den Fehler vielleicht direkt.^^
  • Das kommt durch den seichten Übergang deines Rahmens. Dein Video füllt nicht komplett diesen Bereich aus und daher kommen diese unschönen Miniränder zwischen Video und Rahmen zustande. Denn der restliche Hintergrund ist durch BlankClip ja schon schwarz und das scheint durch den Seichten Rahmen wo schon der Alphakanal wirkt durch.

    Dieser seichte Übergang hat auch noch einen anderen Effekt den du auch schon geschildert hast. Und zwars ändert sich je nach Farbe die Intensität der Darstellung. Dabei bilden dunkle Farben (besonders Schwarz) eine sehr hohe Konzentration der Farbmischung, wärend alle hellen Töne (Weiß besonders) sehr schwach bei der Übergangsstelle dargestellt werden.
    Das hat was mit dem Overlay zu tun. Der nutzt nämlich als Mischung zwischen Hintergrund und Vordergrund samt Alphamaske die "Blend" Methode.

    Dieser Effekt ist ganz normal und würde überall auftreten egal mit welcher Software man das macht ^^

    Deine Videofläche beim Rahmen (Originalgröße) hat folgende Bereichswerte anhand des Alphakanals (in Pixel):
    Startposition: 276, 73
    Endposition: 1003, 646

    Das kann man anhand dem Alphakanal herrausbekommen. Und zwars immer dann wenn ein Bereich nicht mehr absolut Weiß ($FFFFFF) ist
    Sobald ein Bereich nicht mehr absolut Weiß ist, sondern dunkler ist, so ist dieser Bereich Transparent und scheint mitdurch. In deinem Fall der Schwarze Bereich von BlankClip.

    Du musst halt da sehr genau sein wenn du solche seichten Übergänge beim Rahmen verwendest ^^

    Ich hab das mal ein bisschen abgeändert deinen Skript und du wirst da keine komischen Streifen mehr sehen zwischen Video und Rahmen ^^

    Quellcode

    1. Video = AVISource("YS.avi").AssumeFPS(25, 1).crop(25,3,-10,-0)
    2. Video = Video.Spline16Resize(Video.width + 5, Video.height + 4)
    3. Rahmen = ImageReader("Rahmen.png", 0, 0, Video.framerate, pixel_type="RGB32")
    4. BlankClip(Video.framecount, Rahmen.width, Rahmen.height, "RGB32", Video.framerate).KillAudio()
    5. Overlay(Video, 275, 72)
    6. Overlay(Rahmen, 0, 0, Rahmen.ShowAlpha(pixel_type="RGB32")).AudioDub(Video)



    @Spurkie
    Wie er das Skript schreibt ist seine Sache. Jeder hat eine andere Übersicht. Eine persönliche.
    Ich würde z.B. niemals ein Overlay hinter einer Source schreiben wie BlankClip oder AVISource. Es sei denn es würde eine Sinnvolle Funktion dabei herrauskommen die nur auf diese Weise geht.

    Zur Übersicht auch besser geeignet. Zudem wollte er den Ton mit durchschleifen. Das hat einen guten Grund warum er es vllt extern macht und nicht im SSM Skript ^^
    Weil im SSM kann er dann die Tonspuren miteinander verknüpfen auf diese Weise. Damit hat das externe Skript seine Daseinsberechtigung als seperates einzelnes Video später.

    Alleine die Feinjustierung zwischen Rahmen und Bild lässt sich durchaus besser Handhaben wenn es Seperat gemacht wird ^^

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Sagaras ()

  • @Spurkie Fraps ist ja schon lossless. Leider gibt es keine andere Möglichkeit meine TV-Karte Lossless aufzuzeichnen in AVI, da DXTory den Prozess drei Mal mit jew. 1/3 der Framerate und der Afterburner es gar nicht erkennen. Und die interne Aufnahmefunktion von Amarec nimmt leider Interlaced auf, was auch mist ist. Deshalb bin ich gezwungen mit Fraps aufzunehmen.

    @Sagaras vielen Dank für deine Anpassungen. So läuft es perfekt. Das Script hattest du übrigens mal genau so geschrieben und ich habe es halt mit neuen Werten jetzt angepasst gehabt. Aber gut, ich habe weitestgehend verstanden, wie es funktioniert.
    Falls doch nicht, melde ich mich einfach nochmal beim nächsten Projekt :D

    Auf jeden Fall vielen Dank für eure Hilfe. Ich markiere hier mal als Erledigt ;)


    Aktuelle Projekte
    Mass Effect 2 | The Legend of Zelda: Skyward Sword
  • Anzeige
    Wie du den Skript schreibst ist dir ja selbst überlassen ;D

    Wichtig war hier nur die Größe und Position des Videos zur Rahmenmitte. Weil die war halt nicht komplett ausgefüllt ^^

    Sprich wichtig zur Änderung waren die Befehle: Crop und die Position des Videos auf dem BlankClip beim vorletzten Overlay. Wenn es nicht passt, macht man für Gewöhnlich eine leichte Streckung des Videos was ich dann mit Spline16 getan habe. 5 Pixel mehr in die Breite und 4 Pixel mehr in die Höhe.

    Besser wäre es natürlich wenn das Video sofort passen würde im Rahmen. Aber dazu müssteste den Rahmen neu anpassen, damit du diese seichten Übergänge zur Videomitte mit einkalkulierst.
    Weil dann bräuchteste im externen Skript kein Resizer anwenden und sparst dir somit Leistung für den Encode später.
  • Ich hatte tatsächlich versucht den Rahmen genau auszufüllen...
    Das Video ist halt 768x576 also PAL mit Pixelseitenverhältnis 1 und 4:3. Ich schneide die schwarzen Ränder weg und habe hinterher 722x568.
    Und eigentlich hatte ich den transparenten Bereich im Rahmen auch genau so groß gemacht. Aber gut, das kann ich dann auch nachträglich ändern. Hab ja die psd Datei noch :D Danke für den Tipp. Dann muss ich nicht im Startscript gleich resizen :D


    Aktuelle Projekte
    Mass Effect 2 | The Legend of Zelda: Skyward Sword