web-dev-qa-db-ger.com

IP-Cam-Videostream auf Android (MJPEG) abrufen

Ich mache derzeit ein AndAR-Projekt in einer Gruppe von 3. Ich bin die Person, die für das Video-Streaming in das Android-Handy zuständig ist. Ich habe mir eine D-Link DCS-920 IP-Kamera besorgt und fand heraus, dass sie MJPEG-Codec für den Live-Videostream verwendet und der Webserver Jview zum Anzeigen des Live-Streams verwendet. Soweit ich weiß, ist MJPG kein unterstützter Dateityp für Android-Betriebssystem. Daher kam ich auf eine Idee. Statt ImageView zu verwenden, verwende ich WebView, um das Video zu streamen. Ich habe ein sehr einfaches Konzept implementiert und es funktioniert! Aber das Problem ist, die Bildwiederholrate ist schrecklich. Ich bekomme das Videobild (zB: http://192.168.1.10/image.jpg), um es auf dem WebView anzuzeigen, und einen Timer implementieren, um die Bildwiederholfrequenz zu steuern (soll es auf 30fps setzen, was Aktualisieren ist) alle 33ms), aber es kann nur bis zu 500ms dauern, jedes niedrigere Intervall, ich stelle fest, dass es nicht glatter wird, manchmal wird das Bild nicht geladen und die Verbindung ist instabil (z. B. fallen gelassen). Könnte dies sein, dass ich mich schneller erholt, als er empfangen kann? Aber auf dem Webserver Jview hat es kein Problem! Ich habe versucht, den Quellcode für jview zu finden, aber ich habe keine Hoffnung. Jedenfalls ist hier der Code, den ich geschrieben habe

package org.example.test;

import Java.util.Timer;
import Java.util.TimerTask;

import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.webkit.WebView;
import Android.widget.Button;
import Android.widget.EditText;

public class Webview extends Activity {

public WebView webView;
public Timer autoUpdate;
public String url;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);    

        webView = (WebView) findViewById(R.id.webview);
        webView.getSettings();
        final EditText urlText = (EditText) findViewById(R.id.urlText);

        //Buttons//////////////////------------
        final Button connectB = (Button)findViewById(R.id.connectButton);
        connectB.setOnClickListener(new View.OnClickListener() {
         public void onClick(View v) {
            //Actions goes here
          url = urlText.getText().toString();
          webView.loadUrl(url);
          timerSetup();
         }
        });
        final Button exitB = (Button)findViewById(R.id.exitButton);
     exitB.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
       //Actions goes here
       finish();
      }
     });
   }

    //refresh timer//////////////-----------------
    public void timerSetup(){
     autoUpdate = new Timer();
     autoUpdate.schedule(new TimerTask() {
      @Override
      public void run() {
       runOnUiThread(new Runnable() {
        @Override
     public void run() {
         //Actions goes here
         webView.loadUrl(url);
        }
       });
      }
     }, 0, 500);//refresh rate time interval (ms)
    }
}

Gibt es trotzdem einen Videostream von mindestens 15 Bildern pro Sekunde/eine schnellere Bildwiederholrate? Gibt es MJPEG-Viewer/Quellcode, den ich zum Anzeigen dieser Bilder verwenden kann?

hier ist der Screenshot der App http://s945.photobucket.com/albums/ad295/kevinybh/?action=view&current=video.jpg (nicht genügend Punkte zum Posten Bilder) :(

Ich muss nur den Videostream um 15-30 fps machen. Anregungen/Hilfe wäre sehr dankbar :) Danke!

15
Kevin

Anstelle eines Arduino könnten Sie einen Raspberry Pi verwenden. Er sollte ausreichend CPU-Leistung haben, um das Fahrzeug zu steuern und gleichzeitig den Videostrom zu konvertieren. Sicher, Sie müssen Ihre gesamte Arduino-Software auf Raspberry portieren ...

1
Marco

Sie können die MjpegView-Klasse verwenden, um den Mjpeg-Stream direkt anzuzeigen. https://code.google.com/p/Android-camera-axis/source/browse/trunk/serealisation/src/de/mjpegsample/ MjpegView/MjpegView.java? R = 33

Sie müssen einige AsyncTasks für diese Klasse implementieren, um einwandfrei zu funktionieren.

Viel Glück

0
robpf

Wenn wir ein JPEG nach CPU decodieren, kostet das auf Android 40-100 ms. Wenn Sie mjpeg mit 15-30 fps spielen möchten, benötigen wir einen Hardware-JPEG-Decoder.

0
xufan

MJPEG ist eine äußerst ineffiziente Methode, um Bewegungsvideos an ein mobiles Gerät zu liefern, da jedes Bild als eigenes unabhängiges Bild komprimiert wird. Für eine Anwendung, die kein Video benötigt (jemand hat letzte Woche nach einer Kamera gefragt, die Warteschlangen betrachtet), klingt Ihre Lösung, jede Sekunde einen statischen Rahmen zu verschieben, gut.

Wenn Sie Motion-Video benötigen, empfehle ich Ihnen, auf Ihrem Webserver von MJPEG in ein unterstütztes Videoformat umzuwandeln, das eine Frame-to-Frame-Komprimierung verwendet. Dies führt zu weit weniger Push-Daten, sowohl über die 3G-Verbindung des Benutzers als auch von Ihrem Server zu allen seinen Clients. Sie sollten nur ein Transcoding-Modul ausführen, um alle Clients zu unterstützen - und Sie können dasselbe für Android- und iPhone-Geräte verwenden. Sie können jedoch auch eine höhere Auflösung für Tablets und PCs haben, wenn Ihre Kameraausgabe erfolgt ist gut genug, um es zu rechtfertigen.

0
Chris Stratton

Es gab eine nützliche vorherige SO -Diskussion und diese großartige mit Code . Würden Sie es versuchen und uns wissen lassen, ob dies für Sie funktioniert?.

0
Walter K