2011-06-29 13 views
13

Esto podría ser un tema bastante intresting para las personas que se interese livestreaming de su dispositivoa un servidor web. (Principal Android/Java) Finalmente he encontrado una manera de cómo transmitir en vivo desde la cámara de mi dispositivo a mi servidor web (sitio web). En una red wifi, tarda aprox. 1 fotograma/segundo para mostrar en una red wifi, también funciona en la red EDGE/3G. En este tema/pregunta, quiero analizar nuevas técnicas, mejoras, ideas sobre la transmisión en vivo, ya que compartiré el mío con el suyo (también se agradecen los códigos)Transmisión en vivo Tema

Mi código toma una instantánea repetidamente de la vista previa de la cámara usando setOneShotPreviewCallback() llamar aPreviewFrame(). El marco se entrega en formato YUV, por lo que raw2jpg() lo convierte en 32GB ARGB para el codificador jpeg. NV21 es un formato plano YUV.

getPicture() es llamado por la aplicación y produce los datos jpeg para la imagen en la matriz de bytes privada mCurrentFrame y devuelve esa matriz.

Después de esto, el byteArray mCurrentFrame obtiene Base64Encoded y se envía a mi servidor web en un método HTTP POST junto con el valor de cadena de Base64 y un código de identificación propio para que la gente no pueda enviarle otra imagen. En el servidor web, se decodifica de nuevo y se almacena en el archivo test.jpg. PHP y Javascript se están ejecutando en el servidor web. PHP obtiene el método POST y JavaScript recarga la imagen cada 750 segundos. Esto es básicamente como funciona.

Ahora estoy muy interesado en sus ideas, mejoras y otras cosas que le gustaría agregar/pedir. Aquí están algunas de mis preguntas:

1) ¿Cuál sería el mejor método para la transmisión en vivo CON audio? Grabación de video O mi método + Grabación de audio?

2) ¿Cómo se acercaría a la grabación de video?

3) ¿Cómo transmitirías audio al servidor web? (Objetivo principal) (Con Java, PHP y JavaScript)

4) También estoy planeando agregar elementos de transmisión en vivo típicos a i, p. cuando aparece una persona famosa, puede mostrar su nombre mientras está transmitiendo en vivo, o simplemente agregar una imagen de su directorio sd a su transmisión en vivo. ¿También podría decodificarlo y superponer la imagen, o poner la imagen en su transmisión en vivo de alguna manera?

Este tema es principalmente para preguntas, así que por favor esto podría ser de gran ayuda para algunas personas aquí. Por lo tanto, agregué una recompensa de 50 (¡woot!) Representante.

Sinceramente, XverhelstX

+1

no veo ninguna recompensa? Aunque no estoy calificado para responder a esto de todos modos. –

+0

Sí, lo sé. Parece que no puedo agregar uno aquí. Aunque parece que puedo agregarlos a mis otras preguntas. Probablemente necesite esperar la aprobación. – Verhelst

+0

@XverhelstX No puede comenzar una recompensa hasta que haya transcurrido un cierto tiempo. –

Respuesta

7

Me parece que la publicación de http probablemente no sea una buena forma de hacer transmisión en vivo de video a su servidor. Otras personas han estado jugando con transmisión en vivo y han utilizado un socket para transmitir transmisiones de video en vivo y transmisiones de audio a sus servidores.

Pensé que esto era fascinante, aquí hay un enlace.

http://www.mattakis.com/blog/kisg/20090708/broadcasting-video-with-android-without-writing-to-the-file-system

Pero el chico también publicó una muestra parcial de código -

String hostname = "your.host.name"; 
int port = 1234; 

Socket socket = new Socket(InetAddress.getByName(hostname), port); 

ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket); 

MediaRecorder recorder = new MediaRecorder(); 

// Additional MediaRecorder setup (output format ... etc.) omitted 

recorder.setOutputFile(pfd.getFileDescriptor()); 

recorder.prepare(); 

recorder.start(); 

Lo bueno que no sabía acerca es el ParcelFileDescriptor - que crea un archivo en el sistema de archivos androide que es en realidad un conducto a un socket - para que todo lo que se escribe en el archivo se transmita por la web a un servidor remoto. Los sockets son la forma correcta de hacer este tipo de cosas también porque le permiten enviar datos continuamente hasta que la grabación se complete sin tener que volver a enviar los encabezados una y otra vez.

Lo que creo que es bueno de esta técnica es que es, literalmente, tomar la salida de MediaRecorder (que va a ser una secuencia de vídeo codificado) y bombearlo a través de un socket a su servidor. Luego, simplemente puede guardar los datos que ingresan en el socket. Sin fotograma por fotograma, sin procesamiento (Android SDK no expone los codificadores en el SDK muy bien y son bastante intensivos en el rendimiento).

La gente informa que funciona, pero no lo he probado. De todos modos, espero que esto sea útil.

+1

Hola, gracias, esto es muy interesante. Sherif y tú dieron una buena explicación, recursos de lo que es capaz el sistema operativo Android. Aunque, solo puedo dar 1 recompensa. Gracias Walta por señalar esto – Verhelst

+0

Si, de nada. Planeo hacerlo yo mismo en algún momento, así que es bueno haber hecho la investigación. – walta

+0

Claro, si necesitas un código de mi techinque, solo PM (si es posible aquí stackoverflow), también he encontrado una manera de superponer imágenes sobre una imagen para crear un efecto como en Q 4 – Verhelst

2

Nota: No soy un desarrollador de Android.

Por lo que ha dicho, parece que solo está tomando una instantánea en lugar de una transmisión real. Si le preocupa el ancho de banda, use una resolución más baja. Exactamente cómo hacer esto en Android No estoy seguro

Creo que si hay clases integradas de transmisión que podrá obtener tanto la transmisión de video como la transmisión de audio. No realice ninguna transcodificación local (su raw2jpg() cuenta como transcodificación) ya que podría usar demasiada potencia de procesamiento. Simplemente tome la transmisión, comprítela y envíela a su servidor.


EDIT:

algunos enlaces para que pueda empezar

  • An interesting project que convierte el teléfono Android en una cámara IP. Se podía cavar alrededor del código de averiguar cómo ponernos en contacto de la corriente de la cámara
  • An SO question sobre este tema
+0

TheLQ, ¿conoce algún libro, tutorial o proyecto de código abierto que haga lo que dice que podemos estudiar? Incluso si es para otra plataforma como ios. Gracias. – nickfox

+0

@nickfox Ver actualizaciones, acabo de hacer algunas búsquedas en Google simples. Aparte de eso, no hay mucha ayuda que pueda proporcionar. Y no, desafortunadamente no conozco ningún libro o tutorial. – TheLQ

4

Está enviando toda una instantánea cada vez? ¿Por qué no intentas usar algunas técnicas de compresión de video, como en lugar de enviar una imagen completa cada vez que envías una versión comprimida (tal vez una diferencia o algo así) y en el servidor creas la imagen en función de tu última imagen? y los datos recién recibidos. Creo que todos los códecs de video hacen esto, puedes probar algunas de las especificaciones de los códecs abiertos para obtener algunas ideas.

Acerca del audio. Enviaría la secuencia de audio por separado y la sincronizaría con la transmisión de video en función de qué cuadro de video mostramos ahora.

Básicamente, trataría de hacer que mi transmisión esté lo más cerca posible de cómo funciona una transmisión de video real. Tal vez podrías mirar ffmpeg, ffmpeg tiene un servidor rtsp si pudieras construir eso para Android, simplificaría mucho tu trabajo.

2

1) ¿Cuál sería el mejor método para la transmisión en vivo CON audio? Grabación de video O mi método + Grabación de audio?

This really depends on your view of "best". If you are looking for resources and not the quality, then your way is really good. Otherwise, you should use a native streaming mechanism or maybe implement a video streaming technique to stream and encode video.

3) ¿Cómo le transmitir audio al servidor web? (Objetivo principal) (Con Java, PHP y JavaScript)

I suggest that you stick to MediaRecorder because it really does what your doing in a good way. Still try to find a way to get the stream in order to send in your way as files are not the best choice although you could stick to files and send small files in a timely manner. In this way you could put a bigger portion of the load on the server rather than the client.

4) También estoy planeando añadir feautures típicos streaming a i, por ejemplo, cuando aparece una persona famosa, puede mostrar su nombre mientras está transmitiendo en vivo, o simplemente agregar una imagen de su directorio sd a su transmisión en vivo. ¿También podría decodificarlo y superponer la imagen, o poner la imagen en su transmisión en vivo de alguna manera?

Do not even try to put it in your livestream. With your php server, you have more capabilities to send this info alone with certain tag and let the server do the processing or maybe integration of these with the video

Cuestiones relacionadas