studio programacion herramientas fundamentos con avanzado aplicaciones android video camera frame photo

programacion - extraer todos los marcos de video en Android



manual de android en pdf (3)

Grabé un video por tiempo limitado. Ahora quiero buscar todos los cuadros de video. Estoy usando el siguiente código y al usarlo puedo obtener marcos pero no recibo todos los marcos de video. Se repiten de 3 a 4 cuadros, luego obtuve un marco diferente. Pero como todos sabemos, podemos obtener de 25 a 30 fotogramas por segundo para mostrar un video fluido. Cómo obtener todos los marcos

for (int i = 0; i < 30; i++) { Bitmap bArray = mediaMetadataRetriever.getFrameAtTime( 1000000 * i, MediaMetadataRetriever.OPTION_CLOSEST); savebitmap(bArray, 33333 * i); }

No quiero usar NDK. Conseguí este enlace no sé cuál debería ser el valor para "argb8888". Estoy recibiendo un error aquí. ¿Alguien puede explicar cómo hacerlo? Obtener marcos de la imagen de video en Android


Necesitas hacer :

  1. Decodifica el video.
  2. Presente las imágenes decodificadas al menos tan rápido como 24 imágenes / segundo. Supongo que puedes saltearte este paso.
  3. Guarde las imágenes decodificadas.

Parece que decodificar el video sería el paso más desafiante. Las personas y las empresas han pasado años desarrollando códecs (codificador / decodificador) para varios formatos de video.

Use esta biblioteca JMF para FFMPEG .


Me enfrenté al mismo problema antes y el MediaMetadataRetriever de Android parece no apropiado para esta tarea, ya que no tiene una buena precisión. Usé una biblioteca llamada "FFmpegMediaMetadataRetriever" en android studio:

  1. Agregue esta línea en su build.graddle debajo de la aplicación del módulo:

compilar ''com.github.wseemann: FFmpegMediaMetadataRetriever: 1.0.1''

  1. Reconstruye tu proyecto.
  2. Utilice la clase FFmpegMediaMetadataRetriever para captar marcos con mayor precisión:

    FFmpegMediaMetadataRetriever med = new FFmpegMediaMetadataRetriever (); med.setDataSource ("su fuente de datos");

y en tu ciclo puedes agarrar un marco usando:

Bitmap bmp = med.getFrameAtTime(i*1000000, FFmpegMediaMetadataRetriever.OPTION_CLOSEST);


Para obtener marcos de imágenes de video, podemos usar ffmpeg. Para integrar FFmpeg en Android, podemos usar bibliotecas precompiladas como ffmpeg-android .

Para extraer marcos de imagen de un video, podemos usar el comando debajo

String [] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-an", "-r", "1/2", "-ss", "" + startMs / 1000, "-t" , "" + (endMs - startMs) / 1000, outputFileAbsolutePath};

Aquí,

-y

Sobrescribir archivos de salida

-yo

ffmpeg lee desde un número arbitrario de "archivos" de entrada especificados por la opción -i

-un

Deshabilita la grabación de audio.

-r

Establecer velocidad de fotogramas

-ss

busca posicionarse

-t

limitar la duración de los datos leídos del archivo de entrada

Aquí, en lugar de inputFileAbsolutePath, debe especificar la ruta absoluta del archivo de video desde el que desea extraer las imágenes.

Para ver el código completo, consulte esto en mi repositorio. Método extractImagesVideo() Estoy ejecutando el comando para extraer imágenes de video.

Para obtener un tutorial completo sobre la integración de la biblioteca ffmpeg y el uso de comandos ffmpeg para editar videos, consulte esta publicación que he escrito en mi blog.