Mair1 LiveCam Viewer Programmcode

Hier ist der (bereits angekündigte) Programmcode zum Mair1 LiveCam Viewer. Das Programm ist in C# geschrieben und unter CC-Lizenz (Nicht-Kommerziell, Namensnennung) erhältlich.

LiveCam Viewer Funktionen

Als Hauptaufgabe hat der LiveCam Viewer natürlich, den Webcam-Stream der Mair1 Kamera auf den Bildschirm zu bringen. Nach kurzem Besuch der offiziellen Seite fällt schnell auf: Der „Stream“ ist einfach eine Sequenz von JPEG Bildern, das aktuellste Bild wird immer unter der gleichen Adresse abgelegt, das Bild wurde dieses mal alle ~21 Sekunden aktualisiert.

Damit das Programm auch nächstes Jahr wieder eingesetzt werden kann, kann die URL, unter der das Bild verfügbar ist, geändert werden, sowie der Intervall, in dem aktualisiert wird.
Außerdem kann man auch alle Bilder lokal speichern, um sie immer wieder ansehen zu können. Das ganze kann man dann z.B. als Zeitraffer-Video zusammenfügen, das Resultat seht ihr hier.

Hier ist der Hauptteil des Programms:

//Start
private void button2_Click(object sender, EventArgs e)
{
	start = !start;
	if (start)
	{
		if (savefiles && !Directory.Exists(textBox1.Text))
		{
			MessageBox.Show("Bitte einen Ort zum Speichern der Bilder angeben.");
			return;
		}

		if (savefiles && !textBox1.Text.EndsWith("\\"))  //Auf abschließenden Backslash prüfen
			textBox1.Text += "\\";          //und ggf. anhängen

		if (otherurl && !String.IsNullOrEmpty(textBox2.Text))
			download = new Uri(textBox2.Text);

		button2.Text = "STOP";
		textBox1.Enabled = false;                                   //Speicherpfadauswahl deaktivieren
		button1.Enabled = false;                                    //Speicherpfad-Dialog deaktivieren
		numericUpDown1.Enabled = false;                             //Intervallauswahl deaktivieren
		checkBox1.Enabled = false;                                  //DoppelteLöschen check deaktivieren
		t.Interval = Convert.ToInt32(numericUpDown1.Value) * 1000;  //Interval festlegen
		checkdup = checkBox1.Checked;                               //DoppelteLöschen festlegen

		if (savefiles)
			savepath = textBox1.Text;                               //Speicherpfad festlegen
		else
		{
			savepath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\m1oaCAM\\";
			if (!Directory.Exists(savepath))
				Directory.CreateDirectory(savepath);
		}

		t.Start();                                                  //Timer Starten
		download_picture();                                         //Erstes Bild sofort laden
	}
	else
	{
		button2.Text = "START";
		t.Stop();                               //Timer Stoppen
		textBox1.Enabled = checkBox2.Checked;   //Speicherpfadauswahl aktivieren
		button1.Enabled = checkBox2.Checked;    //Speicherpfad-Dialog aktivieren
		numericUpDown1.Enabled = true;          //Intervallauswahl aktivieren
		checkBox1.Enabled = checkBox2.Checked;  //DoppelteLöschen check aktivieren
	}
}

//Download Trigger
void t_Tick(object sender, EventArgs e)
{
	if (start)
		download_picture();
}

//Download
void download_picture()
{
	if (start)
	{
		try
		{
			WebClient wc = new WebClient();
			string now = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");
			string filename = savepath + now + ".jpg";
			wc.DownloadFileCompleted += new AsyncCompletedEventHandler(wc_DownloadFileCompleted);
			DownloadState dlst = new DownloadState() { FILENAME = filename, CHECKDUPLICATE = checkdup, SAVE = savefiles };
			if (File.Exists(lastfile))
				dlst.LASTFILE = lastfile;

			wc.DownloadFileAsync(download, filename, dlst);
		}
		catch (Exception ex)
		{
			label2.Text = ex.Message;
		}
	}
}

button2_Click() wird ausgeführt, wenn man auf START klickt. Hierdurch wird das Empfangen der Bilder gestartet oder gestoppt.
Wird es gestartet, werden zunächst die nötigen Parameter festgelegt, einige Teile des UI werden deaktiviert, danach wird ein Timer gestartet, der im festgelegten Intervall die Methode zum Herunterladen den Bildes aufruft.
Der Download des Bildes erfolgt asynchron, also in einem neuen Thread. Ist der Download beendet, wird das DownloadFileCompleted Event ausgelöst.
Damit wir das Bild speichern können, wird unsere wc_DownloadFileCompleted Methode ausgeführt, wenn DownloadFileCompleted eintritt.
Hier werden alle Aktionen getätigt, die nach dem Download getätigt werden, also:
Entscheiden, ob das Bild permanent gespeichert werden soll, oder nur im Fenster angezeigt wird
Bei Speicherung: Prüfen, ob das Bild schon existiert (falls „doppelte Bilder löschen“ aktiviert)
UI updates

//File-Check etc.
void wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
	if (start)
	{
		DownloadState dl = e.UserState as DownloadState;
		if (!dl.SAVE)
		{
			try
			{
				PicBoxUpdate(dl.FILENAME);
				if (File.Exists(dl.LASTFILE))
					File.Delete(dl.LASTFILE);
				lastfile = dl.FILENAME;
			}
			catch (Exception ex)
			{
				LabelUpdate(ex.Message);
			}

			return;
		}

		bool same = false;
		try
		{
			if (dl.CHECKDUPLICATE && File.Exists(dl.FILENAME) && File.Exists(dl.LASTFILE))
			{
				FileStream fsnew = File.OpenRead(dl.FILENAME);
				FileStream fsold = File.OpenRead(dl.LASTFILE);
				if (fsnew.Length == fsold.Length)
				{
					MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
					byte[] newhash = md5.ComputeHash(fsnew);
					byte[] oldhash = md5.ComputeHash(fsold);
					md5.Clear();
					if (Encoding.Default.GetString(newhash) == Encoding.Default.GetString(oldhash))
						same = true;
				}
				fsnew.Close();
				fsold.Close();
			}

			if (same)
			{
				File.Delete(dl.FILENAME);
				LabelUpdate(dl.FILENAME + " wurde gelöscht");
			}
			else
			{
				LabelUpdate(dl.FILENAME + " wurde gespeichert.");
				PicBoxUpdate(dl.FILENAME);
				lastfile = dl.FILENAME;
			}
		}
		catch (Exception ex)
		{
			LabelUpdate(ex.Message);
		}
	}
}

Das ist der Kern der Anwendung. Bild herunterladen, je nach Einstellung Speichern, Anzeigen, Löschen. Alles andere sind UI Interaktionen oder Hilfsmethoden (Status-Label update etc.)
Der volle Sourcecode ist wie immer auf MediaFire erhältlich.

Zum Testen habe ich den Code auch auf GitHub erhältlich gemacht.

Viel Spaß mit dem LiveCamViewer, hinterlasst mir bei Gelegenheit einen Kommentar.

MfG
Damon

Dieser Eintrag wurde veröffentlicht in C# und getagged .
Bookmarken: Permanent-Link Schreibe einen Kommentar oder hinterlasse einen Trackback: Trackback-URL.
Achtung: Wordpress interpretiert bestimmte Zeichenfolgen als Markup und verändert diese. Nutzt für Programmcode lieber Gist oder PasteBin-Services und verlinkt die Code-Schnipsel.

Post a Comment

Sie müssen angemeldet sein, um kommentieren zu können.