Verwenden Sie Java FFMPEG, um Dateien von einem Format in ein anderes zu konvertieren
-
Das
Fast-Forward MPEG
(FFMPEG) - Verwenden Sie die Java-Laufzeit zum Ausführen von FFMPEG, um Dateien von einem Format in ein anderes zu konvertieren
- Java-Wrapper zur Verwendung von FFMPEG
- Grund für die Priorisierung der Java-Laufzeit zur Ausführung von FFMPEG über den Java-FFMPEG-Wrapper oder umgekehrt
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:
- Java 18.0.1.1
- MongoDB 5.0.8
- NetBeans IDE 13
- 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.