Streaming live di video da un telefono Android a un altro tramite WiFi


115

Ho cercato in Internet per giorni su come implementare una funzione di streaming video da un telefono Android a un altro telefono Android tramite una connessione WiFi, ma non riesco a trovare nulla di utile. Ho cercato sviluppatori Android per codice di esempio, StackOverflow, Google, blog Android ma niente. Tutto quello che riesco a trovare sono una sorta di soluzione da telefono a desktop o da desktop a telefono per lo streaming, ma nulla che possa prendere in prestito nella mia implementazione.

Devo controllare un robot usando un ADK arduino, quindi sto usando 2 telefoni, uno che verrà montato sul robot e un altro che riceverà il flusso video dal robot. Lo dico perché sto cercando di ottenere il minimo ritardo tra l'ora di trasmissione e l'ora di visione.

Sto scrivendo 2 app, un'app master per controllare il robot (dal telefono palmare) che controllerà l'app slave e riceverà lo streaming e la seconda app slave che verrà eseguita sul telefono con cinghie robotiche, controllando i motori / attuatori / streaming sull'app principale. Sfortunatamente non posso usare app di terze parti. Devo integrare il codice del flusso video nelle mie 2 app.

Quali opzioni ci sono per raggiungere questo obiettivo? Inoltre è molto difficile da fare perché non ho mai lavorato con il videostreaming, anche se sto andando abbastanza bene sia nello sviluppo Java che in quello Android. Come dovrei codificare / decodificare il flusso, come avviare la connessione, dovrò lavorare con UDP invece che con TCP / IP? Non so davvero da dove cominciare, senza alcun codice di esempio da nessuna parte. Sono abbastanza sicuro che questo possa essere raggiunto. Non riesco a trovare nulla di utile per iniziare nella giusta direzione.

Mi sono imbattuto in spydroid ma sta usando VLC su un desktop, quindi non va bene per me.


EDIT: controlla il blog di Cagney Moreau . Entra nei dettagli sull'implementazione di questo.


1
Puoi condividere il tuo progetto, sto facendo una cosa simile, ma streaming video tra Android e desktop (WebClient) ... Ho pensato a html5 + websocket ma sto affrontando molti problemi ...
Buksy

1
Sto sviluppando una tale soluzione, che è l'80% di quello che stai cercando di fare. Devi configurare un server VOIP e quindi creare client per quel VOIP che trasferirà la tua voce e video. Lo sto anche cercando. se qualcuno sa, per favore fatemi sapere.
AZ_

1
l'email è presente sul mio profilo
AZ_

1
Guarda il mio progetto. Tutto in java e spiegato in dettaglio cagneymoreau.com/stream-video-android
cagney

1
grazie sto anche lavorando su un robot. Roba divertente
cagney

Risposte:


55

Se non hai bisogno della funzionalità di registrazione e riproduzione nella tua app, utilizzare l'app di streaming e il lettore standard è una scelta ragionevole.

Se hai bisogno che siano nella tua app, tuttavia, dovrai esaminare l' API MediaRecorder (per l'app server / fotocamera) e MediaPlayer (per l'app client / lettore).

Codice di esempio rapido per il server:

// 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();

Dal lato del giocatore è un po 'complicato, potresti provare questo:

// 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();

Sfortunatamente a mediaplayer tende a non piacere, quindi hai un paio di opzioni: o (a) salva i dati dal socket al file e (dopo aver ottenuto un po 'di dati) gioca con mediaplayer dal file, o (b) crea un piccolo http proxy che viene eseguito localmente e può accettare la richiesta GET del lettore multimediale, rispondere con intestazioni HTTP e quindi copiare i dati dal server remoto ad esso. Per (a) creeresti il ​​lettore multimediale con un percorso o l'URL del file, per (b) dargli un URL http che punta al tuo proxy.

Guarda anche:

Streaming video in diretta da telefono a telefono utilizzando socket fd

MediaPlayer balbetta all'inizio della riproduzione mp3


2
Ciao Alex, hai qualche esperienza con l'invio di un file audio memorizzato in locale da un telefono Android tramite RTP?
B770

ciao potete inviarmi il progetto completo di esso?
Umar Asghar

1
puoi per favore pubblicare il tuo progetto completo?
Yazhini Murugaiya

quale è socket server e socket client
Yazhini Murugaiya

1
@AhmedHamdy Infatti: nel livello API 23 (Android 6.0) puoi usare al setDataSource(MediaDataSource)posto di FileDescriptor. L'implementazione MediaDataSourceti consentirebbe di eseguire la lettura e il buffering della rete, senza scrivere su un file temporaneo.
Alex I

9

Una volta ho lavorato a qualcosa del genere, ma inviare un video e riprodurlo in tempo reale è una cosa davvero complessa. Ti suggerisco di lavorare solo con PNG. Nella mia implementazione, quello che ho fatto è stato acquisire PNG utilizzando la telecamera host e quindi inviarli tramite la rete al client, che visualizzerà l'immagine non appena ricevuta e richiederà l'immagine successiva dall'host. Dato che sei in Wi-Fi, la comunicazione sarà abbastanza veloce da ottenere circa 8-10 immagini al secondo (solo approssimazione, ho lavorato su Bluetooth). Quindi questo sembrerà un video continuo ma con molto meno sforzo. Per la comunicazione è possibile utilizzare prese UDP (più veloci e meno complesse) o DLNA (non sono sicuro di come funzioni).


Sì, questa sarebbe stata la mia ultima risorsa. Grazie per il feedback!
androidu

3
Sicuramente uno stream jpeg sarebbe più efficiente di uno stream png?
Stealthcopter

Stavo solo suggerendo di usare un'immagine, puoi usare qualsiasi formato desideri
Arveen

@krossreg> puoi incollare il codice di esempio per quello che suggerisci?
Jasper

8

Puoi usare IP Webcam , o forse usare DLNA. Ad esempio, i dispositivi Samsung sono dotati di un'app chiamata AllShare che può condividere e accedere ai dispositivi abilitati DLNA sulla rete. Penso che la webcam IP sia la soluzione migliore, però. Dovresti essere in grado di aprire lo stream che crea utilizzando MX Video Player o qualcosa del genere.


2
Sto scrivendo 2 app, un'app master per controllare il robot (dal telefono palmare) e per visualizzare ciò che vede il robot e la seconda app slave che verrà eseguita sul telefono con cinghie robotiche, controllando i motori / attuatori / streaming. Sfortunatamente non posso usare app di terze parti. Devo integrare il codice del flusso video nelle mie 2 app.
androidu

Forse puoi fare qualche ricerca sulle specifiche DLNA e provare a creare un'app che la utilizzi per conto tuo o forse inviare un'e-mail allo sviluppatore di IP Webcam e chiedere aiuto.
ldam

1
Reverse engineering vero? : P
mgibson

Sì, non ho altra scelta, immagino.
androidu

5

Puoi controllare il VLC Android che può riprodurre in streaming e riprodurre video, se vuoi indagare di più, puoi controllare il loro GIT per analizzare cosa fanno. In bocca al lupo!


3
Sto esaminando Android VLC. Mi diresti come usarlo per riprodurre in streaming un video?
user1914692
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.