Skip to content

Conversation

@brindosch
Copy link
Contributor

@brindosch brindosch commented Aug 19, 2019

This PR adds a new image sending feature to the webui and extends the api accordingly. In javascript the processing of images is horrible slow (without WASM), so the solution is at the API side with out-of-the-box power of Qt.

  • The image cmd accepts now a raw image that is encoded with base64. Supported are all image formats that qt supports (that are enough)
  • There is no real size limit. It will be automatically scaled down to max 2000px width or height while maintain aspect ratio
  • It's possible to scale down through a new "scale" property if developer wants that.
  • Test were successful until 3MP pictures, 4k+ seems to close the websocket on browser side, so 2k is a decent value
  • Note: Bootstrap 3 doesn't support file input "adjustment", for better visual style we should add a css snippet globally
  • Adds a new image streaming feature from browser (tabs/applications/complete desktop as target). This works just if used with HTTPS PR#612 AND with a recent version of Firefox/Chrome

Image:
imagefeat

This PR adds a new image sending feature to the webui and extends the api accordingly. In javascript the processing of images is horrible slow (without WASM), so the solution is at the API side with out-of-the-box power of Qt.

- The image cmd accepts now a raw image that is encoded with base64. Supported are all image formats that qt supports (enough)
- There is no real size limit. It will be automatically scaled down to max 2000px width or height according to aspect ratio
- It's possible to scale down through a new "scale" property if developer wants that.
- Test were successfull until 3MP pictues, 4k+ closes the websocket on browser side, so 2k is a decent value
@janpfischer
Copy link
Contributor

Cool!
So you can also Send gif?

BTW: i think the gif upload in effect configurator is broken. Could you verify that?

@brindosch
Copy link
Contributor Author

The GIF upload at the effectsconfigurator never worked. This requires additional code for the jsoneditor. I think it's not prepared for in-place upload.

You can use a GIF, but it won't animate.

@b1rdhous3 @Paulchen-Panther
Was wir mit den GIFs machen und/oder mit den Bildern im Allgemeinen müssen wir mal die Köpfe zusammenstecken

Ideen

  • Man könnte ähnlich wie die EffektEngine eine eigene Klasse für ein ImageHandling schreiben.
  • Diese nimmt Bilder entgegen und speichert sie als Datei auf disk
  • Liest gespeicherte Bilder von der disk ein und stellt sie zur Auswahl.
  • GIFs könnte man extra behandeln und sie entsprechend einem Intervall laufen lassen (Oder mit der EffEngine verknüpfen?)

@Paulchen-Panther
Copy link
Member

Paulchen-Panther commented Aug 19, 2019

The GIF upload at the effectsconfigurator never worked

Das stimmt so nicht. Wenn du in diesen PR schaust wirst du was finden! 😄

2dca1c9#diff-80c1698a4dfb80d4c23366bc811a08b1R38

2dca1c9#diff-660e50680e65cfe24388aedef7264eaaR195

2dca1c9#diff-145eea9884e6fa40c1c4a0d15d19f63bR28

2dca1c9#diff-6526bf2cd45fc573c0f6ef68f9d68243R153

u.s.w.

@Paulchen-Panther
Copy link
Member

BTW: i think the gif upload in effect configurator is broken. Could you verify that?

Ja der ist Kaputt bzw. nimmt nur kleine (>50kb) gif dateien an.

@brindosch
Copy link
Contributor Author

Ah, imageData property.
Also ein großes .gif wird auch abgelegt im custom-eff (8mb).

  • Er findet den Pfad nur nicht mehr. Oder ist das nur ein Nebenschauplatz und das Problem ist größer?
