Video stream från en axis nätverkskamera

Diskussion i 'Applikationsutveckling' startad av Xfirm, 2 nov 2011.

  1. Xfirm

    Xfirm Infant Droid Medlem

    Blev medlem:
    15 jul 2011
    Inlägg:
    2
    Mottagna gillanden:
    0

    MINA ENHETER

    Hej jag har gjort en app där jag vill ha ett fönster där jag ser video från en axis nätverkskamera. Det ända sätt jag har kommit på att lösa detta är igenom att hämta en snapshot från kamera och sedan uppdatera en ImageView från en egen thread.

    Det funkar bra men det laggar en del. Är det någon som vet om jag kan göra det på ett bättre sätt? Skulle jag kunna ta en video stream från kameran direkt?

    Kod:
    public class Video implements Runnable {
    
    	// Constructor
    	public Handler videoHandler;
    	Video(Handler aHandler) {
    		videoHandler = aHandler;
    	}
    	
    	private String IP = "", address = "";
    	private boolean run;
    	
    	// Method to start the thread
    	public void run() {
    		try {
    			
    			run = true;
    			
    			// Run until stopped
    			while (run) {
    				
    				// URL to camera
    				IP = AndonGUIActivity.IPaddress;
    				address = "http://" + IP + "/axis-cgi/jpg/image.cgi";
    				
    				Log.d("WebService", address);
    				
    				// Open connection
    				final URL aURL = new URL(address);
    				final URLConnection conn = aURL.openConnection();
    				conn.connect();
    				
    				// Open buffer to read image stream
    				final BufferedInputStream bis = new BufferedInputStream(conn
    						.getInputStream());
    				
    				// Make image of the input stream
    				final Bitmap bm = BitmapFactory.decodeStream(bis);
    				
    				// Close input stream
    				bis.close();
    				
    				// Update an image view with the downloaded image
    				videoHandler.post(new Runnable() {
    					public void run() {
    						AndonGUIActivity.cameraVideo.setImageBitmap(bm);
    					}
    				});
    				
    			}
    
    		} catch (IOException e) {
    			displayStatus(" ERROR: " + e);
    		}
    	}
    	
    	// Method to stop the thread
    	public void stop() {
            run = false;
            videoHandler = null;
            Log.d("WebService", "Stopped");
        }
    
    	// Method to update a status label in the UI thread
    	public void displayStatus(final String status) {
    		AndonGUIActivity.status.post(new Runnable() {
    			public void run() {
    				AndonGUIActivity.status.append(status);
    			}
    		});
    	}
    
    }
     
  2. ozp

    ozp Teen Droid Medlem

    Blev medlem:
    6 maj 2010
    Inlägg:
    250
    Mottagna gillanden:
    31

    MINA ENHETER

    Det beror på om kameran klarar av att skicka ut en videoström.
    Du får läsa dokumentationen om kameran för att ta reda på om det går och hur du isåfall får tillgång till videoströmmen.
     
  3. tokani

    tokani Kid Droid Medlem

    Blev medlem:
    19 aug 2011
    Inlägg:
    98
    Mottagna gillanden:
    11

    MINA ENHETER

    Du öppnar en ny connection varje gång du hämtar en bild. Man skulle (antagligen) kunna återanvända samma connection. Kolla på HttpURLConnection jag tror den har keep-alive true per default. Jag har inte provat men det är en idé i alla fall.
     
  4. gunnar-medial

    gunnar-medial Youth Droid Medlem

    Blev medlem:
    22 jun 2009
    Inlägg:
    137
    Mottagna gillanden:
    3

    MINA ENHETER

    De flesta AXIS-kameror levererar Motion JPG-format, men det finns även en MPEG4-variant och man kan streama i RTSP-format.

    Deras developer-sida kan vara till hjälp: Axis Communications - Network Camera Developer Pages
    Finns en tråd här med RTSP-exempel:
    How To Start a RTSP connection - Android Developers | Google Groups
    men inga garantier.

    Lite om Axis här: video streaming - Accessing an mpeg-4 encoded RTSP live stream (Axis server) in Android with the .amp extension - Stack Overflow

    Info by Axis: Axis Communications - MPEG-4