2011-07-28 15 views
5

Soy principiante reciente de Android SDK, y el objetivo general de este proyecto es crear una aplicación muy similar a Ustream o Qik (sí, no sé la mejor idea para un principiante). Necesito transmitir audio y video en vivo a la web. Habrá un servidor de video, muy probablemente usando Wowza, manejando la codificación de los videos al formato apropiado.Transmisión de audio y video de Android a PC/web.

Según lo que he encontrado hasta ahora, necesito usar el MediaRecorder de Android con la cámara como fuente y dirigir la salida al servidor. Eso tiene sentido para mí, pero no sé exactamente cómo hacer eso. ¿Alguien puede darme un empujón en la dirección correcta? He navegado a través de un ejemplo en "http://ipcamera-for-android.googlecode.com/svn/trunk", pero parece ser mucho más complicado de lo necesario para lo que tengo que hacer y no he podido obtener está trabajando en eclipse para probarlo de todos modos.

+0

Tengo un problema similar, probé usar WebRTC, pero no funcionó en Smart TV (mi problema es la transmisión entre Android y Smart TV), smart tv no tiene Chrome :( – vrbsm

Respuesta

8

Hacer esto no es simple, pero es posible.

La API MediaRecorder asume que la salida es un archivo de acceso aleatorio, lo que significa que puede avanzar y retroceder para escribir el contenedor de archivos mp4 (u otro). Como puede ver en ipcamera-for-android, el archivo de salida se dirige a un socket que no es de acceso aleatorio. El hecho hace que sea difícil analizar la transmisión saliente, ya que la API de MediaRecorder "escribirá" algunos datos como fps, sps/pps (en h264), y así sucesivamente solo cuando la grabación termine. La API intentará volver al principio de la secuencia (donde existe el encabezado del archivo) pero fallará ya que la secuencia se envía a un socket y no a un archivo.

Tomando el ipcamera-for-android es una buena referencia, si recuerdo correctamente, antes de la transmisión, graba un video en un archivo, abre el encabezado y toma lo que necesita desde allí, que comienza a grabar en el socket y usa los datos que tomó del encabezado para analizar la transmisión.

También necesitará cierta comprensión básica en el análisis de mp4 (u otro contenedor de archivos que desee utilizar) para capturar los marcos. Puede hacerlo en el dispositivo o en el lado del servidor.

Aquí es un buen punto de partida para la escritura de la corriente a una toma de corriente: Tutorial

espero que haya sido útil, no hay un buen tutorial para analizar y decodificar los flujos salientes, ya que no es tan simple ... pero de nuevo, es posible con un poco de esfuerzo.

Echa un vistazo también aquí para ver cómo dirigir el flujo de salida a una corriente que puede ser enviado al servidor: MediaRecorder Question

+0

Golpe muy útil en la dirección correcta. en esos enlaces ahora. Gracias – ajs

0

SipDroid hace exactamente lo que necesita.

Implica un hack para eludir la limitación de la clase MediaRecorder que requiere un descriptor de archivo. Guarda el resultado de la secuencia de video MediaRecorder en un socket local (usado como un tipo de tubería), luego vuelve a leer (en la misma aplicación pero otro subproceso) desde este socket en el otro extremo, crea RTP paquetes fuera de los datos recibidos, y finalmente transmitir los paquetes RTP a la red (puede usar aquí el modo de emisión o unidifusión, como desee).

Básicamente se reduce a lo siguiente (código simplificado):

// Create a MediaRecorder 
MediaRecorder mr = new MediaRecorder(); 
// (Initialize mr as usual) 
// Create a LocalServerSocket 
LocalServerSocket lss = new LocalServerSocket("foobar"); 
// Connect both end of this socket 
LocalSocket sender = lss.accept(); 
LocalSocket receiver = new LocalSocket(); 
receiver.connect(new LocalSocketAddress("foobar")); 
// Set the output of the MediaRecorder to the sender socket file descriptor 
mr.setOutputFile(sender.getFileDescriptor()); 
// Start the video recording: 
mr.start(); 
// Launch a background thread that will loop, 
// reading from the receiver socket, 
// and creating a RTP packet out of read data. 
RtpSocket rtpSocket = new RtpSocket(); 
InputStream in = receiver.getInputStream(); 
while(true) { 
    fis.read(buffer, ...); 
    // Here some data manipulation on the received buffer ... 
    RtpPacket rtp = new RtpPacket(buffer, ...); 
    rtpSocket.send(rtpPacket); 
} 

La implementación de RtpPacket y RtpSocket clases (bastante simple), y el código exacto que manipulan el contenido secuencia de vídeo se puede encontrar en el Proyecto SipDroid (especialmente VideoCamera.java).

Cuestiones relacionadas