[hyperiond EFFECTENGINE] <ERROR> ###### PYTHON EXCEPTION ######
[hyperiond EFFECTENGINE] <ERROR> ## In effect '456456'
[hyperiond EFFECTENGINE] <ERROR> ## TypeError: File not found
[hyperiond EFFECTENGINE] <ERROR> ## Traceback (most recent call last):
[hyperiond EFFECTENGINE] <ERROR> ## File "<string>", line 12, in <module>
[hyperiond EFFECTENGINE] <ERROR> ## TypeError: File not found
[hyperiond EFFECTENGINE] <ERROR> ###### EXCEPTION END ######
[hyperiond HYPERION] <DEBUG> <PriorityMuxer.cpp:248:clearInput()> Removed source priority 1
[hyperiond EFFECTENGINE] <INFO> effect finished

@brindosch
Copy link
Contributor Author

Acho, das läuft über die args. Was hälst du davon einen FileReader zu benutzen und Python selbst das Bild laden zu lassen. Der Pfad muss entsprechend ergänzt werden (davor)

@brindosch
Copy link
Contributor Author

Zum Tagesabschluss noch ein ultra cooles feature :)
gifs

Ja, es ist das was es ist. Ein Browser-Screencapture. Das erschlägt einfach alles :)

@Paulchen-Panther
Copy link
Member

Welchen Vorteil siehst du im Browser Screencapture gegenüber dem System Capture?

@brindosch
Copy link
Contributor Author

Der größte Punkt ist wohl die Zugänglichkeit. Schnell und einfach. Die performance könnte aber nicht so super gut sein.

Mittlerweile kam aber Ernüchterung auf, das geht NUR NOCH wenn es eine HTTPS Verbindung ist. Es ging in dem Beispiel, weil localhost (loopback) als sicher eingestuft ist. Diese Restriktion wurde schon vor längerer Zeit eingeführt. Gab es aber zu Beginn nicht :)

Also nächster Schritt wäre HTTPS und wahrscheinlich auch WSS, sonst kann das kaum ein Mensch nutzen.

Den Browser als capture device zu nutzen ist aber die wohl einfachste Art Bilder von Fenster/Tabs oder dem ganzen OS zu bekommen. Unabhängig der Plattform

@tpmodding
Copy link
Collaborator

geht das auch mit geschüzten inhalten wie zB Netflix?

@brindosch
Copy link
Contributor Author

Der Browser könnte das durchaus verbieten. Die "Freiheits"-geschichte geht da immer mehr in die Tonne :)

@Paulchen-Panther
Copy link
Member

Kannst du die Bildadresse noch mit löschen, wenn der Button "Reset Color/Effect" gedrückt wurde?
Der Repeat button ruf das letzte Bild trotzdem auf, nachdem ich den Reset button gedrückt habe.

https://prnt.sc/ov6x6v

@Paulchen-Panther
Copy link
Member

Paulchen-Panther commented Aug 20, 2019

Es wäre sehr nett wenn du gleich mal nach dem Color Field schauen könntest. Das setzt auch die farbe wenn man nur das edit field anwählt und wieder verlässt, bzw color picker aufruft und keine farbe auswählt.

@brindosch
Copy link
Contributor Author

Das mit dem colorpicker ist ein changevent das aus dem colorpicker kommt. Das kann man nur im colorpicker code suchen und entfernen. Hat evtl. Nebenwirkungen.

Den button hab ich glatt übersehen. Wo kommen die nur her.

@Paulchen-Panther
Copy link
Member

Im Colorpicker selbst kann ich mir das gut vorstellen aber nicht in unseren JsonEditor edit Feld. Da wird der Colorpicker erst gar nicht aufgerufen. Muss irgendwo auf unserer Seite liegen.

@brindosch
Copy link
Contributor Author

Oke, ich komm dem gleich nach. Nachdem ich das da in dem Bild beendet habe :)
sneakpeak

@Paulchen-Panther
Copy link
Member

okay

@janpfischer
Copy link
Contributor

@brindosch super! Wie wollen wir mit den cert Warnungen umgehen? Können ja schlecht n Zertifikat was gültig ist hinterlegen.
Default ist erstmal ohne und wenn man drauf ist kann man aktivieren?

@brindosch
Copy link
Contributor Author

Können ja schlecht n Zertifikat was gültig ist hinterlegen.

