Enregistrement flux video pour camera ip

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 565 fois - Téléchargée 15 fois

Contenu du snippet

Le programme enregistre un flux video au format asf en provenance d'une camera IP de surveillance en cas de déclenchement d'une alarme. Le programme utilise les API du serveur embarqué de la camera. On peut géré jusqu'à 5 cameras

Source / Exemple :


// Video stream recording from IP camera in case of alarm
//
//        Copyright (C) 2011  Jean Francois Quinet
//
//    This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
// This Class manages all the threads for cameras defined in params
// one camera is defined by the IP address and the port number separated by :
// up to 5 cameras are supported
// 
//
// The main thread launchs one thread per camera and wait for one connection on port 8089 
// To stop all threads connect via telnet on this port and send the word: stop
//
// The child thread start with the Status method which checks the alarm status and calls
// the StreamRecord method in case of alarm. The file is sized to keep about one minutes of
// video stream 
//
// The file camera.log keeps a trace of major events 
// 
// adapt user id and password for access camera to your needs
//
import java.io.*;
import java.net.*; 
import java.net.Socket;
import java.util.logging.FileHandler;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import java.util.Date;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.PrintWriter;

public class Camera_Record
{
	  static String camera;
	  static long attente;
	  static int alarm;
	  static String camid;
	  static int i;	
	  static String cam[];
	  
	  public static void main (String args[] ) 
	  {
		
		// open socket serveur
		ServerSocket socserv=null;
		WriteLog.W_log("Camera main thread initialised");
		try
		{
		int listport=8089;
		int maxcon=2;
		
		socserv = new ServerSocket(listport,maxcon);
		}
		catch (IOException e)
			{
			WriteLog.W_log("open socket server error : " + e);
			}

		// Check command line paramaters 
	
		if (args.length < 1 | args.length > 5 ) 
		{ 
			WriteLog.W_log("Invalid number of paramaters");
			System.exit(1);
		} 
		else 
		{
		// Check for existence of : in paramater 

		int nbArgs = args.length;
		cam = args;
			
		Thread[] st=new Thread[5];
		for (i=0; i<nbArgs; i++)
			{
			
			if (args[i].indexOf(":") == -1)
				{
				WriteLog.W_log("Invalid paramater : syntax ip address:port number");
				}
			st[i] = new Thread()
				{
				public void run()
					{
					int j = i-1;
					Status(cam[j],3000l);
					}
				};
			st[i].setName("status"+i);
			st[i].start();
			}
		}
		StringBuffer stop = new StringBuffer("start");
		while (stop.toString().equals("start"))
			{
			Socket clisoc = null;
			try
				{
				// accept connection from client
				clisoc = socserv.accept();
				BufferedReader inclisoc = new BufferedReader(
									   new InputStreamReader(clisoc.getInputStream()));
				int l = stop.length();
				stop.delete(0,l);
				int n;
				String lineclisoc = " ";
				lineclisoc = inclisoc.readLine();
				stop.append(lineclisoc);
				if (stop.toString().equals("stop"))
					{ // if client send stop close connection and end all threads 
						inclisoc.close();
						clisoc.close();
						socserv.close();
						WriteLog.W_log("stop command received");
						System.exit(0);  
					}
					else
					{ // else close connection and wait for a new one
						inclisoc.close();
						clisoc.close();
						WriteLog.W_log("wrong command received: " + stop);
						l = stop.length();
						stop.replace(0,l,"start");
					}
				}
			catch (SocketException e )
		  		{
					WriteLog.W_log("Server Socket error : " + e);
				}
	  		catch (IOException e )
		  		{
					WriteLog.W_log("Server I/O error : " + e);
		  		} 
			}
		
	   }
	  public static void Status (String camera, long attente) 
		{
		
		String host = camera.substring(0, camera.indexOf(":") ); 
		String portnb = camera.substring(camera.indexOf(":") +1, camera.length());
		int port = (Integer.valueOf(portnb)).intValue();
	
	 	while (true)   // infinite loop
		{	
		try
	  		{
			
			// Create a connection to server Socket
			Socket s = new Socket(host, port);
				 	
			// Create input and output streams to socket 
	
		  	BufferedReader in = new BufferedReader(
								   new InputStreamReader(s.getInputStream()));
	
			PrintWriter out = new PrintWriter(new BufferedWriter(
									new OutputStreamWriter(s.getOutputStream())),
								 true);
	
			// Write CGI command to socket output 
			out.println("GET /get_status.cgi HTTP/1.0\r\n\r\n");
				    			
			// Read response from socket
	
			String line = in.readLine();
	
			while (line != null)
				{
				if (line.indexOf("alarm_status") != -1) 
					{
					String walarm = line.substring(17, 18);
					alarm = (Integer.valueOf(walarm)).intValue();
					}	
				else
					{
					if (line.indexOf("alias") != -1) 
						{
						camid = line.substring(11, 22);
						}
					}
	
				// Read next line 
				line = in.readLine();
				}
			
			// Terminate connection 
			out.close();
			in.close();
	  		s.close();
	
	 		// alarm status on => video recording
	
			if (alarm != 0)
				{
				WriteLog.W_log(Thread.currentThread().getName()+ " "+camid+ " alarm on");
				StreamRecord record = new StreamRecord(camid,host,port);
				}
			else
				{
				Thread.sleep(attente);
				}
							
			}
	
			catch (InterruptedException e ) {}
			catch (SocketException e )
	  		{
				WriteLog.W_log(host + port + "Socket error : " + e);
			}
	  		catch (UnknownHostException e )
	  		{
				WriteLog.W_log(host + port + "Invalid host");
			}
	  		catch (IOException e )
	  		{
				WriteLog.W_log(host + port + "I/O error : " + e);
	  		} 
		} // end while
		}
	
