mpv LUA Script-Sammlung

  • Olombo und ich haben uns gefragt, in welcher Form mal am einfachsten LUA Scripte für mpv austauscht. Ich mache hiermit zumindest mal eine Linksammlung auf. Blöd, dass immer nur einer den ersten Post editieren kann, aber wir werden sehen, was draus wird..


    Automatische Umschaltung auf dem Video-fps am nächsten kommende Bildwiederholfrequenz unter Beibehaltung der aktuellen Auflösung:
    Für Linux: https://github.com/kevinlekill…pts/tree/master/autospeed

    Für Windows: https://github.com/kevinlekill…/tree/master/autospeedwin

    BISLANG UNGETESTET


    Noch mal das gleiche, anders implementiert, nur für Linux:
    https://gitlab.com/lvml/mpv-pl…/-/blob/master/xrandr.lua

    BISLANG UNGETESTET


    Dynamic-Crop Script

    https://github.com/Ashyni/mpv-scripts

    Das Script is besonders gut geeignet mit einer Custom Auflösung (z.B. 3840x1600 oder ähnliches) und erspaart das Benutzen des Lensmemories (auf Kosten der Auflösung und Helligkeit) für 16:9 und alle anderen Zwischenformate.

    Besonders praktisch und bequem, wenn man einen Panamorph besitzt. Dadurch passen sich praktisch alle Formate in die Leinwand ein.

    Auch geeignet, um einfach nur die schwarzen Balken weg zu schneiden. Um das beschnittene Bild automatisch an die Unterkante zu schieben, auch wenn es mitten im Film wechselt, nach der Zeile (aktuell Zeile 374 (nano -c zeigt Zeilennummern an)).

    Code
    mp.command(string.format("no-osd vf append @%s:lavfi-crop=%s", labels.crop, current.whxy))

    noch die Zeile

    Code
    mp.command(string.format("no-osd set video-align-y 1"))

    einfügen und die Option video-align-y=1 aus der mpv.conf entfernen, sollte diese gesetzt gewesen sein.

    Da nun bei Filmen ohne schwarze Balken das Script nicht cropt, wird auch das Bild nicht nach unten geschoben. Also muss die Zeile noch ein mal ans Ende der Funktion on_start eingefügt werden, also eingefügt vor der Zeile "end", als Zeile 555.

    Bei Mdann erfolgreich im Einsatz.

    5 Mal editiert, zuletzt von ((( atom ))) ()

  • Was mir noch fehlt, ist ein vernünftiges OSD, mit Titel, Uhrzeit, Restzeit, etc. Ich habe mir da behelfsweise eins selber angepasst, aber richtig gut ist das nicht. Das Ding hängt vor allem immer ganz oben im Viewport, also der vollen Auflösung. Bei Scope-Filmen also in der Kaschierung.. Falls da also wer was haben sollte, hätte ich Interesse.

  • Dynamic Crop (hauptsächlich für Scope Leinwände):
    https://github.com/Ashyni/mpv-scripts
    Das Script is besonders gut geeignet mit einer Custom Auflösung (z.B. 3840x1600 oder ähnliches) und erspaart das Benutzen des Lensmemories (auf Kosten der Auflösung und Helligkeit) für 16:9 und alle anderen Zwischenformate.
    Besonders praktisch und bequem, wenn man einen Panamorph besitzt.
    Dadurch passen sich praktisch alle Formate in die Leinwand ein.

    Grundlage für die Oberfläche zum Basteln (mit osc=no in mpv.conf):
    https://github.com/mpv-player/…master/player/lua/osc.lua

  • Das cropping Script sieht interessant aus. ich habe bislang nur ein recht rudimentäres, das auch gerne mal daneben haut und auch nur ein mal bei Filmstart arbeitet. Warum "hauptsächlich für scope"? Kann man das nicht einfach auf generelles Croppen der Balken hin konfigurieren?


    Soll ich solche Links oben in den ersten Post übernehmen, oder nur welche, die von jemandem als "getestet und für gut befunden" bezeichnet wurden oder noch anders?

  • das Dynamic-crop Script is "getestet".

    Ich habe es seit ca. 7 Tagen im Einsatz. Dort geht es hauptsächlich darum, die Balken bei 16:9 zu entfernen, wenn der eigentliche Bildinhalt nicht 16:9 ist (z.B 2:1, 2.35:1, 2.4:1, etc). D.h. das macht nur Sinn, wenn man auch eine breitere Leinwand als 16:9 besitzt. Zumindest fällt mir gerade kein Nutzen ein, wenn man eine 16:9 Leinwand benutzt.
    Da das Script dynamisch arbeiteten kann, funktioniert es auch mit wechselden Formaten (z.B. Expanse)
    Ich habe das Script zusätzlich noch für mich persönlich bearbeitet. Dadurch wirdzusätzlich alles >= 2:1 etwas aufgezoomed und/oder gestreckt, damit es die 2.4:1 Leinwand voll ausfüllt.
    Bei reinem 16:9 habe ich lieber Balken links und rechts.

    Dadurch komme ich eben auch komplett ohne Lensmemory aus.

    Die Modifikation teste ich aber noch weiter, bevor ich sie hier mit aufführe. Sie ist ebenfalls Geschmachsache, da es eben auch etwas gestreckt wird und nicht jeder das mag.

  • Die Balken zu entfernen ist auch bei 16:9 Leinwänden etwas ganz essentielles, weil der Player das Bild nur an die Unterkante schieben kann, wenn diese nicht mehr da sind. Dann ist das vermutlich die bessere Wahl als mein bisheriges. Werde ich morgen (bzw. nachher) mal testen. Danke. Ich nehm's dann mal direkt mit in den ersten Post.

  • Die Balken zu entfernen ist auch bei 16:9 Leinwänden etwas ganz essentielles, weil der Player das Bild nur an die Unterkante schieben kann, wenn diese nicht mehr da sind. Dann ist das vermutlich die bessere Wahl als mein bisheriges. Werde ich morgen (bzw. nachher) mal testen. Danke. Ich nehm's dann mal direkt mit in den ersten Post.

    guter Einwand. Daran habe ich nicht gedacht.

  • Ich habe Dynamic Crop jetzt mal ausprobiert und werde aber noch nicht so ganz warm damit. Ich benutze ja die Option video-align-y=1, um das Video immer an die Bildunterkante zu schieben. Wenn ich mir im laufenden Betrieb die Ausgaben bei bsp. Tenet angucke, kommt es gelegentlich vor, dass das Script cropt, das Bild also flacher wird, aber sich nicht nach unten schiebt. Umgekehrt sehe ich mitunter, dass das Bild flach bleibt, obwohl das Script wieder auf 16:9 gesprungen ist. Evtl. ist die video-align Option nicht wirklich dafür gedacht, dass sich das Bildformat mittendrin ändert. Komischerweise klappt es meistens. Von der Sache her könnte das Crop-Script sich bestimmt gleich um das nach unten schieben kümmern, aber es ist doch ein längeres Script und ich bin erst mal nicht schlau draus geworden. Leider, denn die Funktion hätte ich schon gerne mit dabei. Mein bisheriges Script croppt immer direkt bei Start des Films, aber wenn sich dann das Format ändert, bekommt der Player das nicht mit. Finde ich an sich auch nicht so schlimm, denn diese Formatwechsel finde ich persönlich richtig ätzend.


    Falls jemand da also evtl. schon weiter ist, bitte posten.

  • du kannst das im Script versuchen (ungetestet):


    das gibts eine Zeile:

    Code
    mp.command(string.format("no-osd vf append @%s:lavfi-crop=%s", labels.crop, current.whxy))

    danach deinen command hinzufügen:

    Code
    mp.command(string.format("no-osd set video-align-y 1")) 
  • Ich sehe schon, ich werde mich intensiv mit LUA beschäftigen müssen..


    Derweil eine Frage, evtl. direkt an Mdann , Du bist mir da definitv voraus, gerne auch an jeden, der es wüsste:

    Ich suche eine Möglichkeit, einen String in mpv ausgeben zu lassen, der ins laufende Video eingeblendet werden soll. Der String kommt von einem anderen Rechner, daher idealerweise über UPD oder TCP.

    Das soll auf dem Bildschirm dann so aussehen und möglichst oben im Bild zu sehen sein:

    Code
    Volume  -32 dB
    Front     0 dB
    Center    0 dB
    Surround -2 dB
    Shaker  -11 dB

    Bislang war das ein langer String, den mein Convoler an die Message-Schnittstelle von KODI geschickt hat: "Volume -32 dB\nFront".... usw


    Hättest Du da evtl. eine einfache Idee für?

  • wie sockets in LUA funktionieren weiß ich leider nicht. Ich habe bis mpv auch noch nie mit LUA gespielt.
    Ich habe aber zum Debuggen OSD messages benutzt (direkt aus den Scripts)

    Code
    mp.osd_message("meine Nachricht",5)

    Das zeigt "meine Nachricht" oben links für 5 Sekunden an.


    Wenn Sockets möglich sind, dann mach dir ein Extra Script. Theoretisch so:
    - UDP socket erstellen + listen in der on_start methode (mp.register_event("file-loaded", on_start))

    - schließe das Socket in der cleanup method (mp.register_event("end-file", cleanup))

    - über mp.osd_message() Nachrichten ausgeben sobald sie empfangen werden

    Möglicherweiße musst du bei den Sockets mit Timeouts arbeiten.

  • Soweit ich mir die Beispielskripte angeschaut habe, kann man mit LUA direkt solche Dinge nicht machen.

    Sobald Requests in den Skripten gemacht wurden, um externe Daten zu senden/laden, ist das entweder mit curl oder einem eigenen Python-Skript passiert. Die kann man als "native command" ausführen.

    Bspw. wird curl so aufgerufen:

    Ein Skript kann auch auf die Art ausgeführt werden. Und mit Python kannst du ja bspw. Sockets/TCP nutzen.

    "A computer lets you make more mistakes faster than any other invention in human history, with the possible exceptions of handguns and tequila." - Mitch Ratcliffe

  • Also Beispiele für LUA Sockets finde ich schon, auch ein Paket lua-sockets.


    Na dann muss ich mich da mal gründlich einlesen, hätt ja sein können, das jemand eine ganz einfache Lösung parat hat.

  • Man benötigt wohl LuaSocket. Leider ist das nicht dabei.


    Ich benutze daher auch cURL für http und Packetsender für UDP unter Windows. Powershell würde vielleicht auch gehen, aber das erschien mir alles umständlicher. So klappt es bisher problemlos.

    Empfängst Du damit auch etwas, dass Du dann in einem LUA Script weiter verarbeitest, oder sendest Du nur?

  • OK, ich glaube aber, mir dämmert's. (Sorry, ich bin in erster Linie fit mit shell-scripten. Ich bekomme schon bei Python oder PHP die Kriese. ;) )

    Könnte ich mit LUA in mpv etwas in der Art extern aufrufen und mit dem Rückgabestring eine Variable befüllen, die ich dann ans OSD schicke?


    socat -u tcp-l:12345

    Das macht einen Port 12345 auf und wartet, bis etwas herein kommt.

  • Danke für die Hinweise mit dem Skript. Hab wohl bisher die falschen angeschaut :beat_plaste

    Da sieht man sogar, wie man die Abhängigkeiten installieren kann. Zumindest bei Debian geht es mit "apt install lua-socket", für die Socket-Unterstützung. Dann muss man doch nicht den Umweg über externe Aurufe machen :)


    @((( atom ))) In dem verlinkten Skript sieht man gut, wie man per UDP an die Daten kommt. Kombiniert mit einer Nachricht, wäre es dann wohl so was:


    Code
    assert(udp:send("ping"))
    data = udp:receive()
    mp.osd_message(data,5)

    "A computer lets you make more mistakes faster than any other invention in human history, with the possible exceptions of handguns and tequila." - Mitch Ratcliffe

Jetzt mitmachen!

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