Genau so mache ich das gerade. Also ein selbst signiertes, als wäre ich eine CA. Keine Ahnung wie gut das funktioniert so quer durch die Bank. Aber bevor man nichts hat. Nimmt man einfach das.
Ich füge gerade die Optionen hinzu, um cert/key/key password mitzugeben. Dann kann man mit let's encrypt und so krams sich etwas offiziell signiertes in den webserver schieben.

Ich muss noch testen ob das mit dem capture so auch wirklich funktioniert, oder ob noch mehr Backsteine kommen vom Browser, nur damit ich das nicht umsetzen kann.

@janpfischer
Copy link
Contributor

Selbst signiert wirst du im Browser ne Warnung bekommen, aber denke das ist okay. Kann man ja akzeptieren (daher wichtig, dass es nicht default an ist - könnte Leute verwirren)

Die Möglichkeit für eigene wie let‘s encrypt oder so ist klasse.
vielleicht haben Leute ja auch ihre eigene CA für zu Hause. Soll wohl alles geben :D

@brindosch
Copy link
Contributor Author

brindosch commented Aug 20, 2019

Das mit der Warnung stimmt, die alternative zur Warnung ist ganz abschalten leider.

Soweit ich weiß benötigst du eine öffentlich zugängliche Domain die registriert ist. Die hast du im lokalen Netzwerk vermutlich eher weniger :)
Also können wir da nichts aufsetzen für den Nutzer. Ganz abschalten ist irgendwie auch doof. In jedem Fall wird der traffic geschützt gegen dritte, sollte man es doch übers Internet machen wollen (Wobei dafür fehlt noch das Auth interface :) )

Absolut safer sex!
Und wer Lust hat das so richtig zu machen mit Let's encrypt, der kann das!

@janpfischer
Copy link
Contributor

Genau, bin ich voll bei dir.
Wenn wir es nur im default beim ersten Start an haben könnte die Warnung verwirren?

@brindosch
Copy link
Contributor Author

brindosch commented Aug 20, 2019

Ich hab HTTP nicht abgeschalten, HTTPS ist nur ein Zusatz und wird nicht sonderlich erwähnt :)
Wir fahren jetzt mit 2 webserver ports :)

Edit from @Paulchen-Panther 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍 👍

@janpfischer
Copy link
Contributor

Habe ich. Aber vor 5min eine zweite in der steht, dass die Einladung wieder zurück gezogen wurde

@Paulchen-Panther
Copy link
Member

Paulchen-Panther commented Aug 20, 2019

Jetzt aber

@janpfischer
Copy link
Contributor

Jap, hat geklappt. Danke :)

@brindosch
Copy link
Contributor Author

brindosch commented Aug 20, 2019

In Chrome von Windows aus, mit Netflix.
Jetzt wird gleich jemand ausrasten

netflix

@janpfischer
Copy link
Contributor

janpfischer commented Aug 20, 2019

Hast du probiert ob es im Vollbild auch korrekt funktioniert?

Und wie ist die Latenz?

@Paulchen-Panther
Copy link
Member

Paulchen-Panther commented Aug 20, 2019

Ist der delay zwischen browser und Preview eigentlich sehr groß?

@b1rdhous3 jetzt warst du schneller.

@brindosch
Copy link
Contributor Author

brindosch commented Aug 20, 2019

Du kannst browser tabs, Anwendungen oder den gesamten Desktop streamen. Was meinst du mit Vollbild? Schätze schon. Wie testet man Vollbild funktioniert, während man im Vollbild ist. Ich hab gerade keinen zweiten Monitor zur Hand

GIF aufgenommen mit 15fps, gesendet mit 10fps.
netflix

@janpfischer
Copy link
Contributor

janpfischer commented Aug 20, 2019

Ansonsten noch @b1rdhous3 Meinung einholen. Wir wir vorgehen sollten mit dem Picker.

