java ffmpeg runtime.exec

usar el envoltorio java-ffmpeg, o simplemente usar java runtime para ejecutar ffmpeg?



wrapper ffmpeg java (8)

Soy bastante nuevo en Java, necesito escribir un programa que escuche las instrucciones de conversión de video y convierta el video una vez que llegue una nueva instrucción (las instrucciones se almacenan en Amazon SQS, pero es irrelevante para mi pregunta)

Estoy enfrentando una opción, ya sea usar Java RunTime para ejecutar la conversión ''ffmpeg'' (como desde la línea de comandos), o puedo usar un contenedor ffmpeg escrito en Java http://fmj-sf.net/ffmpeg-java/getting_started.php

Preferiría mucho usar Java Runtime para ejecutar ffmpeg directamente, y evitar usar java-ffmpeg wrapper ya que tengo que aprender la biblioteca. así que mi pregunta es si hay algún beneficio al utilizar java-ffmpeg wrapper sobre exec ffmpeg directamente usando Runtime? No necesito ffmpeg para reproducir videos, solo convierta videos

Gracias


Además, a partir de Xuggler 3.3, Xuggler es LGPL lo que significa que no necesita una licencia comercial.


Escribí mi propia envoltura de línea de comandos de Java ffmpeg: Jaffree . Funciona tanto con ffprobe como con ffmpeg y es compatible con la producción y el consumo de video programático. También, en mi opinión, tiene una API fluida más conveniente.

Aquí hay un ejemplo de uso de ffprobe:

FFprobeResult result = FFprobe.atPath(BIN) .setInputPath(VIDEO_MP4) .setShowStreams(true) .setShowError(true) .execute(); if (result.getError() != null) { //TODO handle ffprobe error message return; } for (Stream stream : probe.getStreams().getStream()) { //TODO analyze stream data } ProgressListener listener = new ProgressListener() { @Override public void onProgress(FFmpegProgress progress) { //TODO handle progress data } };

Y esto es para ffmpeg:

FFmpegResult result = FFmpeg.atPath(BIN) .addInput(Input.fromPath(VIDEO_MP4)) .addOutput(Output.toPath(outputPath) .addCodec(null, "copy") ) .setProgressListener(listener) .execute();


Hay muchas bibliotecas de Java que proporcionan contenedores FFMPEG. Sin embargo, la mayoría de estas bibliotecas desafortunadamente están desactualizadas y usan versiones antiguas de FFMPEG que carecen de algunos códecs importantes (por ejemplo, Xuggler, video humilde, JavaAV, JavaAVC y jave). ¡Así que ten cuidado cuando uses esos proyectos!

Sin embargo, hay una envoltura FFMPEG que todavía está desarrollada activamente y también es compatible con FFMPEG 3 :

Alternativamente, puede usar un contenedor para la interfaz de línea de comando de FFMPEG, como https://github.com/bramp/ffmpeg-cli-wrapper . Luego está en sus manos actualizar ffmpeg manualmente sin tener que esperar a una nueva versión de la biblioteca contenedora.


Lo intento de varias maneras, la más simple para mí es ffmpeg-cli-wrapper, porque usa ffmpeg predeterminado o específico, además puedes configurar muchas configuraciones como scale, bitrate ... get duration ... JAVE de sauronsoftware make lot de error, XUGGLE y otros lo encontré demasiado complicado


Los beneficios de usar el envoltorio serían principalmente que ofrece funcionalidad más detallada y no accesible a través de la línea de comando (no es relevante para usted) y facilita el control de errores y el control de estado; tendrá que analizar el estándar de la herramienta de línea de comandos. salida y secuencias de error.


Si no me equivoco, el proyecto "ffmpeg wrapper" al que se ha vinculado está desactualizado y no se mantiene. ffmpeg es un proyecto muy activo, muchos cambios y lanzamientos todo el tiempo.

Debería mirar el proyecto Xuggler, esto proporciona una API Java para lo que quiere hacer, y tienen una estrecha integración con ffmpeg.

http://www.xuggle.com/xuggler/

Si elige ir a la ruta Runtime.exec (), este subproceso Red5 debería ser útil:

http://www.nabble.com/java-call-ffmpeg-ts15886850.html


Yo también estoy buscando algo para envolver FFMPEG en Java. Mientras buscaba, encontré esto: https://github.com/bramp/ffmpeg-cli-wrapper .

A partir de hoy, parece haber sido modificado hace un mes. Por lo tanto, con suerte se quedará por un tiempo.

Una muestra de sus documentos:

FFmpeg ffmpeg = new FFmpeg("/path/to/ffmpeg"); FFprobe ffprobe = new FFprobe("/path/to/ffprobe"); FFmpegBuilder builder = new FFmpegBuilder() .setInput(in) .overrideOutputFiles(true) .addOutput("output.mp4") .setFormat("mp4") .setTargetSize(250000) .disableSubtitle() .setAudioChannels(1) .setAudioCodec("libfdk_aac") .setAudioRate(48000) .setAudioBitrate(32768) .setVideoCodec("libx264") .setVideoFramerate(Fraction.getFraction(24, 1)) .setVideoResolution(640, 480) .setStrict(FFmpegBuilder.Strict.EXPERIMENTAL) .done(); FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe); executor.createTwoPassJob(builder).run();