Vapoursynth image overlay

  • Hallo Allerseits,
    ich setzte mich das erste mal mit Vapoursynth auseinander und versuche nun ein png Bild (mit Alphakanal) über ein Video zu legen. Also das Resultat sollte so ausschauen, dass ich ein Video habe wo eine Bauchbinde an bestimmter Stelle für, sagen wir 10 Sekunden, ein und ausgeblendet wird. Die Bauchbinde hat dabei die gleiche Auflösung wie das Video nur eben mit Transparenz so das nur ein Balken gesehen wird.

    In FFmpeg habe ich das ganze schon hinbekommen, allerdings würde ich es gerne mal in Vapoursynth umsetzten und die Geschwindigkeit vergleichen.

    Mein Testscript schaut momentan so aus:

    Leider funktioniert das so nicht, weil der Alphakanal nicht akzeptiert wird.

    Wisst ihr wie hier der richtige Ansatz wäre?


    Grüße

    jb_

  • Noch nie versucht, aber:

    • Sicher, dass da alpha=True gesetzt werden muss?

      Zitat

      Return the alpha channel from the read images as a separate grayscale clip. Note that an alpha channel clip is always returned when this parameter is set, even for image formats without support for it.


      hört sich eher so an, als ob alpha=False stehen sollte.

    • Vermute das image I im RGB..-Format ist und das Video YUV420 -> je nach dem müsste da eventuell noch eine Farbraumkonvertierung durchgeführt werden
    • Hast Du mal DeLogo.AddLogo versucht? (siehe: https://github.com/HomeOfVapourSy…ourSynth-DeLogo)

    -> keine Ahnung ob das hilft, wenn Du weißt wie es geht würde es mich aber auch interessieren :)

    Cu Selur

    Ps.: wie positioniert man denn das Logo? ARGH, vermute wenn man da was Positionieren will müsste man Lut2&Expr verwenden.


    PPs.: vermute auch, dass Merge das falsche Mittel ist, Du müsstest auch Lut2&Expr verwenden. (Achtung, letzteres versteht nur polnische Notation.)

    https://github.com/HomeOfVapourSy…ter/havsfunc.py kommt mit Overlay,..

  • Krieg es mit der aktuellen Vapoursynth R33.1 portable nicht zum Laufen:

    Code
    # Importsimport sysimport osimport vapoursynth as vscore = vs.get_core()# Import Scripts FolderscriptPath = 'G:/Hybrid/vsscripts'sys.path.append(os.path.abspath(scriptPath))# Import havsfuncimport havsfunc as havsfunc# Loading Pluginscore.std.LoadPlugin(path="G:/Hybrid/Vapoursynth/vapoursynth64/plugins/SourceFilter/LSmashSource/vslsmashsource.dll")# Loading F:\TestClips&Co\test.avi using LWLibavSourceclip = core.lsmas.LWLibavSource(source="F:/TestClips&Co/test.avi", cache=0)# adding 'G:\workspace\Hybrid\resources\background.png' using Overlaylogo = core.imwri.Read(filename="G:/workspace/Hybrid/resources/background.png")clip = havsfunc.Overlay(clipa=clip, clipb=logo)# Outputclip.set_output()


    liefert:

    Code
    Failed to evaluate the script:
    Python exception: No attribute with the name imwri exists. Did you mistype a plugin namespace?
    Traceback (most recent call last):
      File "src\cython\vapoursynth.pyx", line 1491, in vapoursynth.vpy_evaluateScript (src\cython\vapoursynth.c:26905)
      File "H:\Temp\tempPreviewVapoursynthFile12_54_07_495.vpy", line 16, in <module>
        logo = core.imwri.Read(filename="G:/workspace/Hybrid/resources/background.png")
      File "src\cython\vapoursynth.pyx", line 1105, in vapoursynth.Core.__getattr__ (src\cython\vapoursynth.c:20799)
    AttributeError: No attribute with the name imwri exists. Did you mistype a plugin namespace?


    Grummel, entweder irgendwas an der Dokumentation ist nicht korrekt (http://www.vapoursynth.com/doc/plugins/imwri.html) oder ich übersehe etwas.

    Cu Selur

    Ps.: Hab es mal bei Doom9 gepostet,...

  • Im Quelltext steht:

    Zitat


    Note that the namespace will be *imwrif* when compiled with a HDRI ImageMagick to distinguish the behavior and accepted format input/output formats.

    Probier mal mit imwrif

  • Dann heißt die Fehlermeldung:

    Code
    Failed to evaluate the script:Python exception: No attribute with the name imwrif exists. Did you mistype a plugin namespace?Traceback (most recent call last):  File "src\cython\vapoursynth.pyx", line 1491, in vapoursynth.vpy_evaluateScript (src\cython\vapoursynth.c:26905)  File "H:\Temp\tempPreviewVapoursynthFile15_24_28_417.vpy", line 16, in <module>    logo = core.imwrif.Read(filename="F:/TestClips&Co/background.png")  File "src\cython\vapoursynth.pyx", line 1105, in vapoursynth.Core.__getattr__ (src\cython\vapoursynth.c:20799)AttributeError: No attribute with the name imwrif exists. Did you mistype a plugin namespace?


    Eventuell fehlt bei der Portable die entsprechende dll,...
    Im coreplugins-Order ist da nur:

    Code
    avisource.dll
    AvsCompat.dll
    EEDI3.dll
    libhistogram.dll
    libsubtext.dll
    libtemporalsoften.dll
    RemoveGrainVs.dll
    Vinverse.dll
    VIVTC.dll

    hätte da eigentlich noch ne weitere dll erwartet, welche für ImageMagick Writer-Reader verantwortlich ist.

    Cu Selur

  • Danke sneaker_ger -> http://forum.doom9.org/showthread.php?p=1731196#post1731196
    imagemagick kommt nicht mit dem Installer,... Zeug in der 'included plugins' Liste aufführen welches gar nicht included ist,... ARGH!

    Naja, wenn ich dann:

    Code
    # Importsimport sysimport osimport vapoursynth as vscore = vs.get_core()# Import Scripts FolderscriptPath = 'G:/Hybrid/vsscripts'sys.path.append(os.path.abspath(scriptPath))# Import havsfuncimport havsfunc as havsfunc# Loading Pluginscore.std.LoadPlugin(path="G:/Hybrid/Vapoursynth/vapoursynth64/plugins/SourceFilter/Imagemagick/libimwri.dll")core.std.LoadPlugin(path="G:/Hybrid/Vapoursynth/vapoursynth64/plugins/SourceFilter/LSmashSource/vslsmashsource.dll")# Loading F:\TestClips&Co\test.avi using LWLibavSourceclip = core.lsmas.LWLibavSource(source="F:/TestClips&Co/test.avi", cache=0)# adding 'F:\TestClips&Co\background.png' using Overlaylogo = core.imwrif.Read(filename="F:/TestClips&Co/background.png")logo = core.resize.Bicubic(clip=logo, format=vs.YUV420P8, matrix_s="709")clip = havsfunc.Overlay(clipa=clip, clipb=logo)# Outputclip.set_output()


    verwende werde wird der Alphakanal schwarz,... -> keinen Nerv mehr für heute.
    Vermute man muss:
    1. beim Lesen des Bildes alpha=True verwenden, entsprechend logo und alpha in einem array entgegen nehmen

    Code
    [logo, alpha] = core.imwrif.Read(filename="F:/TestClips&Co/background.png", alpha=True)


    2. beide irgendwie mit dem clip mischen. (vermutlich müsste man sich eine eigene Overlay-Funktion schreiben,..)
    -> ist mir erst mal zu doof da weiter rumzutesten

  • Danke fürs ausführliche testen Selur! alpha=False hatte ich auch versucht, war die einzige Möglichkeit das Image überhaupt angezeigt zu bekommen, allerdings dann ohne Alpha. aplha=True braucht immer Fehlermeldungen, egal was danach kommt. Schade, dass das nicht so ohne weiteres geht, sind ja eigentlich ganz rudimentäre Compositing Funktionen, die schon seit Jahrzehnten im Schnitt verwendet werden, dass das nicht richtig unterstützt wird ist eigenartig.

    Im Prinzip kann ich auch bei meiner ffmpeg Variante bleiben - da ging's ja grundsätzlich - muss nur noch die Performanceprobleme in den Griff bekommen.

  • Mit Hilfe von HolyWu rausgefunden wie es geht:

    Cu Selur

  • Okay, logo nur für einen bestimmten Teil des Clips anzeigen:


    geht auch.

    -> Als nächstes wäre die Frage ob man ein ein- und ausblenden hinbekommt. ;)

  • Ah cool, hast du es noch hinbekommen! Danke! Ja zu einer bestimmten Zeit ein und ausblenden wäre noch nötig. Zum Geschwindigkeitsvergleich brauche ich es aber erst mal nicht, da reicht der trim. In ffmpeg hatte ich es zuerst nicht hinbekommen: loop auf input; trim, fade und overlay so zu kombinieren, dass nur im eingeblendeten Zustand der overlay berechnet wird. Das hat dazu geführt, dass die Kompression ziemlich langsam war.

    Jetzt schaut der Befehle in etwa so aus:

    Code
    ffmpeg -i video.mkv -loop 1 -i image.png -filter_complex "\
    [1:v]split[sp1][sp2];\
    [sp1]fifo,trim=duration=5,fade=t=in:st=0:d=0.5,fade=out:st=4.5:d=0.5,setpts=PTS+2/TB[ps1];\
    [0:v][ps1]overlay=enable=between(t\,2\,7)[ov1];\
    [sp2]fifo,trim=duration=5,fade=t=in:st=0:d=0.5,fade=out:st=4.5:d=0.5,setpts=PTS+50/TB[ps2];\
    [ov1][ps2]overlay=enable=between(t\,50\,7)[out]"\
    -map "[out]" ...

    Damit geht es gut.

    Werde morgen mal Beides vergleiche und berichten, was schneller ist.

    Grüße

    Edit: Das mit dem Vergleichen scheitert daran, dass ich das ganze in OSX nicht gescheit zum laufen bekommen und ffmpeg jetzt mit den obigen Parameter ziemlich flott ist und ich kaum glaube, dass vapoursynth hier schneller wäre.

Jetzt mitmachen!

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