10

Estoy buscando la mejor manera (si alguna) de capturar video continuo en un búfer circular en la tarjeta SD, lo que permite al usuario capturar eventos después de que hayan sucedido.Grabación de video en un buffer circular en Android

La API de grabación de video estándar le permite simplemente escribir directamente en un archivo, y cuando alcanza el límite (establecido por el usuario o la capacidad de la tarjeta SD) tiene que detener y reiniciar la grabación. Esto crea una ventana de hasta 2 segundos de duración donde la grabación no se está ejecutando. Esto es lo que ya hacen algunas aplicaciones existentes como DailyRoads Voyager. Para minimizar la posibilidad de perder algo importante, puede establecer el tiempo de división en algo largo, como 10 minutos, pero si ocurre un evento cerca del final de este intervalo de tiempo, está perdiendo espacio al almacenar los 9 minutos de nada al principio.

Por lo tanto, mi idea por ahora es la siguiente: tendré un archivo grande que servirá como el búfer. Usaré un código que he encontrado para capturar los cuadros y guardarlos en el archivo yo mismo, envolviéndome al final. Cuando el usuario quiera conservar una parte, la marcaré con punteros al principio y al final en el búfer. La grabación puede continuar como antes, omitiendo las regiones marcadas para retención.

Después de que se detiene la grabación, o tal vez durante eso en una secuencia de fondo (dependiendo de la velocidad del teléfono/tarjeta) copiaré la región marcada a otro archivo y eliminaré la protección de sobrescritura.

Pregunta principal, si no le importan los detalles anteriores: Parece que no puedo encontrar una manera de convertir las tramas individuales a un archivo de video en el SDK de Android. ¿Es posible? Si no, ¿hay alguna biblioteca disponible, tal vez en código nativo, que pueda hacer esto?

Realmente no me importa el gran búfer de marcos sin comprimir, pero los videos exportados deben comprimirse en un formato compatible con Android. Pero si hay una forma de comprimir el buffer que me gustaría escuchar al respecto.

Gracias.

Respuesta

8

En Android MediaRecorder hay dos formas de especificar la salida. Uno es un nombre de archivo y otro es un FileDescriptor.

Usando el método estático fromSocket de ParcelFileDescriptor puede crear una instancia de ParcelFileDescriptor apuntando a un socket. Luego, llame al getFileDescriptor para obtener el FileDescriptor que se pasará al MediaRecorder.

Como puede obtener el video codificado del zócalo (como si estuviera creando un servidor web local), podrá acceder a fotogramas individuales del video, aunque no tan directamente, porque deberá decodificarlo primero.

+0

Parece una buena manera de obtener la transmisión de video codificado, gracias. Tendré que probar cómo funciona. Pero la decodificación de los marcos individuales usaría demasiada CPU, tal vez ni siquiera sería en tiempo real (codificación + decodificación al mismo tiempo) en algunos teléfonos. Así que creo que simplemente escribiré la secuencia codificada en un búfer de archivo circular, sin los encabezados y demás. Luego, durante la exportación, intentaré parchar los marcos codificados junto con un encabezado y crear un archivo de video válido. – lacop

+2

@albwq, ¿su método funcionó bien para usted? – Felix

+2

¿Puede proporcionarnos algún código de demostración? Será de gran ayuda ! =) –

Cuestiones relacionadas