Ich habe mir das auch schon einmal angeschaut und bin zum gleichen Ergebnis wie du gekommen. In der von uns verwendeten Color Picker Version sehe ich da kein großes anpassungspotential.
Vielleicht sollten wir auch überlegen ob die Remote Seite wirklich am Jaon Editor festhalten wollen. Das wäre vielleicht eine klassische Seite auf der man Sachen ein bisschen freier gestalten möchte

Du kannst browser tabs, Anwendungen oder den gesamten Desktop streamen. Was meinst du mit Vollbild? Schätze schon. Wie testet man Vollbild funktioniert, während man im Vollbild ist. Ich hab gerade keinen zweiten Monitor zur Hand

Okay kann ich ja mal testen. Andere Anwendungen? Dachte der capture geht dann nur im Browser?!

@brindosch
Copy link
Contributor Author

Wir können auch einen anderen CP nehmen. Mir ist das eigentlich egal. Wie ich gesehen habe, wurde der CP jetzt auch archiviert, weil niemand das Projekt übernommen hat.

OT:
Längerfristig werden wir uns wohl auch überlegen müssen, was wir mit unserer UI machen zwecks "Evolution". In welche Abhängigkeiten begibt man sich und welche lässt man lieber sein. Schließlich sollten die Abhängigkeiten das eigene Projekt überleben.

@janpfischer
Copy link
Contributor

Ja, wir sollten nur schauen ob wie da nicht eine etwas freiere Seite machen? Was genau wird denn auf der Remote Seite genau vom JSON Editor durch unser Schema generiert?
Vielleicht kann man das ganze intuitiver gestalten? Evtl. Farbpresets erstellen und auswählen usw usw. Kann man dann ja in der DB zwischenspeichern. Viele möglichkeiten :)

@brindosch
Copy link
Contributor Author

Nutzerfreundlich ist immer gut. Leider sehe ich das erst, wenn ich es sehe.
Gibt keinen Editor auf der Seite, du kannst alles über den Haufen schmeißen.
Die bootstrap buttons mit den bunten Farben tragen nicht unbedingt zu einem "cleanen" look bei.
Beschriftungen auf buttons könnten überflüssig sein. Ein etabliertes icon kann bereits genug aussagen
Ein button der die Farbe ändert, könnte auch durch einen "toggle" ersetzt werden. (Hab da aber schlechte Erinnerungen zu, was bootstrap angeht. Touch war auch komisch meine ich)

Und jetzt das grundsätzliche aber:
Du kommst irgendwann an den Punkt, wo man sich die Frage stellt, ob man nicht direkt ein umfänglicheres Framework einsetzt.

Was zeichnet ein "gutes" Framework aus:

  • Es steht Geld dahinter, es muss finanziert werden. Egal wie. (Tiefer gehende Upgrades in die Zukunft, sonst gammelt der Kern irgendwann oder es herrscht Stillstand)
  • Die grundsätzliche Technik sollte heutigen Standards entsprechen (code/workflow/tooling) (Was morgen ist, weiß man nicht - siehe Geld)
  • Genug UI Komponenten um vieles abzudecken
  • ein SEHR gute Dokumentation mit VIELEN (code) Beispielen (copy and run, anstatt Komponenten syntax ins Detail zu lesen und zusammen zu kloppen (schneller(er) Einstieg) )
  • Die Syntax sollte leicht erlernbar sein
  • Wenn man mit den Komponenten nicht auskommt, sollte man nativen javascript code/html einfach einbinden können. Das Framework sollte niemals das Limit sein.

Das wären so meine Punkte, die ich aus der Erfahrung mit dem webinterface ziehe. Ich fühle den Schmerz, ich hab viel davon geschrieben.

@brindosch brindosch changed the title Feat: Add image sender to webui Feat: Add image sender to webui + Browser screen capture Aug 21, 2019
@brindosch brindosch merged commit 09ee8f2 into hyperion-project:master Aug 21, 2019
@brindosch brindosch deleted the imagefeat branch August 21, 2019 14:25
@Paulchen-Panther
Copy link
Member

