AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bild von IP-Webcam auslesen

Ein Thema von himitsu · begonnen am 1. Okt 2013 · letzter Beitrag vom 8. Apr 2024
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.031 Beiträge
 
Delphi 12 Athens
 
#31

AW: Bild von IP-Webcam auslesen

  Alt 15. Nov 2013, 00:26
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:
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);
Ab der zweiten Zeile fängt der Header an und da steht immer in der 1. Zeile der Statuscode.
HTTP/1.1 200 OK (HTTP-Version Leerzeichen StatusCode Leerzeichen StatusTextBisZeilenende)



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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Nov 2013 um 00:37 Uhr)
  Mit Zitat antworten Zitat
ramboni

Registriert seit: 3. Dez 2012
24 Beiträge
 
Delphi XE Starter
 
#32

AW: Bild von IP-Webcam auslesen

  Alt 15. Nov 2013, 01:12
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.031 Beiträge
 
Delphi 12 Athens
 
#33

AW: Bild von IP-Webcam auslesen

  Alt 15. Nov 2013, 03:00
Joar, gerade bei der einen ErrorMessage war kein Header dabei, obwohl es Einen gibt.

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 )

Delphi-Quellcode:
if ErrorMessage.Length > 2 then
  StatusCode := StrToInt(Copy(ErrorMessage[2], Pos(' ', ErrorMessage[2]) + 1, 3));
[edit]
Anhang nochmal ausgetauscht (09:30 17:22)
Angehängte Dateien
Dateityp: 7z MJpegClient.7z (74,8 KB, 82x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Nov 2013 um 17:23 Uhr) Grund: Fehler berichtigt - siehe Antwort #35
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.031 Beiträge
 
Delphi 12 Athens
 
#34

AW: Bild von IP-Webcam auslesen

  Alt 15. Nov 2013, 09:30
Ich kopiere das mal für Alle hier mit rein.

Zitat von ramboni:
Gibt es ein Event wenn der Benutzername/Passwort falsch sind
bzw. wie kann ich soetwas feststellen?
Ein direktes Event dafür gibt es nicht,
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 von ramboni:
Ich habe eine relativ hohe CPU-Auslastung wenn ich beide Kameras aktiviert habe
bzw. den Stream ca. 5x gleichzeitig öffne. Mach ich da was falsch? Ich habe die Ausgabe
auf einem Image.
Das Dekodieren und Anzeigen der Bilder braucht halt ein bissl Rechenleistung.

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.
Result := (GetTickCount - ReceiveStart) >= 1000; = überspringe das Bild, wenn das letzte Bild vor weniger als einer Sekunde angezeigt wurde.
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 von ramboni:
Du schreibst in deinem Text: " gesendete Anfrage-Header kann angepasst werden"
Kannst du mir sagen wie das geht? Verschlüsselung hört sich interessant an
Die einfachste Verschlüsselung ginge via HTTPS. (in wie weit und ob das jetzt schon möglich ist, weiß ich aber noch nicht)

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ramboni

Registriert seit: 3. Dez 2012
24 Beiträge
 
Delphi XE Starter
 
#35

AW: Bild von IP-Webcam auslesen

  Alt 15. Nov 2013, 16:27
Moin,

bei mir funktioniert:

Delphi-Quellcode:
if ErrorMessage.Length > 2 then
  StatusCode := StrToInt(Copy(ErrorMessage.ValueFromIndex[2], Pos(' ', ErrorMessage.ValueFromIndex[2]) + 1, 3));
leider nicht. Zum einen kennt er ErrorMessage.Length nicht und ValueFromIndex[2] ist leer.

Mit:
Copy(ErrorMessage[2], Pos(' ', ErrorMessage[2]) + 1, 3)) bekomme ich jedoch 401 als String zurück...

Also Danke Danke Danke
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.031 Beiträge
 
Delphi 12 Athens
 
#36

AW: Bild von IP-Webcam auslesen

  Alt 15. Nov 2013, 16:40
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 URL := Trim(ErrorMessage.Value['Location']); die neue URL besorgen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Nov 2013 um 16:48 Uhr)
  Mit Zitat antworten Zitat
Thomasl

Registriert seit: 19. Jun 2006
Ort: Vreden
67 Beiträge
 
Delphi 11 Alexandria
 
#37

AW: Bild von IP-Webcam auslesen

  Alt 16. Nov 2013, 00:20
Ich habe schon ein paar Kameras mit diesem ActiveX eingebunden.
http://www.axis.com/techsup/software/amc/software.php

Hier ist auch ein Video.
http://www.axis.com/de/techsup/cam_s...ev/activex.htm
Thomas Levering
  Mit Zitat antworten Zitat
ramboni

Registriert seit: 3. Dez 2012
24 Beiträge
 
Delphi XE Starter
 
#38

AW: Bild von IP-Webcam auslesen

  Alt 26. Feb 2014, 20:57
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: http://www.zoneminder.com/wiki/index...Link#DCS-5222L

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

Geändert von ramboni (26. Feb 2014 um 21:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.031 Beiträge
 
Delphi 12 Athens
 
#39

AW: Bild von IP-Webcam auslesen

  Alt 27. Feb 2014, 03:07
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 'user:pass@ip' angeben und ins {TMJpegClient}.OnConnecting dann noch Folgendes rein
Delphi-Quellcode:
with (Sender as TMJpegClient).Header do
  if Pos('@', Values['Host']) > 0 then
    Values['Host'] := Copy(Values['Host'], Pos('@', Values['Host']) + 1);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Feb 2014 um 03:18 Uhr)
  Mit Zitat antworten Zitat
ramboni

Registriert seit: 3. Dez 2012
24 Beiträge
 
Delphi XE Starter
 
#40

AW: Bild von IP-Webcam auslesen

  Alt 27. Feb 2014, 12:21
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz