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.
- Estabilización de video en tiempo real
- Obtener flujo de vídeo IP Cam en Android (MJEPG)
- Cómo tomar fotos mediante programación mientras graba vídeo utilizando la API de Camera2 en Andorid
- Uso de ambas cámaras en android: "No se puede conectar al servicio de cámara"
- Cómo seleccionar el video de la galería y recortar / cambiar el tamaño, al igual que el recorte de imágenes en android
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!
- Utilice MediaCodec y MediaExtractor para decodificar y codificar vídeo
- La parada del mediarecorder de Android falló
- Sube video grande a un servidor PHP desde Android Crashes Application
- Android MediaPlayer Streaming desde un redireccionamiento PHP no funciona-out!
- Android: silencie el micrófono mientras graba vídeo
- Android - vídeo de la cámara verticalmente volteado
- Conversión de imágenes en vídeo
- ¿Hay una manera de hacer que VideoView siga jugando en segundo plano en la aplicación para Android?
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.
- cómo comprobar si el servicio se está ejecutando o no
- Cómo obtener todos los permisos otorgados de una aplicación