Ich habe fortlaufende jpeg bilder die ich an einen browser streamen
will. Kann mir jemand erklären welche header und was noch da gesendet
werden muss?
Ich kenne den esp32-webcam code. Dieser läuft aber mit httpd und nicht
mit dem esp32 <WebServer.h>. Und ich kapier das multipart zeugs nicht.
Einzelbilder läuft
Erstmal schauen, ob dein Browser das überhaupt noch unterstützt.
Chromium, die OpenSource-Basis von Chrome, wollte das schon vor über 10
Jahren aus dem Browser schmeißen:
https://issues.chromium.org/issues/41017445
Firefox könnte das vielleicht noch...
Nachtrag: Chrome kann das noch, wenn du den Bilder-Stream nicht toplevel
aufmachst, sondern z.B. in einem img-tag als src angibst.
Grund is httpd erlaubt mir keine UDP kommunikation nebenher zu fahren.
Eine beschreibung unterschied send - sendContent - sendHeader habe ich
nicht gefunden.
Man kann das Auffrischen eines Bildes (erneutes Abrufen), ohne die ganze
Seite neu zu laden, auch per Javascript (eingebettet in die Webseite)
vom Browser machen lassen ...
JA! Läuft. Bild über http-streaming, fernsteuerung über UDP. Alles auf
einem ESP32.
Kater lässt sich durch die RC karre nicht mehr stören :o)
Das ohr, das war eine elster.
Hadmut F. schrieb:> Das Ohr, das war eine Elster.
Das sieht aber eher aus wie mit einer Schere schön gerade abgeschnitten.
Eltern haben normalerweise keine Zähne!
Schön dass es läuft. Du umgehst halt die Webserver-Klasse komplett und
machst alles zu Fuß selber. Kann man machen.
Zwei Anmerkungen:
UDP Parallel dazu geht so auch nicht, das war doch der Grund für die
ganze Übung?
Du steckst immer in der "while connected" Schleife fest.
und:
> s_server.sendContent(...
Das Senden direkt auf dem s_server fliegt in einer der nächsten
Versionen des ESP32-Arduino-Frameworks raus. War nie klar definiert, auf
welcher Verbindung (oder ob auf Allen) das senden sollte.
Besser: mach die Ausgaben auf "wfc", dafür ist das da, und damit ist
auch klar welche Verbindung welche Daten erhält.
Und statt sendContent(String(fb->buf, fb->len)) gäb's wfc.write(const
uint8_t *buf, size_t size) das kommt ohne Kopieren des Framebuffers in
einen String aus, sondern kann direkt auf dem fb arbeiten.
Εrnst B. schrieb:> UDP Parallel dazu geht so auch nicht, das war doch der Grund für die> ganze Übung?
Da läuft der bildserver auf port 81, der normale server auf port 80 und
udp auf port 5005. Kein problem.
Die version mit #include <WebServer.h> hat den vorteil dass arduino OTA
läuft. Das habe ich bei "esp_http_server.h / httpd" und "<WiFi.h> /
WiFiServer server(80);" nicht hingebracht.
> Du steckst immer in der "while connected" Schleife fest.
Das muss so sein. Den loop kann man auseinander nehmen und dazwischen
anderes machen. Der muss nicht im handler code sein. Das ist test-code!
> Besser: mach die Ausgaben auf "wfc", dafür ist das da, und damit ist> auch klar welche Verbindung welche Daten erhält.
Ich habe gestern erstmals etwas von "wfc" gehört. etwas geduld bitte!
> Und statt sendContent(String(fb->buf, fb->len)) gäb's wfc.write(const> uint8_t *buf, size_t size) das kommt ohne Kopieren des Framebuffers in> einen String aus, sondern kann direkt auf dem fb arbeiten.
Werde ich anschauen. TY
Edit:
Εrnst B. schrieb:
> UDP Parallel dazu geht so auch nicht,
Du hast recht.
Müsste den udp-code aus dem stream handler aufrufen. Hässlich.
Die frage ist wie mache ich OTA mit WiFiClient.h ?
Hadmut F. schrieb:> Ich habe gestern erstmals etwas von "wfc" gehört. etwas geduld bitte!Hadmut F. schrieb:> WiFiClient wfc = s_server.client();
den meinte ich :)
Εrnst B. schrieb:> den meinte ich :)
Schon klar. Der ist von gestern :)
Wo ist eigentlich der dispatcher von WiFiClient auf die verschiedenen
WebServer.h server.on("/", handler); zu finden?
Den http decoder von WiFiClient.read() meine ich.
Hadmut F. schrieb:> Wo ist eigentlich der dispatcher von WiFiClient auf die verschiedenen> WebServer.h server.on("/", handler); zu finden?
Der Webserver hat eine Linked List der Handler, die "on()"-Methoden
hängen da einen Eintrag an.
In Parsing.cpp (WebServer::_parseRequest) läuft er, nachdem die
Request-Header geparst sind, über die Liste, nimmt sich den ersten
Handler der sich zuständig fühlt: