118 votes

Diffusion vidéo en direct d'un téléphone Android à un autre via le WiFi

Cela fait plusieurs jours que je cherche sur Internet comment mettre en place une fonction de streaming vidéo d'un téléphone Android vers un autre téléphone Android via une connexion WiFi, mais je ne trouve rien d'utile. J'ai cherché des exemples de code sur les développeurs Android, stackoverflow, google, les blogs Android mais rien. Tout ce que je peux trouver, c'est une sorte de solution de streaming de téléphone à ordinateur ou d'ordinateur à téléphone, mais rien que je puisse emprunter dans ma mise en œuvre.

Je dois contrôler un robot à l'aide d'un arduino ADK, j'utilise donc 2 téléphones, un qui sera monté sur le robot et un autre qui recevra le flux vidéo du robot. Je mentionne ceci parce que j'essaie d'obtenir le plus petit délai possible entre l'heure de diffusion et l'heure de visualisation.

Je suis en train d'écrire 2 applications, une application maître pour contrôler le robot (depuis le téléphone portable) qui contrôlera l'application esclave et recevra le flux, et la seconde application esclave qui fonctionnera sur le téléphone attaché au robot, contrôlant les moteurs/actionneurs/le flux vers l'application maître. Je ne peux malheureusement pas utiliser d'applications tierces. Je dois intégrer le code du flux vidéo dans mes deux applications.

Quelles sont les options pour y parvenir ? Est-ce très difficile à réaliser ? Je n'ai jamais travaillé avec des flux vidéo, mais je me débrouille plutôt bien en développement Java et Android. Comment dois-je coder/décoder le flux, comment dois-je initier la connexion, dois-je travailler avec UDP au lieu de TCP/IP ? Je ne sais vraiment pas par où commencer, et je n'ai aucun exemple de code nulle part. Je suis presque sûr que cela peut être réalisé. Je ne trouve simplement rien d'utile pour me mettre sur la bonne voie.

Je suis tombé sur spydroïde mais il utilise VLC sur un ordinateur de bureau, donc ce n'est pas bon pour moi.


EDIT : Consultez le site de Cagney Moreau blog . Il explique en détail comment le mettre en œuvre.

1 votes

Pouvez-vous partager votre projet, je fais quelque chose de similaire, mais le streaming vidéo entre Android et le bureau (WebClient) ... J'ai pensé à html5 + websockets mais je suis confronté à de nombreux problèmes ...

0 votes

Bien sûr, il suffit de m'envoyer votre adresse électronique et je vous répondrai. Vous avez mon adresse e-mail sur mon profil.

1 votes

Je suis en train de développer une telle solution, qui est à 80% identique à ce que vous essayez de faire. Vous devez configurer un serveur VOIP et ensuite créer des clients pour ce VOIP qui transféreront votre voix et votre vidéo. Je suis également à la recherche de cette solution. Si quelqu'un la connaît, faites-le moi savoir.

55voto

Alex I Points 7167

Si vous n'avez pas besoin de la fonctionnalité d'enregistrement et de lecture dans votre application, l'utilisation d'une application et d'un lecteur de streaming standard est un choix raisonnable.

Toutefois, si vous avez besoin de les intégrer à votre application, vous devrez vous pencher sur les points suivants MediaRecorder (pour l'application serveur/caméra) et MediaPlayer (pour l'application client/joueur).

Exemple rapide de code pour le serveur :

// this is your network socket
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mCamera = getCameraInstance();
mMediaRecorder = new MediaRecorder();
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// this is the unofficially supported MPEG2TS format, suitable for streaming (Android 3.0+)
mMediaRecorder.setOutputFormat(8);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediaRecorder.setOutputFile(pfd.getFileDescriptor());
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
mMediaRecorder.prepare();
mMediaRecorder.start();

Du côté du lecteur, c'est un peu délicat, vous pouvez essayer ceci :

