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

He buscado en Internet durante días 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 encuentro nada útil. Busqué desarrolladores de Android para el código de muestra, stackoverflow, google, blogs de Android, pero nada. Todo lo que puedo encontrar es algún tipo de soluciones de transmisión de teléfono a escritorio o de escritorio a teléfono, pero nada de lo que pueda tomar prestado en mi implementación.

Necesito controlar un robot usando un ADK arduino, entonces 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 la menor demora 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 / transmisión a la aplicación principal. No puedo usar aplicaciones de terceros, lamentablemente. Necesito integrar el código de transmisión de video en mis 2 aplicaciones.

¿Qué opciones hay para lograr esto? También es muy difícil de hacer porque nunca trabajé con videostreaming, pero me está yendo muy bien en el desarrollo de Java y Android. ¿Cómo debo codificar / decodificar la transmisión, cómo iniciar 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 ayudarme a comenzar en la dirección correcta.

Me encontré con spydroid pero está usando VLC en una computadora de escritorio, así que no es bueno para mí.

    Si no necesita la funcionalidad de grabación y reproducción en su aplicación, el uso de la aplicación y el reproductor de transmisión en línea es una opción razonable.

    Sin embargo, si los necesita para que estén en su aplicación, tendrá que examinar la API MediaRecorder (para la aplicación de servidor / cámara) y MediaPlayer (para la aplicación 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(); 

    Del lado del jugador es un poco complicado, podrías 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, el media player tiende a no gustarle, así que tiene un par de opciones: (a) guardar datos de un socket a otro y (después de tener un poco de datos) jugar con mediaplayer desde un archivo, o (b) crear un pequeño http proxy que se ejecuta localmente y puede aceptar la solicitud GET del mediaplayer, responder con encabezados HTTP y luego copiar los datos desde el servidor remoto a él. Para (a) crearía el reproductor de medios con una ruta de archivo o url de archivo, para (b) darle una url http que apunta a su proxy.

    Ver también:

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

    MediaPlayer tartamudea al inicio de la reproducción de mp3

    Trabajé en algo así 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 PNG usando la cámara anfitriona 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 del host. Como está en wifi, la comunicación será lo suficientemente rápida como para obtener entre 8 y 10 imágenes por segundo (solo aproximación, trabajé con Bluetooth). Así que esto se verá como un video continuo pero con mucho menos esfuerzo. Para la comunicación, puede usar sockets UDP (más rápido y menos complejo) o DLNA (no estoy seguro de cómo funciona).

    Puede usar IP Webcam , o quizás usar 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. Creo que IP Webcam es tu mejor opción, sin embargo. Debería poder abrir la transmisión que crea usando el reproductor de video MX o algo así.

    Puedes comprobar que el VLC de Android puede transmitir y reproducir video, si quieres incluir más, puedes verificar su GIT para analizar lo que hacen. ¡Buena suerte!