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


Android captura de vídeo de cámara lenta

¿Cómo puedo capturar vídeo de cámara lenta en mi aplicación?

Intenté usar

  • Corregir archivo 3GP después de la transmisión desde Android Media Recorder
  • Grabación de llamadas - hacer que funcione en Nexus 5X (posible ROM o ROM personalizado)
  • Recarga de la vista previa de la cámara Android y registro de vídeo mediarecorder
  • No se puede realizar descodificación de bajo nivel de vídeo en Android 4.2 sin utilizar extractor de medios
  • Cómo grabar archivos de audio con mejor calidad en android?
  • Registro de video Android sin audio
  • mMediaRecorder.setVideoFrameRate(100); 

    Pero la aplicación se bloquea si establezco el valor 20 o más con IllegalStateException .

    He investigado mucho.Normal video es entre 24 y 30 fps.Para ver vídeo de cámara lenta que tenemos que capturar 100-120 fps, pero el dispositivo no permite that.But ver la cámara por defecto en mi dispositivo tiene una opción de cámara lenta .También algunas aplicaciones en la tienda de juego permiten crear vídeos de cámara lenta.También intenté establecer mayor setCaptureRate() , pero con ese video también modo normal es capturado. En pocos lugares se menciona que la película de cámara lenta se puede lograr a través de OpenCV/JavaCV Bibliotecas, pero no he podido entender cómo utilizar estas bibliotecas para capturar vídeo de cámara lenta en android?

  • No se puede configurar la memoria de invitados 'android_arm': argumento no válido
  • Combinar una imagen en un archivo de audio y hacer un archivo de vídeo en android mediante programación
  • Actualización de Android Studio -Error: No se pudo ejecutar la acción de compilación mediante la distribución de Gradle
  • Implementación de anuncios nativos en android mediante Admob? ¿Es posible?
  • Problema del tutorial de la API de Google Drive para Android
  • Mapa de bits en ImageView con esquinas redondeadas
  • 4 Solutions collect form web for “Android captura de vídeo de cámara lenta”

    Desde el origen que proporcionó (CamcorderProfile) , todo lo que tienes que hacer es AUMENTAR imágenes tomadas por segundo:

     mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW); 

    o

     mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH); 

    Por lo tanto, si usted toma una de 100 imágenes por segundo, y mostrar 25 Marcos por segundo, que el segundo grabado toma 4 segundos para mostrar

    Por favor, lea la documentación sobre la clase que está usando:

    Public static final int QUALITY_HIGH_SPEED_LOW

    Alta velocidad (> = 100fps) nivel de calidad correspondiente a la menor resolución disponible.

    Para todos los perfiles de alta velocidad definidos a continuación (de QUALITY_HIGH_SPEED_LOW a QUALITY_HIGH_SPEED_2160P), son similares a los perfiles de grabación normales, con una tasa de fotogramas de salida y una tasa de bits más altas, por lo tanto, configurando estos perfiles con setProfile (CamcorderProfile) sin especificar otros parámetros de codificación Producirá vídeos de alta velocidad en lugar de videos de cámara lenta que tengan diferentes velocidades de captura y salida (reproducción) Para grabar videos de cámara lenta, la aplicación debe establecer la velocidad de cuadro y velocidad de bits de salida de video adecuadamente mediante setVideoFrameRate (int) y setVideoEncodingBitRate (Int) basado en el factor de movimiento lento.Si la aplicación tiene la intención de hacer la grabación de vídeo con el codificador MediaCodec, debe configurar cada campo individual de MediaFormat de manera similar de acuerdo con este CamcorderProfile.

    Pruebe este código.

     myCamera = getCameraInstance(); mediaRecorder = new MediaRecorder(); myCamera.unlock(); mediaRecorder.setCamera(myCamera); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); mediaRecorder.setPreviewDisplay(mSurfaceView.getHolder().getSurface()); 

    Lo que funcionó para mí fue poner más alto la tasa de captura de mMediaRecorder como:

     mMediaRecorder.setVideoFrameRate(profile.videoFrameRate / 2); mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate / 2); mMediaRecorder.setCaptureRate(profile.videoFrameRate); 

    Donde profile es el CamcorderProfile establecido con QUALITY_HIGH (No puedo tener más desde que estoy usando un LG G2, API 19).

    Aquí en mi caso, profile.videoFrameRate es igual a 30.

    Más información sobre setCaptureRate en la documentación oficial:

    Establecer velocidad de captura de fotogramas de vídeo. Esto se puede usar para establecer una tasa de captura de fotogramas de video diferente a la velocidad de reproducción del video grabado. Este método también establece el modo de grabación a lapso de tiempo. En el lapso de tiempo de grabación de vídeo, sólo se graba vídeo. Los parámetros relacionados con el audio se ignoran cuando se inicia una sesión de grabación en intervalos de tiempo, si una aplicación los establece.

    El resultado de video grabado es el doble de largo que la captura inicial. Sin embargo, el ajuste de la velocidad de captura inhabilita el audio. En mi caso, mi tasa máxima fps parece ser de 30fps, y luego se reproduce a 15fps.

    Espero eso ayude.

    Aunque no soy capaz de capturar lenta cámara lenta sin sacudidas, pero soy capaz de convertir el vídeo capturado en cámara lenta con ffmpeg que sale a ser muy suave y uniforme. Para integrar FFmpeg en android podemos utilizar las bibliotecas precompiladas como ffmpeg-android .

    Según el caso en cuestión, podemos capturar vídeo desde la cámara y luego convertirlo en cámara lenta con ffmpeg.

    Para crear un video de cámara lenta podemos usar el siguiente comando-

     String[] complexCommand = {"-y", "-i", inputFileAbsolutePath, "-filter_complex", "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]", "-map", "[v]", "-map", "[a]", "-b:v", "2097k", "-r", "60", "-vcodec", "mpeg4", outputFileAbsolutePath}; 

    Aquí,

    Y

    Sobrescribir archivos de salida sin preguntar

    -yo

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

    -mapa

    Las etiquetas de enlace de salida se denominan con -map.

    Bb

    Establecer la velocidad de bits de vídeo

    R

    Establecer velocidad de fotogramas

    -vcodec

    Establecer el códec de vídeo

    -filter_complex filtergraph

    Definir un filtro de filtro complejo, es decir, uno con un número arbitrario de entradas y / o salidas. El filtro funciona cambiando la marca de tiempo de presentación (PTS) de cada trama de video. Para ralentizar su video, tiene que usar un multiplicador mayor que 1. Por ejemplo, si hay dos tramas sucesivas mostradas en las marcas de tiempo 1 y 2, y usted Quieren ralentizar el video, esos timestamps necesitan ser 2 y 4, respectivamente. Así, tenemos que multiplicarlos por 2.0.

    Puede acelerar o ralentizar el audio con el filtro de audio atemto. El filtro atempo está limitado a usar valores entre 0,5 y 2,0 (por lo que puede reducirlo a no menos de la mitad de la velocidad original y acelerar hasta no más del doble La entrada). Para ralentizar el audio a la mitad de su velocidad tenemos que usar el valor atempo 0.5.

    Echa un vistazo a este tutorial editor de vídeo fffmpeg que he escrito en mi blog que incluye la creación de vídeo de cámara lenta y el código completo para el tutorial aquí .

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