Transmisión de video en vivo desde un teléfono Android a otro a través de WiFi

115

He buscado en Internet durante días sobre cómo implementar una función de transmisión de video desde un teléfono Android a otro teléfono Android a través de una conexión WiFi, pero parece que no puedo encontrar nada útil. Busqué en los desarrolladores de Android código de muestra, stackoverflow, google, blogs de Android, pero nada. Todo lo que puedo encontrar son algún tipo de soluciones de teléfono a escritorio o de escritorio a teléfono para la transmisión, pero nada que pueda tomar prestado en mi implementación.

Necesito controlar un robot usando un arduino ADK, así que estoy usando 2 teléfonos, uno que se montará en el robot y otro que recibirá la transmisión de video del robot. Menciono esto porque estoy tratando de lograr el menor retraso entre el tiempo de transmisión y el tiempo de visualización.

Estoy escribiendo 2 aplicaciones, una aplicación maestra para controlar el robot (desde el teléfono de mano) que controlará la aplicación esclava y recibirá la transmisión, y la segunda aplicación esclava que se ejecutará en el teléfono con correa de robot, controlando los motores / actuadores / streaming a la aplicación maestra. Desafortunadamente, no puedo usar aplicaciones de terceros. Necesito integrar el código de transmisión de video en mis 2 aplicaciones.

¿Qué opciones existen para lograrlo? También es muy difícil de hacer porque nunca trabajé con videostreaming, pero lo estoy haciendo bastante bien tanto en el desarrollo de Java como de Android. ¿Cómo debo codificar / decodificar el flujo, cómo inicio la conexión, tendré que trabajar con UDP en lugar de TCP / IP? Realmente no sé por dónde empezar, sin código de muestra en ninguna parte. Estoy bastante seguro de que esto se puede lograr. Simplemente no puedo encontrar nada útil para comenzar en la dirección correcta.

Me encontré con un spydroid pero está usando VLC en un escritorio, por lo que no es bueno para mí.


EDITAR: Echa un vistazo al blog de Cagney Moreau . Entra en detalles sobre la implementación de esto.

androidu
fuente
1
¿Puedes compartir tu proyecto? Estoy haciendo algo similar, pero transmisión de video entre Android y escritorio (WebClient) ... Pensé en html5 + websockets pero estoy enfrentando muchos problemas ...
Buksy
1
Estoy desarrollando tal solución, que es 80% igual a lo que está tratando de hacer. Necesita configurar un servidor VOIP y luego crear clientes para ese VOIP que transferirá su voz y video. Yo también lo estoy buscando. Si alguien sabe, por favor hágamelo saber.
AZ_
1
El correo electrónico se da en mi perfil
AZ_
1
Mira mi proyecto. Todo en java y explicado en detalle cagneymoreau.com/stream-video-android
cagney
1
gracias también estoy trabajando en un robot. Cosas divertidas
cagney

Respuestas:

55

Si no necesita la funcionalidad de grabación y reproducción en su aplicación, usar la aplicación y el reproductor de transmisión estándar es una opción razonable.

Sin embargo, si necesita que estén en su aplicación, tendrá que buscar en MediaRecorder API (para la aplicación de servidor / cámara) y MediaPlayer (para la aplicación de cliente / reproductor).

Código de muestra rápido para el servidor:

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

En el lado del jugador, es un poco complicado, puedes probar esto:

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

Desafortunadamente, a mediaplayer no suele gustarle esto, por lo que tiene un par de opciones: (a) guardar datos de socket en archivo y (después de tener un poco de datos) reproducir con mediaplayer desde archivo, o (b) hacer un pequeño http proxy que se ejecuta localmente y puede aceptar la solicitud GET de mediaplayer, responder con encabezados HTTP y luego copiar los datos del servidor remoto. Para (a) crearía el reproductor multimedia con una ruta de archivo o URL de archivo, para (b) darle una URL http que apunte a su proxy.

Ver también:

Transmita video en vivo de un teléfono a otro usando socket fd

MediaPlayer tartamudea al inicio de la reproducción de mp3

Alex yo
fuente
2
Hola Alex, ¿tienes alguna experiencia con el envío de un archivo de audio almacenado localmente desde un teléfono Android a través de RTP?
B770
hola ¿me pueden enviar el proyecto completo?
Umar Asghar
1
¿Puedes publicar tu proyecto completo?
Yazhini Murugaiya
cuál es el socket del servidor y el socket del cliente
Yazhini Murugaiya
1
@AhmedHamdy De hecho: en el nivel de API 23 (Android 6.0) puede usar en setDataSource(MediaDataSource)lugar de FileDescriptor. La implementación MediaDataSourcele permitiría realizar su propia lectura de red y almacenamiento en búfer, sin escribir en un archivo temporal.
Alex I
9

Trabajé en algo como esto una vez, pero enviar un video y reproducirlo en tiempo real es algo realmente complejo. Te sugiero que trabajes solo con PNG. En mi implementación, lo que hice fue capturar PNGs usando la cámara host y luego enviarlos a través de la red al cliente, que mostrará la imagen tan pronto como se reciba y solicitará la siguiente imagen al host. Dado que está conectado a wifi, la comunicación será lo suficientemente rápida como para obtener entre 8 y 10 imágenes por segundo (solo una aproximación, trabajé en Bluetooth). Entonces esto se verá como un video continuo pero con mucho menos esfuerzo. Para la comunicación, puede usar sockets UDP (más rápidos y menos complejos) o DLNA (no estoy seguro de cómo funciona).

Arveen
fuente
Sí, este iba a ser mi último recurso. ¡Gracias por la respuesta!
androidu
3
¿Seguramente una secuencia jpeg sería más eficiente que una secuencia png?
stealthcopter
Solo estaba sugiriendo el uso de una imagen, puede usar cualquier formato que desee
Arveen
@krossreg> ¿puedes pegar un código de muestra para lo que sugieres?
Jasper
8

Puede utilizar la cámara web IP o tal vez utilizar DLNA. Por ejemplo, los dispositivos Samsung vienen con una aplicación llamada AllShare que puede compartir y acceder a dispositivos habilitados para DLNA en la red. Sin embargo, creo que la cámara web IP es tu mejor opción. Debería poder abrir la transmisión que crea usando el reproductor de video MX o algo así.

ldam
fuente
2
Estoy escribiendo 2 aplicaciones, una aplicación maestra para controlar el robot (desde el teléfono de mano) y para ver lo que ve el robot, y la segunda aplicación esclava que se ejecutará en el teléfono con correa de robot, controlando los motores / actuadores / transmisión. Desafortunadamente, no puedo usar aplicaciones de terceros. Necesito integrar el código de transmisión de video en mis 2 aplicaciones.
androidu
Tal vez pueda investigar un poco sobre la especificación DLNA y tratar de crear una aplicación que la utilice para su propia cuenta o tal vez enviar un correo electrónico al desarrollador de IP Webcam y pedir ayuda.
ldam
1
¿Ingeniería inversa? : P
mgibson
Sí, supongo que no tengo otra opción.
androidu
5

Puede verificar el VLC de Android , puede transmitir y reproducir video, si desea indagate más, puede verificar su GIT para analizar lo que hacen. ¡Buena suerte!

Ricardo Ortega Magaña
fuente
3
Estoy investigando Android VLC. ¿Me dirías cómo usarlo para transmitir un video?
user1914692