Use Java FFMPEG para convertir archivos de un formato a otro

Mehvish Ashiq 12 octubre 2023
  1. El MPEG de avance rápido (FFMPEG)
  2. Use Java Runtime para ejecutar FFMPEG para convertir archivos de un formato a otro
  3. Contenedor de Java para usar FFMPEG
  4. Razón para priorizar Java Runtime para ejecutar FFMPEG sobre Java FFMPEG Wrapper o viceversa
Use Java FFMPEG para convertir archivos de un formato a otro

El FFMPEG es lo mejor para un creador de contenido o para el que interactúa con archivos multimedia la mayor parte del tiempo.

Hoy, exploraremos cómo transformar archivos multimedia utilizando el envoltorio FFMPEG de Java y el tiempo de ejecución de Java para ejecutar FFMPEG desde la línea de comandos. También exploraremos algunas razones para priorizar una sobre la otra.

El MPEG de avance rápido (FFMPEG)

El Fast-Forward MPEG (FFMPEG) es un marco multimedia gratuito y de código abierto que podemos usar para codificar, decodificar, mux, demux, transcodificar, filtrar, transmitir y reproducir muchos archivos multimedia que se han creado todavía.

Podemos usar FFMPEG en Windows, macOS X, Solaris y Linux y hacer muchas cosas usando FFMPEG. Incluye rotar, recortar, recortar, invertir video, agregar filtros a video, comprimir audio, comprimir video, cambiar el tamaño del archivo multimedia, aparecer/desaparecer gradualmente, convertir video a diferentes formatos y muchos otros.

Podemos utilizar cualquiera de ellos en función de lo que necesite nuestro proyecto. El FFMPEG se usa detrás de escena en proyectos de software relacionados con los medios y también se usa como parte interna de muchos programas, incluidos iTunes, Plex, Blender, YouTube, VLC Media Player, etc.

Use Java Runtime para ejecutar FFMPEG para convertir archivos de un formato a otro

Aquí, estamos utilizando el tiempo de ejecución de Java para ejecutar FFMPEG para aprender varias funcionalidades, como convertir, reducir el tamaño de los archivos, agregar audio, extraer audio, recortar archivos multimedia, etc.

Para hacer eso, debemos tener FFMPEG instalado en nuestra máquina. Puedes descargarlo desde su sitio web oficial si no lo tienes.

Una vez descargado e instalado, ya podemos ejecutar varios comandos para practicar. Algunos de ellos se dan a continuación:

Convertir formato de contenedor:

/*
By using this command, we are not converting the video
into different codecs but changing the container format
to contain the same video as the input file.
*/
ffmpeg - i input.mkv output1.mp4

Convertir códec de video y audio:

/*
This command converts the input video file into
`vp9` codec and the audio contained in that container
into the `vorbis ogg` format.
*/
ffmpeg - i input.mkv - c : v vp9 - c : a libvorbis output2.webm

Convierta solo el códec de video:

/*
This command converts the video codec to `vp9` and keeps
the audio codec as it is.
*/
ffmpeg - i input.mkv - c : v vp9 - c : a copy output3.webm

Convierta solo el códec de audio:

/*
Here, we convert the audio codec to `libvorbis`
and keep the video codec as it is.
*/
ffmpeg - i input.mkv - c : v copy - c : a libvorbis output4.mkv

Reducir la tasa de bits:

/*
This command keeps the audio codec as it is, converts
the video codec to `libx264` by reducing the bitrate to `1M`.
*/
ffmpeg - i input.mkv - c : a copy - c : v libx264 - b : v 1M output5.mp4

Reduzca la velocidad de fotogramas para reducir el tamaño del archivo:

/*
This command keeps the audio codec as it is, converts the video
the codec to `libx264` and reduce the fps to 24.
*/
ffmpeg - i input.mkv - c : a copy - c : v libx264 - r 24 output6.mp4

Reducir resolución:

/*
This command keeps the audio codec as it is, converts the video
the codec to `libx264` reduces the resolution to `848x480`.
*/
ffmpeg - i input.mkv - c : a copy - c : v libx264 - s 848x480 output.mp4

Reduzca la tasa de bits, la resolución y la tasa de cuadros:

/*
This command keeps the audio codec as it is, converts the video
the codec to `libx264`, reduce the resolution to `848x480`, and bitrate for the video to `1M`, and
change fps to 30.
*/
ffmpeg - i input.mkv - c : a copy - c : v libx264 - b : v 1M - r 30 - s 848x480 output.mp4

Recortar archivo de vídeo:

/*
This command trims the video length to 10 seconds, starting
from the given beginning point.
*/
ffmpeg - i input.mkv - ss 00 : 00 : 10 - t 10 output.mkv

Extraer audio:

// it extracts the audio from a video file
ffmpeg - i input.mkv - vn output.m4a

Cambiar la velocidad del audio:

// it speeds up the audio
ffmpeg - i input.mkv - filter : a "atempo=2.0" - vn output.mkv

Cambiar la velocidad del video:

// it changes the speed of the video
ffmpeg - i input.mkv - filter : v "setpts=0.125*PTS" output.mp4

