Vidéo en direct d'un téléphone Android à un autre via WiFi

115

Je cherche sur Internet depuis des jours maintenant pour savoir comment mettre en œuvre une fonctionnalité de streaming vidéo d'un téléphone Android vers un autre téléphone Android via une connexion WiFi, mais je ne semble pas trouver quoi que ce soit d'utile. J'ai regardé les développeurs Android pour des exemples de code, stackoverflow, google, blogs Android mais rien. Tout ce que je peux trouver, c'est une sorte de solution de téléphone à bureau ou de bureau à téléphone pour le streaming, mais rien que je puisse emprunter dans ma mise en œuvre.

J'ai besoin de 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 cela parce que j'essaie d'obtenir le plus petit délai entre l'heure de diffusion et l'heure de visionnage.

J'écris 2 applications, une application principale pour contrôler le robot (à partir du téléphone portable) qui contrôlera l'application esclave et recevra le flux, et la deuxième application esclave qui fonctionnera sur le téléphone attaché au robot, contrôlant les moteurs / actionneurs / streaming vers l'application principale. Je ne peux malheureusement pas utiliser d'applications tierces. J'ai besoin d'intégrer le code du flux vidéo dans mes 2 applications.

Quelles sont les options pour y parvenir? C'est aussi très difficile à faire parce que je n'ai jamais travaillé avec le streaming vidéo, difficile que je réussisse assez bien en développement Java et Android. Comment encoder / décoder le flux, comment lancer la connexion, dois-je travailler avec UDP au lieu de TCP / IP? Je ne sais vraiment pas par où commencer, sans exemple de code nulle part. Je suis presque sûr que cela peut être réalisé. Je ne trouve rien d'utile pour me lancer dans la bonne direction.

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


EDIT: Consultez le blog de Cagney Moreau . Il entre dans les détails de sa mise en œuvre.

androidu
la source
1
Pouvez-vous partager votre projet, je fais la même chose, mais en streaming vidéo entre Android et bureau (WebClient) ... J'ai pensé aux websockets html5 + mais je suis confronté à de nombreux problèmes ...
Buksy
1
Je développe une telle solution, qui est à 80% la même que ce que vous essayez de faire. Vous devez configurer un serveur VOIP, puis créer des clients pour cette VOIP qui transférera votre voix et votre vidéo. Je la recherche également. si quelqu'un sait, faites-le moi savoir.
AZ_
1
l'email est donné sur mon profil
AZ_
1
Découvrez mon projet. Tout en java et expliqué en détail cagneymoreau.com/stream-video-android
cagney
1
merci je travaille aussi sur un robot. Fun stuff
cagney

Réponses:

55

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

Cependant, si vous en avez besoin dans votre application, vous devrez vous pencher sur l' API MediaRecorder (pour l'application serveur / caméra) et MediaPlayer (pour l'application client / lecteur).

Exemple de code rapide 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 joueur, 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 quelques options: soit (a) enregistrer les données du socket vers le fichier et (après avoir un peu de données) jouer avec Mediaplayer à partir du fichier, soit (b) créer un petit http proxy qui s'exécute localement et peut accepter la requête GET de mediaplayer, répondre avec des en-têtes HTTP, puis y copier les données du serveur distant. Pour (a) vous créeriez le mediaplayer avec un chemin de fichier ou une URL de fichier, pour (b) donnez-lui une URL http pointant vers votre proxy.

Voir également:

Diffusez des vidéos en direct d'un téléphone à l'autre à l'aide de la prise FD

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

Alex I
la source
2
Bonjour Alex, avez-vous une expérience avec l'envoi d'un fichier audio stocké local à partir d'un téléphone Android via RTP?
B770
salut pouvez-vous m'envoyer le projet complet de celui-ci?
Umar Asghar
1
pouvez-vous s'il vous plaît poster votre projet complet?
Yazhini Murugaiya
lequel est le socket serveur et le socket client
Yazhini Murugaiya
1
@AhmedHamdy En effet: dans l'API niveau 23 (Android 6.0), vous pouvez utiliser à la setDataSource(MediaDataSource)place de FileDescriptor. La mise en œuvre MediaDataSourcevous permettrait de faire votre propre lecture et mise en mémoire tampon du réseau, sans écrire dans un fichier temporaire.
Alex I
9

J'ai travaillé sur quelque chose comme ça 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, j'ai capturé des fichiers PNG à l'aide de la caméra hôte, puis les envoyer sur le réseau au client, ce qui affichera l'image dès qu'elle sera reçue et demandera l'image suivante à l'hôte. Puisque vous êtes en wifi, cette communication sera suffisamment rapide pour obtenir environ 8 à 10 images par seconde (approximation uniquement, j'ai travaillé sur Bluetooth). Cela ressemblera donc à une vidéo continue mais avec beaucoup moins d'effort. Pour la communication, vous pouvez utiliser des sockets UDP (plus rapides et moins complexes) ou DLNA (je ne sais pas comment cela fonctionne).

Arveen
la source
Ouais, ça allait être mon dernier recours. Merci pour les commentaires!
androidu
3
Un flux jpeg serait sûrement plus efficace qu'un flux png?
stealthcopter
Je suggérais juste d'utiliser une image, vous pouvez utiliser n'importe quel format que vous souhaitez
Arveen
@krossreg> pouvez-vous s'il vous plaît coller un exemple de code pour ce que vous suggérez?
Jasper
8

Vous pouvez utiliser la webcam IP , ou peut-être utiliser DLNA. Par exemple, les appareils Samsung sont livrés avec une application appelée AllShare qui peut partager et accéder aux appareils compatibles DLNA sur le réseau. Je pense cependant que la webcam IP est votre meilleur choix. Vous devriez pouvoir ouvrir le flux qu'il crée à l'aide du lecteur MX Video ou de quelque chose du genre.

ldam
la source
2
J'écris 2 applications, une application principale pour contrôler le robot (à partir du téléphone portable) et pour voir ce que le robot voit, et la deuxième application esclave qui fonctionnera sur le téléphone attaché au robot, contrôlant les moteurs / actionneurs / streaming. Je ne peux malheureusement pas utiliser d'applications tierces. J'ai besoin d'intégrer le code du flux vidéo dans mes 2 applications.
androidu
Vous pouvez peut-être faire des recherches sur les spécifications DLNA et essayer de créer une application en l'utilisant pour vous-même ou peut-être envoyer un courrier électronique au développeur de IP Webcam et demander de l'aide.
ldam
1
Inverser l'ingénierie? : P
mgibson
Ouais, je n'ai pas d'autre choix, je suppose.
androidu
5

Vous pouvez vérifier le VLC android, il peut diffuser et lire des vidéos, si vous voulez en savoir plus, vous pouvez vérifier leur GIT pour analyser ce qu'ils font. Bonne chance!

Ricardo Ortega Magaña
la source
3
Je suis à la recherche d'Android VLC. Pouvez-vous me dire comment l'utiliser pour diffuser une vidéo?
user1914692