Sag mal, warum steht eigentlich auf der remote page 2 sekunden da wenn der capture läuft?

@brindosch
Copy link
Contributor Author

Hast du es getestet? Läufts gut? Mit Opera funktionierts auch - wie ich mittlerweile herausfand. Witzigerweise wird der button auch im mobilen browser angezeigt. Das heißt die API ist grundsätzlich vorhanden, geht aber (noch?) nicht.

Weil COMP_IMAGE eigentlich nicht als image streamer gedacht ist. Timeouts werden in der UI für alle unterdrückt außer COLOR/IMAGE/EFFECT. Ich wollte sicher gehen, dass die prio wieder freigegeben wird auch wenn Netzwerk oder so abbricht. Am Ende ist es eine Designfrage, man könnte auch timeout auf -1 setzen, dann muss man aber clearen.

@Paulchen-Panther
Copy link
Member

Dann blende die 2 sekunden im webUI bitte aus. Danke 👍

@janpfischer
Copy link
Contributor

Ich hab es auch getestet: Läuft super. Konnte sämtliche Inhalte meines Computers freigeben. Auch andere Applikationen oder den ganzen Bildschirm. Wusste gar nicht dass die Browser sowas können.

Hab auch mit meinen beiden Bildschirmen mal die Latenz im Vollbild überprüft. Sieht in Ordnung aus.

@Paulchen-Panther
Copy link
Member

Kann man die Skalierung der Quelle noch beeinflussen?

@janpfischer
Copy link
Contributor

Du meinst wenn ich bspw. mein aufgenommenes Programmfenster größer und kleiner ziehe?

@Paulchen-Panther
Copy link
Member

Nein. Ich meinte mit Skalierung, die Bildgröße (sagen wir FullHD) die von hyperion verarbeitet wird.
Im X11 ist es decimation.

@brindosch
Copy link
Contributor Author

Die API ist ziemlich druckfrisch im Browser. Ist im MDN auch noch als "Working Draft" gekennzeichnet. Könnte also wieder kaputt gehen. Das ist mir aber egal, dafür ist es zu genial.

@Paulchen-Panther
Ich beantrage im Browser width/height/fps, der Browser entscheidet dann aber, was er mir gibt. Du kannst mindestens bis 1080p gehen bei 30fps.
Weil ich allerdings ein png erzeugen muss über ein canvas Element. Ist die performance leider im Keller.
Ich hab keine API gesehen, wie ich da sonst noch rankommen könnte.
Aber ja, man kann viel mehr pixel rausholen - vor dem Start - Ich kann eine 3 Stufen option oder so hinzufügen

Dann blende die 2 sekunden im webUI bitte aus.

Dann sieht du aber auch keinen Countdown mehr bei einem "Bild" mit timeout (Unten bei effects/colors selection)

@Paulchen-Panther
Copy link
Member

Dann sieht du aber auch keinen Countdown mehr bei einem "Bild" mit timeout (Unten bei effects/colors selection)

Und da lässt sich wirklich keine Ausnahme hinzufügen?

@brindosch
Copy link
Contributor Author

brindosch commented Aug 23, 2019

Man könnte in der ui den "Streamer" owner abfangen. Ist aber etwas schmutzig :)
Edit: Ansonsten einen neuen COMP_ Eintrag. Aber die JsonAPI ist ja irgendwie die selbe und das duplizieren wäre auch doof.

@Paulchen-Panther
Copy link
Member

wenn's funktioniert, warum nicht?

@Paulchen-Panther
Copy link
Member

Ach ja, das beenden via X hinter dem Streamer im Remote funzt auch nicht.

@brindosch
Copy link
Contributor Author

Geht schon, du musst halt 10x pro Sekunde das machen :)
Das ist das Dilemma. Ich kann beides ausblenden für diesen Stream oder wir gehen auf eine andere COMP Kennung

@Paulchen-Panther
Copy link
Member

Dann das zweite bitte. 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants