Utiliser Java FFMPEG pour convertir des fichiers d'un format à un autre

Mehvish Ashiq 12 octobre 2023
  1. Le Fast-Forward MPEG (FFMPEG)
  2. Utiliser Java Runtime pour exécuter FFMPEG pour convertir des fichiers d’un format à un autre
  3. Wrapper Java pour utiliser le FFMPEG
  4. Raison de donner la priorité à Java Runtime pour exécuter FFMPEG sur Java FFMPEG Wrapper ou Vice Versa
Utiliser Java FFMPEG pour convertir des fichiers d'un format à un autre

Le FFMPEG est le meilleur pour un créateur de contenu ou celui qui interagit avec des fichiers multimédias la plupart du temps.

Aujourd’hui, nous allons explorer comment transformer des fichiers multimédias à l’aide de l’encapsuleur Java FFMPEG et de l’environnement d’exécution Java pour exécuter FFMPEG à partir de la ligne de commande. Nous explorerons également quelques raisons de privilégier l’un par rapport à l’autre.

Le Fast-Forward MPEG (FFMPEG)

Le Fast-Forward MPEG (FFMPEG) est un framework multimédia open-source et gratuit que nous pouvons utiliser pour encoder, décoder, multiplexer, démultiplexer, transcoder, filtrer, diffuser et lire de nombreux fichiers multimédias qui ont déjà été créés.

Nous pouvons utiliser FFMPEG sous Windows, macOS X, Solaris et Linux et faire beaucoup de choses en utilisant FFMPEG. Il comprend la rotation, le rognage, le recadrage, l’inversion de la vidéo, l’ajout de filtres à la vidéo, la compression audio, la compression vidéo, le redimensionnement du fichier multimédia, l’entrée/la sortie en fondu, la conversion de la vidéo en différents formats, et bien d’autres.

Nous pouvons utiliser n’importe lequel d’entre eux en fonction des besoins de notre projet. Le FFMPEG est utilisé dans les coulisses des projets logiciels liés aux médias et est également utilisé comme partie interne de nombreux logiciels, notamment iTunes, Plex, Blender, YouTube, VLC Media Player, etc.

Utiliser Java Runtime pour exécuter FFMPEG pour convertir des fichiers d’un format à un autre

Ici, nous utilisons le runtime Java pour exécuter le FFMPEG afin d’apprendre diverses fonctionnalités telles que la conversion, la réduction de la taille des fichiers, l’ajout d’audio, l’extraction d’audio, le découpage de fichiers multimédias, etc.

Pour ce faire, nous devons avoir FFMPEG installé sur notre machine. Vous pouvez le télécharger depuis son site officiel si vous ne l’avez pas.

Une fois téléchargé et installé, nous pouvons maintenant exécuter diverses commandes pour nous entraîner. Certains d’entre eux sont donnés ci-dessous:

Convertir le format du conteneur :

/*
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 le codec vidéo et 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

Convertir le codec vidéo uniquement :

/*
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

Convertir le codec audio uniquement :

/*
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

Réduire le débit :

/*
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

Réduisez la fréquence d’images pour réduire la taille du fichier :

/*
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

Réduire la résolution :

/*
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

Réduisez le débit binaire, la résolution et la fréquence d’images :

/*
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

Découper le fichier vidéo :

/*
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

Extraire le son :

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

Modifier la vitesse de l’audio :

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

Modifier la vitesse de la vidéo :

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

Voici la description de chaque indicateur que nous avons utilisé dans les commandes ffmpeg ci-dessus.

Drapeau La description
ffmpeg le nom de la commande que nous utilisons.
-i le fichier d’entrée suivi du chemin du fichier d’entrée. Dans notre cas, nous avons le fichier d’entrée dans le même répertoire. Donc, nous écrivons simplement son nom comme input.mkv.
-c:v le codec du fichier vidéo.
-c:a le codec du fichier audio.
copy conservez le codec tel qu’il est en fonction de son utilisation. Il conservera le même codec pour le fichier vidéo s’il est utilisé comme -c:v copy ; par contre, si on l’utilise comme copie -c:a, il gardera la piste audio telle quelle.
-b:v bitrate pour le fichier vidéo.
1M le débit binaire donné que nous voulons avoir après l’exécution de la commande.
-r le framerate (fps) suivi du nombre de framerate.
-s changement de taille suivi de la nouvelle taille, 848x480.
-ss l’horodatage de début, tandis que -t spécifie la durée réelle du clip en secondes.
-vn pas de vidéo. Il extrait uniquement l’audio du fichier d’entrée.
atempo utilisé pour ralentir ou accélérer le son.
-filter:a / -filter:v filtrer respectivement l’audio et la vidéo.
setpts définir l’horodatage de la présentation.
vp9 / libx264 les codecs du fichier vidéo.
libvorbis le codec du fichier audio.

Wrapper Java pour utiliser le FFMPEG

Ici, nous utilisons les outils suivants :

  1. Java 18.0.1.1
  2. MongoDB 5.0.8
  3. NetBeans IDE 13
  4. Maven pour installer les dépendances

Exemple de code :

// 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

Ce code itérera sur tous les fichiers vidéo du répertoire spécifié, en extraira l’audio et les enregistrera dans le répertoire courant. Pour exécuter ce code, nous devons ouvrir l’IDE à chaque fois et exécuter le code.

Et si nous n’exécutions le code qu’une seule fois et créions un fichier .jar pour une utilisation future ? Pour cela, nous ajoutons le code suivant dans le fichier pom.xml.

Exemple de code :

<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>

Après avoir exécuté le code, tous les fichiers .jar pour ce projet spécifique seront enregistrés dans le répertoire par défaut de Maven, qui est C:\Users\AdministratorName\.m2\repository.

Comme nous avons enregistré nos fichiers dans le package com.voidtesting.ffmpeg_java_wrapper, notre fichier .jar serait sur le chemin suivant :

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

Assurez-vous de sélectionner le fichier qui ressemble à votreNomDeFichier-1.0-SNAPSHOT-jar-with-dependencies. Nous pouvons placer ce fichier n’importe où sur la machine et l’exécuter comme suit :

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

Raison de donner la priorité à Java Runtime pour exécuter FFMPEG sur Java FFMPEG Wrapper ou Vice Versa

C’est un point d’opinion qui diffère d’une personne à l’autre, mais il y a une réponse limpide à cela.

Si nous voulons utiliser FFMPEG par programme et résoudre des problèmes dans l’application Java, nous optons pour le wrapper Java FFMPEG. Ici, nous pouvons définir notre logique en fonction de nos besoins ou utiliser des API déjà écrites pour accomplir nos tâches.

En utilisant des API, nous pouvons assurer la sécurité au moment de la compilation, appeler des méthodes intégrées et bien plus encore. Si nous ne voulons pas jouer avec les API et rechercher des solutions simples, l’option CLI est préférée.

Ici, nous tapons les commandes manuellement pour accomplir les tâches. Pensez-y, si nous devons taper chaque jour des milliers de commandes pour un projet complexe ?

Pour faire court, la CLI n’est utile que pour les projets faciles et simples, mais Java Wrapper est utile pour automatiser les choses et bénéfique pour les projets complexes.

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