Necesito transmitir vídeo desde mi dispositivo Android a otro dispositivo Android a través de Wi-Fi, pero no quiero tener un servidor en el medio. ¿Cómo puedo hacerlo?
Respuestas
¿Demasiados anuncios?Si no necesitas la funcionalidad de grabación y reproducción en tu aplicación, utilizar una aplicación y un reproductor de streaming estándar es una opción razonable.
Sin embargo, si necesitas que estén en tu aplicación, tendrás que buscar en MediaRecorder API (para la aplicación de servidor/cámara) y MediaPlayer (para la aplicación cliente/jugador).
Código de ejemplo 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 difícil, usted podría intentar 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();
Desgraciadamente a mediaplayer no le gusta esto, así que tienes un par de opciones: o (a) guardar los datos del socket en un archivo y (después de tener un poco de datos) jugar con mediaplayer desde el archivo, o (b) hacer un pequeño proxy http que se ejecute localmente y pueda aceptar la petición GET de mediaplayer, responder con cabeceras HTTP, y luego copiar los datos del servidor remoto en él. Para (a) crearías el mediaplayer con una ruta o url de archivo, para (b) darle una url http que apunte a tu proxy.
Véase también:
http://stackoverflow.com/questions/6116880/stream-live-video-from-phone-to-phone-using-socket-fd/
http://stackoverflow.com/questions/5343730/mediaplayer-stutters-at-start-of-mp3-playback/
Puede utilizar Cámara web IP o tal vez utilizar DLNA. Por ejemplo, los dispositivos de Samsung vienen con una aplicación llamada AllShare que puede compartir y acceder a los dispositivos habilitados para DLNA en la red. Sin embargo, creo que la cámara web IP es tu mejor opción. Deberías poder abrir el stream que crea usando MX Video player o algo parecido.