| 

.NET C# Java Javascript Exception

7
Also eine webCam soll im browser dargestellt werden.
Im chrome Browser ist das kein problem, jedoch brauche ich das für firefox.
Das es am cachen liegt, weiß ich und habe auch shcon mehrer Methoden ausprobiert.
Erst habe ich in meinem HTML code, die meta tags hinzugefügt:
<head>
<meta http-equiv="expires" content="0" />
<meta http-equiv="Cache-Control" CONTENT="no-cache" />
<meta http-equiv="Pragma" CONTENT="no-cache" />
</head>

Somit hat ich kein stehendes Bild mehr, sondern es hat sich bewegt, jedoch immer nur sehr langsam und mit weißen strichen, weil das bild meist noch nicht fertig geladen war.
Jetzt habe ich es so gemacht, dass das bild immer nur gezeigt wird, wenn es auch wirklich fertig geladen wird und dann wird es aufs canvas gezeichnet:
<canvas id="live">
<script type="text/javascript">
var i =0;
function Animation () {
var img = new Image();
img.src = "http://192.168.89.62/dms/";
img.onload = function() {
i++;
document.title = i;
document.getElementById("live").height = img.height;
document.getElementById("live").width = img.width;
var liveImg = document.getElementById("live").getContext("2d");
liveImg.drawImage(img, 0, 0);
}
};
Animation();
window.setInterval('Animation()', 100);
</script>

So jetzt flackert es auch nicht mehr so, sondern wird wirklich immer nur angezeigt,wenn es fertig geladen wird. Das i habe ich nur rein gemacht, um zu prüfen, ob die Methode auch wirklich immer aufgerufen wird.
Jetzt kommen wir zum eigentlichen PROBLEM:

Das ganze funktioniert NUR wenn ich den HTML code(webcam) zwei mal im Browser geöffnet habe!(egal ob in zwei firefox browsers oder in einem browser aber zwei tabs)
Schließe ich ein Tab oder ein Browser(mit der webcam(bzw.HTML code)), wird es sofort wieder zu einem stehenden Bild, das i zählt aber weiter, also es geht in die funktion rein!
Ich verstehe es einfach nicht wieso?!und brauch dringend hilfe! ICh hoffe es war verständlich.
News:
15.11.2012
tanzverfuehrung 147 8
2 Antworten
1
Ist jetzt nur eine Vermutung, aber möglicherweise interessiert sich das verbaute JavaScript für das

<meta http-equiv="expires" content="0" />
<meta http-equiv="Cache-Control" CONTENT="no-cache" />
<meta http-equiv="Pragma" CONTENT="no-cache" />

im head-Bereich nur beim Laden der Seite aber nicht bei Reload des Bildes.
Das heißt in dem Moment wo Du zwei Tabs offen hast, überschreiben die das Bild im Cache gegenseitig und erzeugen somit den Refresh-Effekt, sobald Du nur eins auf hast, wird das Bild nicht mehr aktualisiert.
Vielleicht gehts mit einem Konstrukt wie z.B.

x = Math.random();
img.src = "http://192.168.89.62/dms/?x=" + x;

Wie gesagt, ist nur eine Idee, weil bei solchen Effekten eigentlich Cachingprobleme die häufigste Ursache sind.
15.11.2012
lunatigs 1,3k 2 8
also erstmal danke aber das ding ist das ich genau das am anfang hatte

var msUTC = new Date().getTime();
var url = 'http://192.168.89.61:8008?nocache='+msUTC;

und daraus eine konstante url machen sollte, da sonst immer ein 404 error kam.
tanzverfuehrung 15.11.2012
var url = 'http://192.168.89.61:8008/?nocache='+msUTC; ... also mit / nach dem Port tuts auch nicht? Ansonsten wärs hilfreich zu wissen, was überhaupt dahintersteht. Ist das ein Script das Dir das Bild liefert, daß Du selbst geschrieben hast? Wo wird das Bild gespeichert? ...
lunatigs 15.11.2012
"Die vom Generic-Webcam-Treiber generierte URL zur Bildabfrage, wird von einer bestimmten Camera mit einem HTTP-404-Status beantwortet. Das Problem ist das die Kamera den Nocache-Query-Teil der URL als Teil des Path betrachtet. Eigentlich muss die Kamera die für sie unbekannte Query ignorieren."
tanzverfuehrung 22.11.2012
und das Bild wird nicht gespeichert nur angezeigt
tanzverfuehrung 22.11.2012
1
Ok, dann einen zweiten Lösungsansatz:
Wenn der Browser als das Bild cached und die Source-URL den refresh-Trick mit ?x=timestamp nicht zulässt, kommt man wohl nicht drum rum, einen "Mittelsmann" einzubauen, der eben nicht cached. Ich hoffe Du nutzt PHP dann könntest Du ein Konstrukt mit cURL verwenden wie dieses:
(Die ganzen curl_setopt Optionen findest Du hier function.curl-setopt.php)

image.php
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://192.168.89.62:8008/');
curl_setopt($ch, CURLOPT_HEADER, FALSE); //um den Header aus der Ausgabe zu entfernen.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //um den Tranfer als String zurückzuliefern, anstatt ihn direkt auszugeben.
//eventuell braucht man BINARYTRANSFER, sollte aber eigentlich nicht nötig sein
//curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE); //um die unbearbeiteten Daten zurüchzugeben wenn CURLOPT_RETURNTRANSFER gesetzt ist.
curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE); //um den expliziten Aufbau einer neuen Verbindung zu erzwingen, anstatt auf eine gecachte zurückzugreifen.
curl_setopt($ch, CURLOPT_FORBID_REUSE, TRUE); //um die Verbindung nach der Verarbeitung explizit zu schließen, so daß sie nicht wiederverwendet werden kann.
$rawimg = curl_exec($ch);
curl_close($ch);
$new_image = imagecreatefromstring($rawimg);
unset($rawimg);
$width = imagesx($new_image);
$height = imagesy($new_image);
$final_image = imagecreatetruecolor($width, $height);
imagecopy($final_image, $new_image, 0, 0, 0, 0, $width, $height);
imagedestroy($new_image);
header('Content-Type: image/jpeg');
imagejpeg($final_image);
imagedestroy($final_image);
?>

Eventuell funktioniert der Code nicht auf anhieb, weil ich ihn nicht getestet hab. Sofern ich keinen Denkfehler gemacht hab, sollte es aber klappen. Hab versucht möglichst alle Funktionen im Code auch zu verlinken, damit Du ggf. nochmal nachgucken kannst.
In Deinem JavaScript würdest Du dann eben nicht mehr die UrsprungsURL aufrufen, sondern die image.php

var msUTC = new Date().getTime();
var url = 'http://<lokale_url>/image.php?nocache='+msUTC;

Setzt natürlich voraus, daß auf 192.168.89.* ein Webserver läuft, der das dann ausführen kann.

Eventuell gehts auch deutlich einfacher mit jQuery

$.ajax({
type: "get",
url: "http://192.168.89.62:8008/",
cache: false,
success: function(rawimage) {
$("#webcam_image").attr('src',rawimage);
}
});

Wobei auch das nur eine ungetestete Idee ist. Aber vielleicht führt Dich ja eine der beiden Ideen zum Ziel.
23.11.2012
lunatigs 1,3k 2 8
lunatigs 1,3k 2 8
ich danke dir für deine mühe aber leider nutze ich nicht php ...:(
das problem war ja immer nur bei einer bestimmten kamera.Aber uns jetzt entschlossen, diese nicht mehr zu nutzen
XD
tanzverfuehrung 07.01.2013

Stelle deine Firefox-Frage jetzt!