Verwenden Sie Java FFMPEG, um Dateien von einem Format in ein anderes zu konvertieren

Mehvish Ashiq 12 Oktober 2023
  1. Das Fast-Forward MPEG (FFMPEG)
  2. Verwenden Sie die Java-Laufzeit zum Ausführen von FFMPEG, um Dateien von einem Format in ein anderes zu konvertieren
  3. Java-Wrapper zur Verwendung von FFMPEG
  4. Grund für die Priorisierung der Java-Laufzeit zur Ausführung von FFMPEG über den Java-FFMPEG-Wrapper oder umgekehrt
Verwenden Sie Java FFMPEG, um Dateien von einem Format in ein anderes zu konvertieren

Das FFMPEG ist das Beste für einen Ersteller von Inhalten oder für jemanden, der die meiste Zeit mit Mediendateien interagiert.

Heute werden wir untersuchen, wie Mediendateien mithilfe des Java FFMPEG-Wrappers und der Java-Laufzeit transformiert werden, um FFMPEG über die Befehlszeile auszuführen. Wir werden auch einige Gründe untersuchen, um eine gegenüber der anderen zu priorisieren.

Das Fast-Forward MPEG (FFMPEG)

Fast-Forward MPEG (FFMPEG) ist ein quelloffenes und kostenloses Multimedia-Framework, mit dem wir viele bisher erstellte Multimedia-Dateien kodieren, dekodieren, muxen, demuxen, transkodieren, filtern, streamen und abspielen können.

Wir können FFMPEG unter Windows, macOS X, Solaris und Linux verwenden und viele Dinge mit FFMPEG erledigen. Es umfasst Drehen, Trimmen, Zuschneiden, Umkehren von Videos, Hinzufügen von Filtern zu Videos, Audiokomprimierung, Videokomprimierung, Größenänderung der Mediendatei, Ein- und Ausblenden, Konvertieren von Videos in verschiedene Formate und vieles mehr.

Wir können jede davon verwenden, je nachdem, was unser Projekt benötigt. Das FFMPEG wird hinter den Kulissen in medienbezogenen Softwareprojekten verwendet und wird auch als interner Bestandteil vieler Software verwendet, einschließlich iTunes, Plex, Blender, YouTube, VLC Media Player usw.

Verwenden Sie die Java-Laufzeit zum Ausführen von FFMPEG, um Dateien von einem Format in ein anderes zu konvertieren

Hier verwenden wir die Java-Laufzeit, um FFMPEG auszuführen, um verschiedene Funktionen wie Konvertieren, Reduzieren der Dateigröße, Hinzufügen von Audio, Extrahieren von Audio, Trimmen von Mediendateien usw. zu erlernen.

Dazu muss FFMPEG auf unserem Rechner installiert sein. Sie können es von seiner offiziellen Website herunterladen, wenn Sie es nicht haben.

Sobald es heruntergeladen und installiert ist, können wir nun verschiedene Befehle zum Üben ausführen. Einige von ihnen sind unten aufgeführt:

Containerformat konvertieren:

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

Video- und Audio-Codec konvertieren:

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

Konvertieren Sie nur den Video-Codec:

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

Konvertieren Sie nur den Audio-Codec:

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

Bitrate reduzieren:

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

Reduzieren Sie die Bildrate, um die Dateigröße zu reduzieren:

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

Auflösung reduzieren:

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

Reduzieren Sie Bitrate, Auflösung und Framerate:

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

Videodatei zuschneiden:

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

Audio extrahieren:

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

Audiogeschwindigkeit ändern:

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

Geschwindigkeit des Videos ändern:

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

Im Folgenden finden Sie die Beschreibung aller Flags, die wir in den obigen ffmpeg-Befehlen verwendet haben.

