Codificación de video Android con fr y manipulación de resolución

Quiero ser capaz de tomar un video grabado con un dispositivo Android y codificarlo a una nueva resolución y velocidad de fotogramas utilizando mi aplicación. El propósito es cargar una versión mucho más pequeña del video original (en tamaño), ya que será videos de 30 min o más.

Hasta ahora, he leído de la gente diciendo que FFmpeg es la manera de ir. Sin embargo, la documentación parece faltar.

También he considerado el uso de http opencv http://opencv.org/platforms/android.html

Teniendo en cuenta que necesito manipular la resolución de vídeo y la velocidad de fotogramas, ¿qué herramienta cree que puede hacer esas cosas mejor? ¿Hay alguna otra tecnología a considerar?

Una pregunta importante es, ya que esto será videos largos, es razonable hacer la codificación en un dispositivo android (Considere recursos de energía, tiempo, etc.)

¡Gracias por adelantado!

Decidí utilizar ffmpeg para abordar este proyecto. Después de mucha investigación y ensayos, no pude construir ffmpeg para la biblioteca (usando Ubuntu 14.04 LTS).

Sin embargo, he utilizado esta excelente biblioteca https://github.com/guardianproject/android-ffmpeg-java Acabo de crear un proyecto y agregó que la biblioteca y funciona como un encanto. No es necesario construir sus propios archivos o lío con el Android NDK. Por supuesto, usted todavía tendrá que construir la biblioteca usted mismo si desea personalizarlo. Pero tiene todo lo que necesito.

A continuación se muestra un ejemplo de cómo utilicé para reducir una resolución de vídeo y cambiar la velocidad de fotogramas:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // input source final Clip clip_in = new Clip("/storage/emulated/0/Developer/test.mp4"); Activity activity = (Activity) MainActivity.this; File fileTmp = activity.getCacheDir(); File fileAppRoot = new File(activity.getApplicationInfo().dataDir); final Clip clip_out = new Clip("/storage/emulated/0/Developer/result2.mp4"); //put flags in clip clip_out.videoFps = "30"; clip_out.width = 480; clip_out.height = 320; clip_out.videoCodec = "libx264"; clip_out.audioCodec = "copy"; try { FfmpegController fc = new FfmpegController(fileTmp, fileAppRoot); fc.processVideo(clip_in, clip_out, false, new ShellUtils.ShellCallback() { @Override public void shellOut(String shellLine) { System.out.println("MIX> " + shellLine); } @Override public void processComplete(int exitValue) { if (exitValue != 0) { System.err.println("concat non-zero exit: " + exitValue); Log.d("ffmpeg","Compilation error. FFmpeg failed"); Toast.makeText(MainActivity.this, "result: ffmpeg failed", Toast.LENGTH_LONG).show(); } else { if(new File( "/storage/emulated/0/Developer/result2.mp4").exists()) { Log.d("ffmpeg","Success file:"+ "/storage/emulated/0/Developer/result2.mp4"); } } } }); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // automated try and catch setContentView(R.layout.activity_main); } } 

La función processVideo produce un comando similar a ffmpeg -i input -s 480X320 -r 30 -vcodec libx264 -acodec copy output

Este es un ejemplo muy sencillo, pero ha generado el mismo tipo de conversión realizado por ffmpeg desktop. ¡Este código necesita mucho trabajo! Espero que ayude a cualquiera.

  • Cambiar el tamaño de la vista de la superficie para el cambio de la relación de aspecto en la visualización de vídeo en android
  • ¿Cómo las aplicaciones de Media Player para Android como MXPlayer y MoboPlayer reproducen formatos de archivo no soportados como MKV?
  • Servidor de la cámara fallecido - El error 100 persiste en algunos dispositivos
  • ¿Cómo grabar vídeo con sonido específico mediante programación en android?
  • Uso de surfaceView para capturar un video
  • Cómo convertir datos de video en base64
  • No se puede reproducir este vídeo
  • Compresión de video en android usando la nueva biblioteca de MediaCodec
  • MediaStore.EXTRA_DURATION_LIMIT ¿No funciona Nexus Devices?
  • La altura y el ancho de SurfaceView se ignoran
  • Android, Java - Renderización de un vídeo utilizando marcos de mapa de bits para invertir un vídeo (Xuggler)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.