web-dev-qa-db-fra.com

Obtenir le flux vidéo IP Cam sur Android (MJPEG)

Je suis actuellement en train de faire un projet AndAR par groupe de 3. Je suis la personne en charge de la vidéo en streaming sur le téléphone Android. Je me suis procuré une caméra IP D-Link DCS-920 et j'ai découvert qu'elle utilise le codec MJPEG pour le flux vidéo en direct et que le serveur Web utilise Jview pour visualiser le flux en direct. Pour autant que je sache, MJPG n'est pas un type de fichier pris en charge pour Android OS. Je suis donc venu avec une idée. Au lieu d'utiliser ImageView, j'utilise WebView pour diffuser la vidéo. J'ai mis en place un concept très simple et ça marche! Mais le problème est que le taux de rafraîchissement est terrible. Je reçois l'image vidéo (par exemple: http://192.168.1.10/image.jpg) à afficher sur la WebView et implémente un minuteur pour contrôler le taux de rafraîchissement (censé le définir à 30fps, ce qui correspond au rafraîchissement toutes les 33 ms), mais il ne peut aller que dans un intervalle allant jusqu'à 500 ms; tout intervalle inférieur ne doit pas être plus lisse, parfois l'image ne se charge pas et la connexion est instable (par exemple: abandonnée). Est-ce que cela pourrait être que je rafraîchit à un rythme plus rapide que ce qu'il peut recevoir? Mais sur le serveur Web Jview, cela n’a pas de problème! essayait de trouver le code source pour jview mais je n’ai aucun espoir. En tout cas voici le code que j’ai écrit

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)
    }
}

Est-ce que je peux quand même obtenir le flux vidéo d'au moins 15 ips/taux de rafraîchissement plus rapide? Existe-t-il un visualiseur/code source MJPEG que je peux utiliser pour afficher ces images?

voici la capture d'écran de l'application http://s945.photobucket.com/albums/ad295/kevinybh/?action=view&current=video.jpg (pas assez de points pour poster des photos) :(

Je dois juste faire le flux vidéo autour de 15-30fps. toute suggestion/aide serait très profondément appréciée :) Merci!

15
Kevin

Au lieu d’un Arduino, vous pouvez utiliser un Raspberry Pi, il devrait disposer de suffisamment de puissance de calcul pour contrôler le véhicule et convertir le flux vidéo en même temps. Bien sûr, vous aurez besoin de porter tous vos logiciels Arduino sur Raspberry ...

1
Marco

Vous pouvez utiliser la classe MjpegView pour afficher directement le flux mjpeg. Https://code.google.com/p/Android-camera-axis/source/browse/trunk/serealisation/src/de/mjpegsample/ MjpegView/MjpegView.java? R = 33

Vous devrez implémenter des tâches asynchrones sur cette classe pour que tout fonctionne bien.

Bonne chance

0
robpf

Sur Android, si nous décodons un fichier jpeg par CPU, cela coûtera 40 à 100 ms. Si nous voulons jouer mjpeg à 15-30fps, nous avons besoin d’un décodeur jpeg matériel.

0
xufan

Le format MJPEG est un moyen extrêmement inefficace de transmettre des images animées à un appareil mobile, car chaque image est compressée comme une image indépendante. Pour une application qui n’a pas besoin de vidéo (une personne a posé la question la semaine dernière au sujet d’une caméra), votre solution consistant à afficher un cadre statique toutes les secondes sonne bien.

Si vous avez besoin de vidéo animée, je vous recommande de transcoder sur votre serveur Web de MJPEG vers un format vidéo pris en charge utilisant la compression image par image. Cela se traduira par beaucoup moins de données à transmettre, à la fois via la connexion 3G de l'utilisateur et depuis votre serveur vers tous ses clients. Vous ne devriez utiliser qu'un seul moteur de transcodage pour prendre en charge tous les clients. Vous pourrez également utiliser le même moteur pour les appareils Android et iPhone, mais vous voudrez peut-être également une résolution plus élevée pour les tablettes et les ordinateurs personnels est assez bon pour le justifier.

0
Chris Stratton

Il y a eu un utile précédent SO discussion et ce super avec code Souhaitez-vous essayer de nous faire savoir si cela fonctionne pour vous.

0
Walter K