Forum: PC-Programmierung Bild von IP-Kamera abgreifen


von Frank (Gast)


Lesenswert?

Ist bitte mal jemand so freundlich und prüft, warum dieser eigentlich 
simpelst abgesicherte Code trotzdem hin und wieder (ca. 10% der Aufrufe) 
ein nicht darstellbares Bild produziert? Der Browser meint dann 
sinngemäß, die Grafik könne nicht dargestellt werden, weil sie Fehler 
enthalte. Ich weiss, dass der Code nicht gegen eine Endlosschleife 
angesichert ist, kommt noch. Der Fehler, den ich meine, kommt, wenn er 
kommt, sofort.
1
  
2
<?php
3
4
 $err=true;
5
   
6
    while ($err)
7
    {
8
   
9
        $dat = file_get_contents('http://admin:passw@192.168.200.101/snapshot.cgi');
10
        if ($dat)
11
        { 
12
            $img = imagecreatefromstring($dat);
13
            if ($img)
14
            { $err=false;
15
              header('Content-Type: image/jpeg');
16
              imagejpeg($img);
17
              imagedestroy($img);}
18
              else {usleep(200);}
19
        }
20
        else {usleep(200);}
21
    }
22
?>
Das würde ja bedeuten, dass man sich auf $img = 
imagecreatefromstring($dat); if ($img) ... nicht verlassen kann ... ?

von Peter II (Gast)


Lesenswert?

warum analysierst du das fehlerhafte Bild nicht einfach mal.

Am besten $dat jeweils mal in eine Datei schreiben, wenn der Fehler 
auftritt mal schauen was drin steht.

von Frank (Gast)


Lesenswert?

Habe ich ja gemacht Ein JPEG, das in Ordung ist, beginnt mit dem Byte 
255 und endet mit einer 217. Die fehlerhaften Bilder sind immer am Ende 
unvollständig.

AABER: Sollte das nicht eigentlich die Bildfunktion von PHP leisten? 
Dass ich da irgend einen Würg-Arround brauche ist mir schon klar ...

von Peter II (Gast)


Lesenswert?

Frank schrieb:
> Habe ich ja gemacht Ein JPEG, das in Ordung ist, beginnt mit dem Byte
> 255 und endet mit einer 217. Die fehlerhaften Bilder sind immer am Ende
> unvollständig.
>
> AABER: Sollte das nicht eigentlich die Bildfunktion von PHP leisten?

welches Bild ist defekt das was php generiert oder das was von der 
Kamera kommt?

von Frank (Gast)


Lesenswert?

Peter II schrieb:
> welches Bild ist defekt das was php generiert oder das was von der
> Kamera kommt?

Wenn ich das snapshot.cgi direkt mit dem Browser aufrufe, habe ich noch 
keinen Defekt provozieren können, also muss es wohl an PHP liegen, oder?

Aber ich prüfe doch, ob Daten geliefert wurden ($dat ist true) und ich 
prüfe, ob ein Bild generiert wurde ($img ist true). Wenn nicht fordere 
ich in der While-Schleife nach einer kurzen Pause neue Daten. Aber 
anscheinend ergeben beide Prüfungen ab und zu true, obwohl das Bild 
fehlerhaft ist.

Ich habe mir auch noch eine Prüfung auf das erste und letzte Zeichen 
(255 und 217) eingebaut, auch die verbessert die "Ausbeute" nur etwas, 
es gibt aber immer noch fehlerhafte Bilder ...

von Peter II (Gast)


Lesenswert?

man könnte mal versuchen die größe vom Bild abzufragen.

Aber das wichtigste ist doch erstmals dir Ursache zu finden. Also 
erstmal festellen ob in $dat immer ein sinnvoller Inhalt vorhanden ist.

von Frank (Gast)


Lesenswert?

Peter II schrieb:
> man könnte mal versuchen die größe vom Bild abzufragen.
>
> Aber das wichtigste ist doch erstmals dir Ursache zu finden. Also
> erstmal festellen ob in $dat immer ein sinnvoller Inhalt vorhanden ist.

Dateigröße hat nicht viel Sinn, die ist bei JPEG vom Inhalt abhängig 
(inkl. Rauschen) und damit immer anders. Aber ich sehe mal nach, ob es 
möglich ist, die Pixel-Größen in X und Y abzufragen ...

von Frank (Gast)


Lesenswert?

Das Problem hatsich geklärt, Schuld war die Funktion 
imgecreatefromstring.

Die gibt bei korrupten Bilddaten nicht nur ein False aus, sondern 
zusätzlich eine Fehlermeldung. Dieser Text, mit Image-Haedern versehen, 
provoziert den Browser zur seiner Fehlermeldung. Durch ein 
vorangestelltes "@" wurde das unterbunden ...

von Peter II (Gast)


Lesenswert?

Frank schrieb:
> Dateigröße hat nicht viel Sinn, die ist bei JPEG vom Inhalt abhängig
> (inkl. Rauschen) und damit immer anders.

ich meinte auch nicht die Dateigröße sondern die Bildgröße also länge 
und breite.

Aber Problem ist ja schon gelöst

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.