// this is your network socket, connected to the server
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(pfd.getFileDescriptor());
mMediaPlayer.prepare();
mMediaPlayer.start();

Malheureusement, mediaplayer a tendance à ne pas aimer cela, vous avez donc deux options : soit (a) sauvegarder les données de la socket vers le fichier et (une fois que vous avez un peu de données) jouer avec mediaplayer à partir du fichier, soit (b) faire un petit proxy http qui fonctionne localement et peut accepter la requête GET de mediaplayer, répondre avec des en-têtes HTTP, puis copier les données du serveur distant vers lui. Pour (a) vous devez créer le mediaplayer avec un chemin de fichier ou une url de fichier, pour (b) lui donner une url http pointant vers votre proxy.

Voir aussi :

Diffusion de vidéos en direct de téléphone à téléphone à l'aide de la prise fd

MediaPlayer bégaie au début de la lecture d'un mp3

2 votes

Bonjour Alex, avez-vous de l'expérience dans l'envoi d'un fichier audio stocké localement depuis un téléphone Android via RTP ?

1 votes

Bonjour, pouvez-vous m'envoyer le projet complet ?

1 votes

Pouvez-vous afficher votre projet complet ?

9voto

krossreg Points 625

J'ai travaillé sur quelque chose de ce genre une fois, mais envoyer une vidéo et la lire en temps réel est une chose vraiment complexe. Je vous suggère de travailler uniquement avec des PNG. Dans ma mise en œuvre, ce que j'ai fait, c'est de capturer des PNG en utilisant la caméra hôte, puis de les envoyer sur le réseau au client, qui affichera l'image dès qu'il la recevra et demandera l'image suivante à l'hôte. Comme vous êtes en wifi, la communication sera assez rapide pour obtenir environ 8 à 10 images par seconde (approximation seulement, j'ai travaillé en Bluetooth). Cela ressemblera donc à une vidéo continue mais avec beaucoup moins d'efforts. Pour la communication, vous pouvez utiliser des sockets UDP (plus rapides et moins complexes) ou DLNA (je ne sais pas comment cela fonctionne).

0 votes

Oui, ça allait être mon dernier recours. Merci pour les commentaires !

3 votes

Un flux jpeg serait sûrement plus efficace qu'un flux png ?

0 votes

Je suggérais simplement d'utiliser une image, vous pouvez utiliser le format que vous souhaitez.

8voto

Logan Points 962

Vous pouvez utiliser Webcam IP ou peut-être utiliser DLNA. Par exemple, les appareils Samsung sont livrés avec une application appelée AllShare qui permet de partager et d'accéder aux appareils DLNA sur le réseau. Je pense que la webcam IP est votre meilleure option, cependant. Vous devriez pouvoir ouvrir le flux qu'elle crée en utilisant MX Video player ou quelque chose comme ça.

2 votes

Je suis en train d'écrire 2 applications, une application maître pour contrôler le robot (depuis le téléphone portable) et pour voir ce que le robot voit, et la seconde application esclave qui fonctionnera sur le téléphone attaché au robot, contrôlant les moteurs/actionneurs/flux. Je ne peux malheureusement pas utiliser d'applications tierces. Je dois intégrer le code du flux vidéo dans mes 2 applications.

0 votes

Vous pouvez peut-être faire quelques recherches sur la spécification DLNA et essayer de créer une application qui l'utilise pour votre propre compte ou peut-être envoyer un e-mail au développeur de la webcam IP et lui demander de l'aide.

0 votes

Ouais, je n'ai pas d'autre choix je suppose.

5voto

Vous pouvez vérifier le Android VLC Il peut diffuser et lire des vidéos. Si vous voulez en savoir plus, vous pouvez consulter leur site web. GIT pour analyser ce qu'ils font. Bonne chance !

4 votes

Je cherche Android VLC. Pourriez-vous me dire comment l'utiliser pour diffuser une vidéo ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X