	static class WriteLog
	{
		public static void W_log (String msg) 
		{
		PrintWriter log=null;
		try 
			{
			log = new PrintWriter(new FileWriter("camera.log", true));
			Date date = new Date();
			log.println(date+" "+msg+"\n");   // except Unix & Linux OS add LF char \n  
			log.close();
			}
		catch (IOException e ) {}
		}
	  		
	}
	
	static class StreamRecord
	{
	  public StreamRecord (String cam, String host, int port) 
	  { 
		int filesize=12044772; // filesize 
		int bytesRead;
		int current = 0;
		long time = System.currentTimeMillis();
		String filename = cam + "_" + time + ".asf";
	
		try
		{	
			
			// Create a connection to server Socket
			Socket s = new Socket(host, port);
		 	
			// Create input and output streams to socket 
				
			PrintWriter out = new PrintWriter(new BufferedWriter(
		                                new OutputStreamWriter(s.getOutputStream())),
		                             true);
	
			// Write CGI command to socket output 
			out.println("GET /videostream.asf?user=xxxxxx&pwd=xxxxxx&resolution=32 HTTP/1.0\r\n\r\n");
		
		 	// receive file
			byte [] mybytearray  = new byte [filesize];
			InputStream in = s.getInputStream();
			FileOutputStream fout = new FileOutputStream(filename);
			BufferedOutputStream bos = new BufferedOutputStream(fout);
	
			// discard first bytes
			in.skip(160);
	
			bytesRead = in.read(mybytearray,0,mybytearray.length);
			current = bytesRead;
	
			// 
		
			while (current < 12044770)
			{
		       		bytesRead =
		          	in.read(mybytearray, current, (mybytearray.length-current));
		       	  	if(bytesRead >= 0) current += bytesRead;
		        }
		bos.write(mybytearray, 0 , current);
		bos.flush();	    
		bos.close();
		s.close();
		}
		catch (SocketException e )
	  	{
			WriteLog.W_log(host + port + "StreamRecord Socket error : " + e);
		}
	  	catch (UnknownHostException e )
	  	{
			WriteLog.W_log(host + port + "StreamRecord Invalid host");
		}
	  	catch (IOException e )
	  	{
			WriteLog.W_log(host + port + "StreamRecord I/O error : " + e);
	  	} 
			
	  }
	  		
	}
	
}

A voir également

Ajouter un commentaire

Commentaires

labandus
Messages postés
25
Date d'inscription
jeudi 14 décembre 2000
Statut
Membre
Dernière intervention
25 juillet 2013
1 -
merci pour le programme...

cependant il n'y a aucune informations concernant le contexte dans lequel tu voudrais utiliser ton code:
pas de "USE CASE", pas de diagrammes D'ACTIVITÉ , rien ... même pas un petit modèle.

loin de moi de douter que ton code marche, mais tu nous donne juste un petit morceau de ton grand projet.

comment les gens qui ne savent pas ce qu'une camera IP est, comment ils vont savoir comme utiliser ton code de 327 lignes .... avec une petite description à dessus?

on ne comprend rien ..

Codes-Sources n'est pas un depotoir ou on vient juste "deposer" des codes, sans contexte...

donne nous des liens, des infos, ou alors fais nous un tutorial dedans.. là ou on saura tout.
les cas d'alarme: l'alarme , quelle interface la declenche ? est ce lié au hardware ? comment la camera gere-t elle?

tu nous donnes juste un petit bout de logique..

c'est a nous deviner qu'il y a surement la video en flux deja en ligne par ton
out.println("GET /videostream.asf?user=xxxxxx&pwd=xxxxxx&resolution=32 HTTP/1.0\r\n\r\n");

donc tu dois avoir une application web, avec une Web-server et tout ... mais c'est pas a nous deviner cela ... tu vois ? on voudrait des infos

j'ai néanmoins examiné ton code:

je peux dire qu'il est bien: bien découpé avec les classes internes, une gestion assez OK du Logging
bien que j'aurais à ta place créé un singleton pour la classe WriteLog , au lieu d'instancier à chaque fois ton PrintWriter pour ecrire un message, et/ou utiliser l'une des api présentes comme Log4J ( etc...sf4J)

si tu avais mis un peu plus d'infos sur le contexte de ton code (au lieu d'une petite description de 2 lignes) tu aurais pu avoir un 10/10, ma notes est 5 pour ton bon code...
Jef0173
Messages postés
6
Date d'inscription
mercredi 16 novembre 2011
Statut
Membre
Dernière intervention
16 mars 2012
-
De rien!

