Arriver IP Cam flux vidéo sur Android (MJEPG)
Je suis actuellement en train de faire un AndAR projet en groupe de 3. Je suis la personne qui est en charge de la vidéo en streaming sur le téléphone Android.
J'ai eu nous-mêmes un D-Link DCS-920 caméra IP et j'ai trouvé qu'il utilise le codec MJPEG pour le flux vidéo en direct et le serveur web utilise Jview pour afficher le flux vidéo en direct. Autant que je sache, MJPG n'est pas un type de fichier pris en charge pour le système d'exploitation Android donc je l'ai est venu avec une idée, au lieu d'utiliser ImageView, j'utilise WebView pour diffuser de la vidéo.
J'ai mis en place un concept très simple et ça marche!!! Mais le problème est, la fréquence de rafraîchissement est terrible.
J'ai la vidéo de l'image (par exemple: http://192.168.1.10/image.jpg
) pour afficher sur la WebView et de mettre en œuvre une Minuterie pour contrôler le taux de rafraîchissement (supposée être à 30fps, ce qui est d'actualisation de chaque 33ms), mais il ne peut aller jusqu'à 500 ms d'intervalle, tout intervalle inférieur je remarque qu'il ne sera pas tout lisse,parfois, l'image ne se charge pas et la connexion est instable (ex: chute). Cela pourrait-il être, je suis rafraîchissante à un rythme plus rapide qu'il peut recevoir?
Mais plus sur le serveur web Jview il n'a pas de problème! a été d'essayer de trouver le code source de la jview mais je n'ai aucun espoir.
De toute façon, 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-il de toute façon je peux obtenir le flux vidéo en par au moins 15fps/ont un taux de rafraîchissement plus rapide?
Il y a aucune une telle chose comme MJPEG/visionneuse de code source 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¤t=video.jpg
(pas assez de points pour poster des photos) 🙁
J'ai juste besoin de faire le flux vidéo autour de 15-30 images par seconde. toutes les suggestions/aide serait grandement apprécié 🙂 Merci!
comment dois-je faire? je veux vérifier si c'est la fin du chargement de l'image et de la recharge à droite juste après la fin du chargement
OriginalL'auteur Kevin | 2010-12-20
Vous devez vous connecter pour publier un commentaire.
Au lieu d'un Arduino, vous pouvez utiliser une Raspberry PI, il doit avoir assez de puissance CPU pour le contrôle du véhicule et de convertir le flux vidéo en même temps. Bien sûr, vous aurez besoin de port tous de votre Arduino logiciel de Framboise...
Je n'ai jamais utilisé un de Framboise, mais autant que je sache, il exécute une sorte de Linux, dispose d'un puissant processeur graphique et il est qui a dit qu'il est même capable d'encoder en H. 264 vidéo 1080p à 30 fps. Je suis très très sceptique sur la vidéo en 1080p, mais il ne peut probablement encoder IPcam VGA de 640 x 480 flux vidéo. harrybuttle.wordpress.com/2013/08/05/... Si plus de puissance est nécessaire, il y a aussi, qui s'appuie à la Framboise clusters. Juste google "Framboise d'encodage vidéo" et/ou "Framboise cluster".
Il est à seulement 700 mhz... je doute vraiment qu'il pouvait encoder en temps réel...
La puissance de la Raspeberrypi dépend vraiment si vous pouvez faire de sa très exclusif GPU faire le travail, ou si vous devez le faire avec le relativement wimpy CPU. Si vous pouvez obtenir le GPU docs de broadcomm, ou votre besoin est pris en charge par la disposition du code écrit par quelqu'un qui l'a déjà fait, grand. Si pas, le CPU ne peut pas être à la hauteur.
OriginalL'auteur Marco
MJPEG est terriblement inefficace façon de fournir de la vidéo à un appareil mobile, car chaque image est compressée que c'est propre image. Pour une application qui n'a pas besoin de la vidéo (quelqu'un a une question sur une caméra à regarder files d'attente la semaine dernière) votre solution de pousser une image statique à chaque seconde ou alors, ça sonne bien.
Si vous avez besoin de mouvement vidéo, je vous recommande de faire le transcodage sur votre serveur à partir de MJPEG pris en charge le format vidéo qui utilise une image à la compression. Ce sera résultat en beaucoup moins de données à pousser, à la fois sur l'utilisateur de la connexion 3g et à partir de votre serveur à tous ses clients. Vous devriez seulement besoin de courir un moteur de transcodage à l'appui de tous les clients et vous serez en mesure d'utiliser le même pour android & appareils iphone, si vous souhaitez également avoir une résolution plus élevée de sortie pour les tablettes et les pc si votre sortie de la caméra est assez bon pour le justifier.
Vous auriez probablement besoin d'un autre logiciel de serveur web (en cours d'exécution sur un serveur entre la caméra et les clients). Vous pourriez être en mesure expérimentalement faire quelque chose avec VLC, si c'est un paquet avec un grand nombre de technologies qui se cachent derrière un plutôt incohérent interface de configuration.
Ce qui signifie que j'ai pour diffuser mon IP cam à l'aide de VLC? En fait mon projet est un Véhicule RC Jeu de Réalité Augmentée. j'ai donc un sans fil caméra IP fixée au véhicule et une carte Arduino avec WiFly bouclier attaché à elle. Je suis censé pour diffuser de la vidéo à partir de l'IP de mon téléphone android et être en mesure de contrôler le véhicule et le téléphone en même temps. Mon plan est d'éliminer le routeur et l'ordinateur portable donc c'est un direct P2P connexion du téléphone vers le véhicule. Une idée de comment? Pire des cas je vais avoir à fixer un routeur et un ordinateur portable plus tard, si les choses ne fonctionnent pas 🙁
Il est possible que vous pourriez obtenir que cela fonctionne avec un téléphone android d'avoir un processeur suffisamment rapide pour ne MJPEG décodage en utilisant mplayer ou ffmpeg, mais je pense que tu ferais mieux d'utiliser un PC quelque part au milieu de transcoder mpeg4 et garder le téléphone android de faire des choses standard. Si c'est juste pour un usage privé VLC probablement peut être configuré pour effectuer le transcodage pour vous (pas sûr que c'est un multi-client serveur public pour le web). Je suppose qu'à la fin c'est l'endroit où vous êtes plus à l'aise de piratage - bizarre android trucs et / ou la configuration d'un serveur pc. J'espère que ce n'est pas un avion.
je ne veux un pc pour être interfacé entre bcoz mon plan est d'avoir un direct p2p connexion entre le téléphone android pour le véhicule/l'appareil photo. n'importe quelle source que je peux consulter dans ce cas? 🙂 comme d'un code source pour transcoder mjpg à un autre format disons jpg?
OriginalL'auteur Chris Stratton
Sur android, si nous décoder un fichier jpeg par la CPU, il vous en coûtera 40-100ms. Si nous voulons jouer mjpeg à 15-30 images par seconde, nous avons besoin de matériel jpeg décodeur.
OriginalL'auteur xufan
Il était utile précédente, de SORTE discussion et ce grand avec le code. Voulez-vous essayer et laissez-nous savoir si cela fonctionne pour vous.
OriginalL'auteur Walter K
Vous pouvez utiliser MjpegView classe pour afficher le flux mjpeg directement.
https://code.google.com/p/android-camera-axis/source/browse/trunk/serealisation/src/de/mjpegsample/MjpegView/MjpegView.java?r=33
Vous aurez à mettre en œuvre certaines AsyncTasks sur cette classe fonctionne très bien.
Bonne chance
OriginalL'auteur robpf