web-dev-qa-db-fra.com

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

Cela fait des jours que je fais des recherches sur Internet pour mettre en œuvre une fonctionnalité de streaming vidéo d'un téléphone Android à un autre Android via une connexion WiFi, mais je ne trouve rien qui me soit utile. . J'ai cherché sur Android développeurs pour un exemple de code, stackoverflow, google, Android blogs mais rien. Tout ce que je peux trouver est une sorte de solution de streaming de téléphone à bureau ou de bureau à téléphone, mais rien que je puisse emprunter dans mon implémentation.

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

J'écris 2 applications, une application maître pour contrôler le robot (à partir du téléphone de poche) qui contrôlera l'application esclave et recevra le flux, et la deuxième application esclave qui s'exécutera sur le téléphone équipé du robot, contrôlant les moteurs/actionneurs./streaming pour master app. Je ne peux malheureusement pas utiliser d'applications tierces. J'ai besoin d'intégrer le code de flux vidéo dans mes 2 applications.

Quelles sont les options pour y parvenir? De plus, c’est très difficile à faire, car je n’ai jamais travaillé avec le streaming vidéo, difficile, je me débrouille assez bien à la fois dans le développement de Java et de Android. Comment encoder/décoder le flux, comment établir la connexion, dois-je utiliser UDP au lieu de TCP/IP? Je ne sais vraiment pas par où commencer, sans exemple de code. Je suis à peu près 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: Découvrez le blog de Cagney Moreau. Il va dans les détails sur la mise en œuvre de cela.

112
androidu

Si vous n'avez pas besoin des fonctionnalités d'enregistrement et de lecture dans votre application, utiliser une application de diffusion en continu standard et un lecteur constitue un choix judicieux.

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

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é des joueurs, 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 plusieurs options: soit (a) sauvegarder les données de socket en fichier et (après avoir un peu de données) jouer avec mediaplayer depuis un fichier, ou (b) créer un petit fichier http proxy qui s'exécute localement et peut accepter la demande GET de mediaplayer, répondre avec des en-têtes HTTP, puis copier les données du serveur distant sur celui-ci. Pour (a), vous devez créer le lecteur multimédia avec un chemin de fichier ou une URL de fichier, pour (b) lui donner une URL http pointant vers votre proxy.

Voir également:

Diffuser de la vidéo en direct d'un téléphone à l'autre à l'aide de la prise fd

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

53
Alex I

J'ai déjà travaillé sur quelque chose comme ça une fois, mais envoyer une vidéo et la lire en temps réel est une chose très complexe. Je vous suggère de travailler uniquement avec la PNG. Dans mon implémentation, ce que j'ai fait était de capturer des PNG à l'aide de la caméra de l'hôte, puis de les envoyer sur le réseau au client, ce qui affiche l'image dès sa réception et demande la prochaine image à l'hôte. Puisque vous êtes en wifi, la communication sera assez rapide pour obtenir environ 8 à 10 images par seconde (approximativement, 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 (vous ne savez pas comment cela fonctionne).

9
Arveen

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 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 quelque chose du genre.

8
ldam

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

5