Quelques réponses à tes commentaires:

Mon objectif initial était de partager vers le plus grand nombre mon petit développement,
en effet ayant longuement et vainement chercher sur le net une solution à mon problème,
J’ai décidé de le résoudre moi même, et dans le cas où quelqu'un aurait le même besoin
de faire en sorte qu'il trouve un début de solution à son problème. Loin de moi l'idée de
déposer un source comme on jette quelque chose à la poubelle.

Si je n'ai pas davantage développé le descriptif c'est que j'avais naïvement pensé que ce
bout de code ne pouvait intéresser que les heureux possesseurs de camera IP, qui donc connaissent le fonctionnement des cameras IP et qui par conséquent se foutent royalement de mes explications. Afin de satisfaire la curiosité des personnes n’ayant pas encore la chance d’en posséder voici quelques informations complémentaires :

Une camera IP ressemble un petit peu à une webcam avec en général quelques fonctionnalités supplémentaires comme par exemple une motorisation pour l’orienter, un zoom, un détecteur de mouvement, etc… Comme son nom l’indique cette camera est équipée d’une interface réseau et implémente le protocole tcp/ip. Les plus répandues sont munies d’un outil de gestion via un serveur web embarqué, qui permet de les piloter, de les configurer conformément au besoin des utilisateurs, et enfin de les exploiter au mieux. Elles ont cependant un inconvénient c’est que leurs interfaces web ont été développés pour fonctionner avec IE et activeX , donc point de salut sans Microsoft ! Heureusement une bibliothèque d’API permet d’accéder à la majorité des fonctionnalités via des cgi qu’on peut soit appeler directement dans un navigateur Internet, ce qui est fastidieux, ou soit en écrivant un programme, ce qui est plus sympa. La seule utilisation d’IE étant un peu réducteur j’ai donc cherché une solution plus ouverte fonctionnant sous n’importe quel environnement. Et je peux confirmer que ca fonctionne puisque j’utilise mon programme sur une machine « exotique » sous busybox (mini unix) équipée d’un processeur ARM V5.

L’utilisation de camera IP répondant à des besoins très variés, ce code doit servir d’exemple pour être adapter en fonction de son propre cahier des charges. Dans mon cas particulier s’agissant d’un dispositif de sécurité je ne donnerai pas davantage de détail, pour ceux que ca intéressent, les constructeurs fournissent des informations détaillées sur les dispositifs dont leurs cameras sont équipés, et qu’on peut trouver sur leurs sites respectifs.

Concernant la logique, le programme interroge chaque camera à intervalle régulier afin de vérifier leur statut respectif et dans le cas où une intrusion a été détectée il enregistre le flux video transmis par la camera .

Par ailleurs n’étant pas un expert en java il va de soi que ce code peut être amélioré.

Espérant ainsi avoir encore répondu à l’attente du plus grand nombre !
labandus
Messages postés
25
Date d'inscription
jeudi 14 décembre 2000
Statut
Membre
Dernière intervention
25 juillet 2013
1 -
Merci Jef0173 pour les explications....
je pense qu’après les avoir données je comprends maintenant la nature de la camera IP..
cela me donne même envie d'en acheter une pour expérimenter ce que tu dis ...

c'est vrai qu'avec IE et Active on es lié a Microsoft pour le meilleur et pour le pire ..

merci encore pour les explications, c'est super ...
fais nous savoir comment cela avance ton projet...

love and peace , man
mainecoon33
Messages postés
19
Date d'inscription
dimanche 12 novembre 2006
Statut
Membre
Dernière intervention
9 mars 2008
-
Bonjour,

merci pour le code, mais ne sacahnt pas programmer, je ne comprend pas bien si ça peux être en rapport avec ce que je cherche.

J'ai une caméra IP (type foscam), je n'ai pas réussi à visionner via une adresse Ip et j'ai finalement réussi à envoyer des images toutes les 5 secondes vers un site Internet en FTP, j'étais super content !

Maintenant, je me retrouve avec une montagne de photos inexploitables car le nom des photos changent sans arret et finalement, je ne peux rien afficher. Es-ce que ton code pourrait me servir avec le problème que j'ai ?

Je te remercie grandement si tu pouvais m'aiguiller vers une solution que je cherche désespérement en vain.

Merci encore
Jef0173
Messages postés
6
Date d'inscription
mercredi 16 novembre 2011
Statut
Membre
Dernière intervention
16 mars 2012
-
Bonjour Mainecoon33,

Je ne comprends pas très bien ton problème. Pourrais tu préciser ton besoin? Si tu as uniquement besoin de visionner une video utilise un logiciel media player, et en principe ta camera a du être livrée avec un logiciel permettant de configurer la camera et de visualiser le flux video. Tu trouveras également des informations sur le site http://http://forum.hardware.fr/hfr/HardwarePeripheriques/Webcam/fi8908w-fi8918w-visioncam-sujet_50586_1.htm

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.