![]() |
AW: Bild von IP-Webcam auslesen
Du bekommst im OnError (ErrorMessage) und vorher auch nochmal im OnConnected (ReceivedHeader) den HTTP-Header geliefert, wo du diesen Statuscode auslesen kannst.
Falls ich mich jetzt nicht vertan hab, sähe 'ne Billigvariante für OnError mit ErrorCode=TMJpegClient.eFAILURE so aus:
Delphi-Quellcode:
Ab der zweiten Zeile fängt der Header an und da steht immer in der 1. Zeile der Statuscode.
i := Pos(sLineBreak, ErrorMessage); // bzw. 'HTTP/' statt sLineBreak
i := PosEx(' ', ErrorMessage, i); StatusCode := Copy(ErrorMessage, i + 1, 3); StatusCode := Copy(ErrorMessage, PosEx(' ', ErrorMessage, Pos(sLineBreak, ErrorMessage)) + 1, 3);
Delphi-Quellcode:
(HTTP-Version Leerzeichen StatusCode Leerzeichen StatusTextBisZeilenende)
HTTP/1.1 200 OK
Bestimmt wäre es möglich diese Fehlernachrichten direkt als TStrings anstatt String an diese Events zu übergeben, dann wäre Auswerten etwas einfacher. [edit] Als TStrings hätte es denn Vorteil, daß der RequestHeader immer an der selben Stelle (Index) anfangen könnte, da einzeilne Zeilen Strings auch Zeilenumbrüche enthalten können. |
AW: Bild von IP-Webcam auslesen
Bei
.Connected(Sender: TObject; ReceivedHeader: TStrings); bekomme ich mit ReceivedHeader.Text in der ersten Zeile: HTTP/1.1 401 Unauthorized Was super ist. Allerdings bekomme ich bei .Error(Sender: TObject; ErrorCode: HRESULT; ErrorMessage: string); <HTML><HEAD><TITLE>401 Unauthorized</TITLE></HEAD> <BODY BGCOLOR="#cc9999"><H4>401 Unauthorized</H4> Authorization required. </BODY></HTML> Das sieht irgendwie nicht nach einem Header aus, oder? Hier wäre "HTTP/1.1 401 Unauthorized" cool Oder muss da was von HTML stehen? LG |
AW: Bild von IP-Webcam auslesen
Liste der Anhänge anzeigen (Anzahl: 2)
Joar, gerade bei der einen ErrorMessage war kein Header dabei, obwohl es Einen gibt. :angle2:
NWar nur der Fehlertext, den der Server ausgibt, der natürlich sonstwie aussehen kann ... angefangen bei einem einfachen Text, wo "401 Unauthorized" steht, bis zu einer mehr oder weniger aufwändigen HTML-Seite. (der Witz ist, jetzt wenn ich drüber nachdenke, dann hatte ich an der Stelle den Header auch noch absichtlich weggelassen :lol:)
Delphi-Quellcode:
[edit]
if ErrorMessage.Length > 2 then
StatusCode := StrToInt(Copy(ErrorMessage[2], Pos(' ', ErrorMessage[2]) + 1, 3)); Anhang nochmal ausgetauscht (09:30 17:22) |
AW: Bild von IP-Webcam auslesen
Ich kopiere das mal für Alle hier mit rein.
Zitat:
aber da die Kamera in diesem Fall die Verbindung verweigern sollte, kommt natürlich bei OnError eine entsprechende Meldung an, jenachdem wie der Server in der Kamera darauf reagiert und was/ob er dann zurückgibt. Zitat:
Man könnte die Streamverarbeitung ausbremsen, indem man z.B. ein Sleep nach jedem Bild einfügt. z.B. siehe Max FPS in MJpegTest_OnImage, MJpegTest_OnData Aber einige Kameras scheinen das nicht ganz zu mögen und trennen irgendwann die Verbindung (womöglich Überlauf des Sendepuffers). Bzw. dabei könnte das Video mehr oder weniger verzögert sein. Man kann auch versuchen die Bearbeitung der Bilder anders zu lösen. - Also bei OnDataReceived einsteigen und den Stream in eine andere/schnellere JPEG-Komponente einlesen. - Und/oder die Ausgabe/Darstellung anders lösen? Oder man könnte über OnPreReceived dafür sorgen, das garnicht erst alle empfangenen Bilder verarbeitet werden.
Delphi-Quellcode:
= überspringe das Bild, wenn das letzte Bild vor weniger als einer Sekunde angezeigt wurde.
Result := (GetTickCount - ReceiveStart) >= 1000;
Damit würde der Datenstrom zur Kamera nicht beeinflusst. Man kann ja gern versuchen da auch nochmal ein kleines Sleep reinzumachen, um zusätzlich nochmal den Traffic zu beschränken. Zitat:
In OnConnecting kannst du den RequestHeader bearbeiten, bevor er zur Kamera gesendet wird. Da könnte man z.B. eine Komprimierung oder eben Verschlüsselung aktivieren, indem man die passenden Werte im Header übergibt. Es kommt aber alles darauf an, was die Kamera für Funktionen anbietet, denn die muß da ja mitmachen. Und über OnReceiveDebug kommt man an TTCPClient.OnReceive und TTCPClient.OnSend ran, wo man dann die empfangenen/gesendeten Daten komprimieren/dekomprimieren/verschlüsseln/entschlüsseln. |
AW: Bild von IP-Webcam auslesen
Moin,
bei mir funktioniert:
Delphi-Quellcode:
leider nicht. Zum einen kennt er ErrorMessage.Length nicht und ValueFromIndex[2] ist leer.
if ErrorMessage.Length > 2 then
StatusCode := StrToInt(Copy(ErrorMessage.ValueFromIndex[2], Pos(' ', ErrorMessage.ValueFromIndex[2]) + 1, 3)); Mit:
Delphi-Quellcode:
bekomme ich jedoch 401 als String zurück...
Copy(ErrorMessage[2], Pos(' ', ErrorMessage[2]) + 1, 3))
Also Danke Danke Danke :) |
AW: Bild von IP-Webcam auslesen
Was steht denn insgesamt in ErrorMessage / ErrorMessage.Text drin?
Wenn ich mich nirgendwo verzählt hab, dann sollte in [0] ein Text passend zum ErrorCode stehen, in [1] eine Zusatzinfo, wie z.B. das übersetzte GetLastError und ab [2], falls vorhanden, der empfangene HTTP-Header. [edit] Stimmt, die erste Zeile vom HTTP-Header ist noch anders formatiert. Dein zweiter Code ist also richtig. Bei den 3xx-StatusCodes könnte man sich mit
Delphi-Quellcode:
die neue URL besorgen.
URL := Trim(ErrorMessage.Value['Location']);
|
AW: Bild von IP-Webcam auslesen
Ich habe schon ein paar Kameras mit diesem ActiveX eingebunden.
![]() Hier ist auch ein Video. ![]() |
AW: Bild von IP-Webcam auslesen
Moin Moin,
ist ja schon einige Zeit her als ich was geschrieben hatte. "Damals" mit meiner alten Cam hat auch alles wunderbar funktioniert. Ich habe die Daten einfach so übergeben: IP_Adresse/videostream.cgi?user=USERNAME&pwd=PASSWORT Hat super funktioniert. Nun habe ich eine neue IP-Kamera und siehe da, nüscht geht mehr :( Es ist eine DCS-5222L und laut: ![]() Muss die Auth so aussehen: HTTP Source Type: Remote Remote Host Name: user:pass@<IP Address of Camera> Remote Host Port: 80 (Default) Remote Host Path: /video/mjpg.cgi (for mjpeg stream) Remote Host Path: /image/jpeg.cgi (for jpeg stream) Was im Browser wunderbar funktioniert. Ich habe also den Path geändert, aber mit dem Benutzernamen & Psw VOR der IP kommt die Komponente irgendwie nicht klar. Ich bekomme immer Benutzername Passwort falsch zurück :( Oder habe ich, was sehr viel wahrscheinlicher ist, einen Fehler gemacht? BTW: Bei den vielen Pathangaben die es so gibt, besteht da nicht die möglichkeit die Kamera zu fragen wo ihre URL zum Video ist? So das ich nicht für jede Cam testen muss? ContaCam z.B. macht das auch irgendwie alles automatisch. LG |
AW: Bild von IP-Webcam auslesen
Womit hat du es denn probiert?
Bei der MJpegClient.pas (aktuellster Download im Post #33) könntest du es mal so probieren: Als Host dein
Delphi-Quellcode:
angeben und ins
'user:pass@ip'
Delphi-Quellcode:
dann noch Folgendes rein
{TMJpegClient}.OnConnecting
Delphi-Quellcode:
with (Sender as TMJpegClient).Header do
if Pos('@', Values['Host']) > 0 then Values['Host'] := Copy(Values['Host'], Pos('@', Values['Host']) + 1); |
AW: Bild von IP-Webcam auslesen
Vielen Dank, ich werde es heute Abend versuchen.
Gibt es einen Standard der sagt das jede Cam auf eine bestimmte Weise reagieren muss? Ich möchte nur ungern den Code für jede Cam anpassen müssen. Bis jetzt suche ich mir die Daten zum Videopath noch per Hand raus, und der ist schon bei dem Cams recht unterschiedlich. Steht da nicht in irgendeiner Datei drin wo das Video her kommt, so das ich das automatisieren kann? LG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz