Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: Grabación y transmisión simultánea

Esto no es realmente una pregunta tanto como es una presentación de todos mis intentos de resolver una de las funcionalidades más desafiantes que me enfrenté.

Yo uso libstreaming biblioteca para transmitir videos en tiempo real a Wowza Server y tengo que grabar al mismo tiempo dentro de la tarjeta SD. Presento a continuación todos mis intentos para recoger nuevas ideas de la comunidad.

  • Múltiples conexiones bluetooth
  • ¿Se puede probar una aplicación de pago en alpha / beta de forma gratuita?
  • MPAndroidChart ¿cómo establecer el valor mínimo y máximo del eje y, o establecer el zoom predeterminado?
  • Android: la pregunta del principiante de layout_weight
  • Contenido dinámico en Maps V2 InfoWindow
  • ImageView volverá al estado original después de girar?
  • Copiar bytes de flujo de corriente de liberación a un archivo mp4

    Desarrollo

    Hemos creado una intercepción en la biblioteca libstreaming para copiar todos los bytes enviados a un archivo mp4. Libstreaming envía los bytes al servidor Wowza a través de LocalSocket. Utiliza MediaRecorder para acceder a la cámara y al micrófono del dispositivo y establece el archivo de salida como el flujo de entrada de LocalSocket. Lo que hacemos es crear un contenedor alrededor de este flujo de entrada que se extiende desde InputStream y crear un flujo de salida de archivos dentro de él. Por lo tanto, cada vez que libstreaming ejecuta una lectura sobre el flujo de entrada de LocaSocket, copiamos todos los datos al flujo de salida, tratando de crear un archivo MP4 válido.

    Impedimento

    Cuando intentamos leer el archivo, está dañado. Nos dimos cuenta de que falta información de metadatos del archivo MP4. Específicamente el átomo moov. Tratamos de retrasar el cierre de la transmisión para dar tiempo a enviar este encabezado (esto era todavía una conjetura) pero no funcionó. Para probar la coherencia de estos datos, hemos utilizado un software de pago para tratar de recuperar el video, incluyendo el encabezado. Se convirtió en jugable, pero era en su mayoría pantalla verde. Así que esto se convirtió en una solución no confiable. También intentamos usar "untrunc", un programa libre de línea de comandos de código abierto y ni siquiera podía iniciar la recuperación, ya que no había ningún átomo moov.

    Utilice ffmpeg compilado en android para acceder a la cámara

    Desarrollo

    FFMPEG tiene un complemento gradle con una interfaz de java para usarlo dentro de las aplicaciones de Android. Pensamos que podíamos acceder a la cámara a través de la línea de comandos (es probablemente en "/ dev / video0") y lo enviamos al servidor de medios.

    Impedimento

    Conseguimos el error "Permiso denegado" al intentar acceder a la cámara. La solución sería arraigar el dispositivo para tener acceso a él, pero hacer que los teléfonos pierdan su garantía y podrían ladrillo.

    Utilice ffmpeg compilado en android combinado con MediaRecorder

    Desarrollo

    Hemos intentado hacer que el archivo FFMPEG sea un archivo mp4 grabado dentro del teléfono a través de MediaRecorder

    Impedimento

    FFMPEG no puede transmitir archivos MP4 que todavía no se hayan hecho con la grabación.

    Utilice ffmpeg compilado en android con libstreaming

    Desarrollo

    Libstreaming utiliza LocalServerSocket como la conexión entre la aplicación y el servidor, por lo que pensamos que podríamos usar ffmpeg conectado con LocalServerSocket dirección local para copiar el streaming directamente a un archivo local dentro de la tarjeta SD. Justo después de que se inició el streaming, también ejecutamos el comando ffmpeg para comenzar a grabar los datos en un archivo. Usando ffmpeg, creíamos que crearía un archivo MP4 de la manera correcta, lo que significa que con el encabezado de átomo moov incluido.

    Impedimento

    La "dirección" creada no se puede leer a través de la línea de comandos, como una dirección local dentro del teléfono. Así que la copia no es posible.

    Utilice OpenCV

    Desarrollo

    OpenCV es una biblioteca de código abierto y multiplataforma que proporciona bloques de construcción para experimentos y aplicaciones de visión por computadora. Ofrece interfaces de alto nivel para capturar, procesar y presentar datos de imagen. Tiene sus propias API para conectarse con la cámara del dispositivo, así que empezamos a estudiarlo para ver si tenía las funcionalidades necesarias para transmitir y grabar al mismo tiempo.

    Impedimento

    Descubrimos que la biblioteca no está realmente definida para hacer esto, sino más como una manipulación matemática de la imagen. Incluso tenemos la recomendación de usar el "libstreaming" (lo que ya hacemos).

    Utilizar Kickflip SDK

    Desarrollo

    Kickflip es un servicio de streaming de medios que proporciona su propio SDK para desarrollo en android e IOS. También utiliza HLS en lugar de RTMP, que es un protocolo más reciente.

    Impedimento

    Su SDK requiere que creemos una Actividad con vista de cámara que ocupe toda la pantalla del dispositivo, rompiendo la usabilidad de nuestra aplicación.

    Utilizar Adobe Air

    Desarrollo

    Comenzamos a consultar a otros desarrolladores de aplicaciones ya disponibles en Play Store, que se transmiten a los servidores ya.

    Impedimento

    Ponerse en contacto con los desarrolladores, que aseguró que no sería posible grabar y transmitir al mismo tiempo con esta tecnología. Lo que es más, tendríamos que rehacer toda la aplicación desde cero usando Adobe Air.

    ACTUALIZAR

    Webrtc

    Desarrollo

    Comenzamos a usar WebRTC siguiendo este gran proyecto . Hemos incluido el servidor de señalización en nuestro servidor NODEJS y hemos empezado a realizar el handshake estándar vía socket. Todavía estábamos cambiando entre grabación local y streaming vía webrtc.

    Impedimento

    Webrtc no funciona en todas las configuraciones de red. Aparte de eso, la adquisición de la cámara es todo código nativo, lo que hace mucho más difícil tratar de copiar los bytes o interceptarlo.

  • Android: detecta el evento de desbloqueo del teléfono, no muestra la pantalla
  • Cómo cerrar la actividad con el teclado del software después de presionar BACK?
  • SwipeListView sólo un elemento abierto a la vez
  • ¿Diferencia entre focusable y focusableInTouchMode?
  • SQLite en Android Cómo actualizar una fila específica
  • Mejor uso de HandlerThread sobre otras clases similares
  • One Solution collect form web for “Android: Grabación y transmisión simultánea”

    Tan pronto como OpenCV 3.0 está disponible (el RC1 se puede descargar aquí ), podríamos agregar otra opción a esta lista:

    Utilizar el codificador Motion-JPEG incorporado de OpenCV

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.