Flagge Beschreibung
ffmpeg der Befehlsname, den wir verwenden.
-i die Eingabedatei, gefolgt vom Pfad der Eingabedatei. In unserem Fall haben wir die Eingabedatei im selben Verzeichnis. Also schreiben wir seinen Namen einfach als input.mkv.
-c:v den Codec für die Videodatei.
-c:a den Codec für die Audiodatei.
copy Behalten Sie den Codec bei, da er auf seiner Verwendung basiert. Der Codec für die Videodatei bleibt gleich, wenn er als -c:v copy verwendet wird; Wenn wir es andererseits als -c:a copy verwenden, behält es die Audiospur so wie sie ist.
-b:v Bitrate für die Videodatei.
1M die angegebene Bitrate, die wir nach der Ausführung des Befehls haben möchten.
-r die Framerate (fps), gefolgt von der Anzahl der Framerate.
-s Größenwechsel gefolgt von der neuen Größe 848x480.
-ss den Startzeitstempel, während -t die tatsächliche Dauer des Clips in Sekunden angibt.
-vn kein Video. Es extrahiert nur das Audio aus der Eingabedatei.
atempo verwendet, um den Ton zu verlangsamen oder zu beschleunigen.
-filter:a / -filter:v Filtern Sie das Audio bzw. Video.
setpts Präsentationszeitstempel setzen.
vp9 / libx264 die Codecs für die Videodatei.
libvorbis den Codec für die Audiodatei.

Java-Wrapper zur Verwendung von FFMPEG

Dabei verwenden wir folgende Tools:

  1. Java 18.0.1.1
  2. MongoDB 5.0.8
  3. NetBeans IDE 13
  4. Maven zur Installation von Abhängigkeiten

Beispielcode:

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

Dieser Code durchläuft alle Videodateien im angegebenen Verzeichnis, extrahiert das Audio daraus und speichert sie im aktuellen Verzeichnis. Um diesen Code auszuführen, müssen wir jedes Mal die IDE öffnen und den Code ausführen.

Was wäre, wenn wir den Code nur einmal ausführen und eine .jar-Datei für die zukünftige Verwendung erstellen? Dazu fügen wir den folgenden Code in die Datei pom.xml ein.

Beispielcode:

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

Nach dem Ausführen des Codes werden alle .jar-Dateien für dieses spezifische Projekt im Standardverzeichnis von Maven gespeichert, das C:\Users\AdministratorName\.m2\repository ist.

Da wir unsere Dateien im Paket com.voidtesting.ffmpeg_java_wrapper gespeichert haben, würde sich unsere .jar-Datei auf folgendem Pfad befinden:

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

Stellen Sie sicher, dass Sie die Datei auswählen, die wie folgt aussieht: yourFileName-1.0-SNAPSHOT-jar-with-dependencies. Wir können diese Datei irgendwo auf der Maschine platzieren und wie folgt ausführen:

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

Grund für die Priorisierung der Java-Laufzeit zur Ausführung von FFMPEG über den Java-FFMPEG-Wrapper oder umgekehrt

Dies ist ein eigensinniger Punkt, der von Person zu Person unterschiedlich ist, aber es gibt eine glasklare Antwort darauf.

Wenn wir FFMPEG programmgesteuert verwenden und Probleme innerhalb der Java-Anwendung lösen möchten, entscheiden wir uns für den Java FFMPEG-Wrapper. Hier können wir unsere Logik basierend auf unseren Anforderungen definieren oder bereits geschriebene APIs verwenden, um unsere Aufgaben zu erledigen.

Durch die Verwendung von APIs können wir Kompilierzeitsicherheit erreichen, integrierte Methoden aufrufen und vieles mehr. Wenn wir uns nicht mit APIs herumschlagen wollen und nach einfachen Lösungen suchen, wird die CLI-Option bevorzugt.

Hier geben wir die Befehle manuell ein, um die Aufgaben auszuführen. Denken Sie nur, wenn wir jeden Tag Tausende von Befehlen für ein komplexes Projekt eingeben müssen?

Um es kurz zu machen, CLI ist nur für einfache und einfache Projekte nützlich, aber Java Wrapper ist nützlich, um Dinge zu automatisieren, und für komplexe Projekte von Vorteil.

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