A continuación se encuentra la descripción de cada indicador que usamos en los comandos ffmpeg anteriores.

Bandera Descripción
ffmpeg el nombre del comando que estamos usando.
-i el archivo de entrada seguido de la ruta del archivo de entrada. En nuestro caso, tenemos el archivo de entrada en el mismo directorio. Entonces, solo estamos escribiendo su nombre como input.mkv.
-c:v el códec para el archivo de video.
-c:a el códec para el archivo de audio.
copy mantenga el códec tal como está en función de su uso. Mantendrá el mismo códec para el archivo de video si se usa como -c:v copy; en cambio, si lo usamos como -c:a copy, mantendrá la pista de audio tal como está.
-b:v tasa de bits para el archivo de video.
1M la tasa de bits dada que queremos tener después de ejecutar el comando.
-r la velocidad de fotogramas (fps) seguida por el número de velocidad de fotogramas.
-s cambio de tamaño seguido del nuevo tamaño, 848x480.
-ss la marca de tiempo de inicio, mientras que -t especifica la duración real del clip en segundos.
-vn no hay video. Solo extrae el audio del archivo de entrada.
atempo Se utiliza para ralentizar o acelerar el audio.
-filter:a / -filter:v filtrar el audio y el video, respectivamente.
setpts establecer la marca de tiempo de presentación.
vp9 / libx264 los códecs para el archivo de video.
libvorbis el códec para el archivo de audio.

Contenedor de Java para usar FFMPEG

Aquí, estamos usando las siguientes herramientas:

  1. Java 18.0.1.1
  2. MongoDB 5.0.8
  3. NetBeans IDE 13
  4. Maven para instalar dependencias

Código de ejemplo:

// replace the package with your own if you have
package com.voidtesting.ffmpeg_java_wrapper;

// import necessary libraries
import java.io.File;
import java.io.IOException;

// FFMPEG_Java_Wrapper class
public class FFMPEG_Java_Wrapper {
  // main
  public static void main(String[] args) {
    // try block
    try {
      // create process
      Runtime rt = Runtime.getRuntime();
      // save the location
      File folder = new File("C:\\Users\\DelftStack\\Desktop\\MediaFiles");
      // save all files in an array that are retrieved from the specified folder
      File[] file = folder.listFiles();

      /*
      for each filename, open the command prompt
      and execute the specified command.
       */
      for (int i = 0; i < file.length; i++) {
        rt.exec("cmd.exe /c start "
                + "ffmpeg -i " + file[i].getName() + " -vn output" + (i + 1) + ".m4a",
            null, folder);
      } // end for

    } // end try
    catch (IOException e) {
      System.out.println(e);
    } // end catch

  } // end main
} // end FFMPEG_Java_Wrapper

Este código iterará sobre todos los archivos de video en el directorio especificado, extraerá el audio de ellos y los guardará en el directorio actual. Para ejecutar este código, tenemos que abrir el IDE cada vez y ejecutar el código.

¿Qué pasa si ejecutamos el código una sola vez y hacemos un archivo .jar para uso futuro? Para ello, añadimos el siguiente código en el archivo pom.xml.

Código de ejemplo:

<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>
                               <!--make sure to replace the name
                                   of your Main file here-->
                               com.voidtesting.ffmpeg_java_wrapper
                                .FFMPEG_Java_Wrapper
                            </mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Después de ejecutar el código, todos los archivos .jar para este proyecto específico se guardarán en el directorio predeterminado de Maven, que es C:\Users\AdministratorName\.m2\repository.

Como hemos guardado nuestros archivos en el paquete com.voidtesting.ffmpeg_java_wrapper, nuestro archivo .jar estaría en la siguiente ruta:

C:\Users\Dell\\.m2\repository\com\voidtesting\ffmpeg_java_wrapper\FFMPEG_Java_Wrapper\1.0-SNAPSHOT

Asegúrese de seleccionar el archivo que se parece a yourFileName-1.0-SNAPSHOT-jar-with-dependencies. Podemos colocar ese archivo en cualquier lugar de la máquina y ejecutarlo de la siguiente manera:

java -jar FFMPEG_Java_Wrapper-1.0-SNAPSHOT-jar-with-dependencies.jar

Razón para priorizar Java Runtime para ejecutar FFMPEG sobre Java FFMPEG Wrapper o viceversa

Este es un punto de opinión que difiere de persona a persona, pero hay una respuesta muy clara.

Si queremos usar FFMPEG programáticamente y resolver problemas dentro de la aplicación Java, optamos por el envoltorio Java FFMPEG. Aquí, podemos definir nuestra lógica en función de nuestros requisitos o usar API ya escritas para completar nuestras tareas.

Mediante el uso de API, podemos lograr seguridad en tiempo de compilación, llamar a métodos integrados y mucho más. Si no queremos meternos con las API y buscar soluciones simples, entonces se prefiere la opción CLI.

Aquí, escribimos los comandos manualmente para realizar las tareas. Solo piense, si tenemos que escribir miles de comandos para un proyecto complejo todos los días.

Para abreviar, CLI solo es útil para proyectos fáciles y simples, pero Java Wrapper es útil para automatizar cosas y beneficioso para proyectos complejos.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook