Detaillierte Erklärung des Java-Aufrufs von ffmpeg zum Konvertieren des Videoformats in flv

Detaillierte Erklärung des Java-Aufrufs von ffmpeg zum Konvertieren des Videoformats in flv

Detaillierte Erklärung des Java-Aufrufs von ffmpeg zum Konvertieren des Videoformats in flv

Hinweis: Das folgende Programm läuft unter Linux. Wenn Sie rmvb unter Windows in avi konvertieren, treten Probleme auf. Um erfolgreich zu sein, müssen Sie die drv43260.dll herunterladen und unter C:WindowsSystem32 ablegen.

Ich schreibe in diesen Tagen ein Videoverwaltungssystem und bin auf ein großes Problem gestoßen: Wie konvertiere ich verschiedene Formate in das FLV-Format? Nach einiger Suche im Internet habe ich es selbst zusammengefasst, sortiert und organisiert und es schließlich herausgefunden! Es realisiert gleichzeitig die Funktionen Videokonvertierung, Video-Screenshot und Löschung von Originaldateien!

Das Hauptprinzip der Formatkonvertierung besteht darin, zuerst mit Java die FFMPEG-EXE-Datei aufzurufen!

Einige Formate können jedoch nicht von ffmpeg verarbeitet werden, z. B. rmvb. In diesem Fall können Sie zuerst mencoder aufrufen, um das Format in AVI zu konvertieren, und es dann in FLV konvertieren!

Ich schreibe hauptsächlich 3 Klassen: Conver.java

ConverBegin.java ConverVideo.java

Der Code von Conver.java lautet wie folgt:

Paket org.Conver;



importiere java.awt.BorderLayout;

importiere javax.swing.JFrame;
importiere javax.swing.JScrollPane;
importiere javax.swing.JTextArea;

@SuppressWarnings("Seriennummer")
öffentliche Klasse Conver erweitert JFrame{
öffentliches statisches JTextArea OutShowLog;
öffentliche Konvertierung() {
 setTitle("FLV-Konvertierung");
 Größe festlegen(500, 400);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 OutShowLog = neuer JTextArea();
 JScrollPane OutPane = neuesJScrollPane(OutShowLog);
 hinzufügen(OutPane,BorderLayout.CENTER);
 Sichtbar setzen(true);
}
öffentliche statische void main(String args[]) {
 neuer Konvertierer();
 ConverBegin cb = neues ConverBegin();
 cb.start();
}
}

Der ConverBegin.java-Code lautet wie folgt:

Paket org.Conver;



importiere java.io.File;

öffentliche Klasse ConverBegin erweitert Thread{
String[] ff;
öffentliche Leere ausführen(){
 während (wahr) {
 String-Ordnerpfad = "other/";
 //String-Pfad = null;
 Datei f = neueDatei(Ordnerpfad);
  wenn (f.isDirectory()) {
 ff = f.Liste();
 In diesem Beispiel wird die Variable in der Zeile "0" durch "0" ersetzt.
 während (i< ff.length) {
 neues ConverVideo(Ordnerpfad+ff[i]).beginConver();
 ich++;
 }
 Conver.OutShowLog.append("---------------Insgesamt konvertierte "+ff.length+"-----------Videos------------");
 ff =null;
 }
  f = null;
 
  versuchen {
 Thread.sleep(10000);
 } Fang (UnterbrocheneAusnahme) {
 //Wenn es fehlschlägt, starten Sie den Thread neu this.start();
 }
 }
 

}
}

Der Code von ConverBegin.java lautet wie folgt

Paket org.Conver;
importiere java.io.File;
importiere java.io.IOException;
importiere java.io.InputStream;
importiere java.util.Date;
importiere java.util.List;



öffentliche Klasse ConverVideo {
privates Datum dt;
private lange Anfangszeit;
privater String PATH;
private String filerealname; // Dateiname enthält keine Erweiterungprivate Stringfilename; // enthält Erweiterungprivate String videofolder = "other/"; // Verzeichnis mit anderen Videoformatenprivate String flvfolder ="flv/"; // flv-VideoverzeichnisprivateStringffmpegpath="ffmpeg/ffmpeg.exe"; // ffmpeg.exe-VerzeichnisprivateStringmencoderpath="ffmpeg/mencoder"; // mencoder-VerzeichnisprivateStringvideoRealPath="flv/"; // Screenshot-Videoverzeichnis;
 privateString imageRealPath = "img/"; //Speicherverzeichnis für Screenshots //privateString batrealpath = "ffmpeg/ffmpeg.bat"; //Bat-Verzeichnis publicConverVideo(){}
öffentliches ConverVideo(String-Pfad) {
 PATH = Pfad;
}
 publicString getPATH() {
 PFAD zurückgeben;
}

public void setPATH(String Pfad) {
 PATH = Pfad;
}
öffentliches Boolean beginConver(){
 Datei fi = neue Datei(PFAD);
 Dateiname = fi.getName();
 Dateirealname = Dateiname.Teilzeichenfolge(0,Dateiname.letzterIndexvon("."))
 .toLowerCase();
 Conver.OutShowLog.append("----Empfangene Datei ("+PATH+") muss konvertiert werden--------------------------");
 if (!checkfile(PFAD)) {
 Conver.OutShowLog.append(PATH+ "Datei existiert nicht"+" ");
 gibt false zurück;
 }
 dt = neues Datum();
 begintime = dt.getTime();
 Conver.OutShowLog.append("----Starten Sie die Konvertierung der Dateien ("+PATH+")--------------------------");
 wenn (Prozess()) {
 Datum dt2 = neues Datum();
 Conver.OutShowLog.append("Konvertierung erfolgreich");
 lange Endzeit =dt2.getTime();
 lange Zeitcha = (Endzeit - Beginnzeit);
 Zeichenfolge Gesamtzeit = SummeZeit(Zeitcha);
 Conver.OutShowLog.append("Geteilt: " + Gesamtzeit +" ");
  wenn(ProzessBild()) {
  Conver.OutShowLog.append("Screenshot erfolgreich");
  }anders {
  Conver.OutShowLog.append("Screenshot fehlgeschlagen");
 }
  PATH = null;
  gibt true zurück;
 }anders {
  PATH = null;
 gibt false zurück;
 }
}
öffentliches boolesches ProzessBild() {
// System.out.println(neuer Dateiname + "->" +newimg);
  Liste<String, String> = neue java.util.ArrayList();
  commend.add(ffmpegpfad);
  empfehlen.add("-i");
  commend.add(RealerVideopfad+RealerDateiname+".flv");
  commend.add("-y");
  commend.add("-f");
  commend.add("bild2");
  empfehlen.add("-ss");
  empfehlen.add("38");
  commend.add("-t");
  empfehlen.add("0.001");
  empfehlen.add("-s");
  empfehlen.add("320x240");
  commend.add(RealerBildpfad+RealerDateiname+".jpg");
 versuchen {
  ProcessBuilder-Builder = neuer ProcessBuilder();
  builder.command(Empfehlen);
  builder.start();
  gibt true zurück;
  } Fang (Ausnahme e) {
  e.printStackTrace();
  gibt false zurück;
  }
 }
privater boolescher Prozess() {
 int-Typ = checkContentType();
 Boolescher Status = falsch;
 wenn (Typ == 0) {

 // status =processFLV(PATH); // Datei direkt in FLV-Datei konvertieren status =processFLV(PATH);
 } sonst wenn (Typ == 1) {
 Zeichenfolge avifilepath = processAVI(Typ);
 wenn (avifilepath == null)
 Rückgabefalse;
 //AVI-Datei nicht erhalten, sonst {
 System.out.println("kaishizhuang");
 status =processFLV(avifilepath); // AVI in FLV konvertieren
 }
 }
 Rücksendestatus;
}

private int checkContentType() {
 Zeichenfolgentyp =PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length())
 .toLowerCase();
 //Formate, die ffmpeg analysieren kann: (asx, asf, mpg, wmv, 3gp, mp4, mov, avi, flv usw.)
 wenn (Typ.equals("avi")) {
 gebe 0 zurück;
 } sonst wenn (Typ.equals("mpg")) {
 gebe 0 zurück;
 } sonst wenn (Typ.equals("wmv")) {
 gebe 0 zurück;
 } sonst wenn (Typ.equals("3gp")) {
 gebe 0 zurück;
 } sonst wenn (Typ.equals("mov")) {
 gebe 0 zurück;
 } sonst wenn (Typ.equals("mp4")) {
 gebe 0 zurück;
 } sonst wenn (Typ.equals("asf")) {
 gebe 0 zurück;
 } sonst wenn (Typ.equals("asx")) {
 gebe 0 zurück;
 } sonst wenn (Typ.equals("flv")) {
 gebe 0 zurück;
 }
 // Für Dateiformate, die ffmpeg nicht analysieren kann (wmv9, rm, rmvb usw.),
 // Sie können andere Tools (Mencoder) verwenden, um zuerst in das AVI-Format zu konvertieren (das von FFMPEG analysiert werden kann).
 sonst wenn (Typ.equals("wmv9")) {
 Rückgabe 1;
 } sonst wenn (Typ.equals("rm")) {
 Rückgabe 1;
 } sonst wenn (Typ.equals("rmvb")) {
 Rückgabe 1;
 }
 Rückgabe 9;
}

private boolean checkfile(String-Pfad) {
 Datei Datei = neue Datei(Pfad);
 wenn (!file.isFile()) {
 gibt false zurück;
 }anders {
 gibt true zurück;
 }
}

// Für Dateiformate, die ffmpeg nicht analysieren kann (wmv9, rm, rmvb usw.), können Sie zunächst andere Tools (Mencoder) verwenden, um sie in das AVI-Format zu konvertieren (das ffmpeg analysieren kann).
privater String processAVI(int Typ) {
 Liste<String, String> = neue java.util.ArrayList();
 
 commend.add(mencoderpfad);
 commend.add(PFAD);
 empfehlen.add("-oac");
 empfehlen.add("mp3lame");
 commend.add("-lameopts");
 commend.add("Vorgabe=64");
 empfehlen.add("-ovc");
 commend.add("xvid");
 commend.add("-xvidencopts");
 commend.add("bitrate=600");
 empfehlen.add("-von");
 commend.add("avi");
 empfehlen.add("-o");
 commend.add(Videoordner + tatsächlicher Dateiname + ".avi");
 // Befehlstyp: mencoder 1.rmvb -oac mp3lame -lameoptspreset=64 -ovc xvid
 // -xvidencopts Bitrate = 600 -of avi -ormvb.avi
 versuchen {
 ProcessBuilder-Builder = neuerProcessBuilder();
 builder.command(Empfehlen);
 Prozess p =builder.start();

 warte auf(p);
 gibt Videoordner + tatsächlichen Dateinamen + ".avi" zurück;
 } Fang (Ausnahme e) {
 e.printStackTrace();
 gibt null zurück;
 }
}

// Formate, die ffmpeg analysieren kann: (asx, asf, mpg, wmv, 3gp, mp4, mov, avi, flv usw.)
privater boolean processFLV(String alterDateipfad) {

 if (!checkfile(PFAD)) {
 System.out.println(oldfilepath+ " ist keine Datei");
 gibt false zurück;
 }

 Liste<String, String> = neue java.util.ArrayList();
 commend.add(ffmpegpfad);
 empfehlen.add("-i");
 commend.add(alterDateipfad);
 commend.add("-ab");
 empfehlen.add("64");
 commend.add("-acodec");
 empfehlen.add("mp3");
 empfehlen.add("-ac");
 empfehlen.add("2");
 empfehlen.add("-ar");
 empfehlen.add("22050");
 commend.add("-b");
 empfehlen.add("230");
 empfehlen.add("-r");
 empfehlen.add("24");
 commend.add("-y");
 commend.add(flv-Ordner + realer Dateiname + ".flv");
 versuchen {
 ProcessBuilder-Builder = neuerProcessBuilder();
 String cmd =commend.toString();
 builder.command(Empfehlen);
 //builder.redirectErrorStream(true);
 Prozess p =builder.start();
 warte auf(p);
 p.zerstören();
 löscheDatei(alterDateipfad);
 gibt true zurück;
 } Fang (Ausnahme e) {
 e.printStackTrace();
 gibt false zurück;
 }
}

öffentliche int doWaitFor(Prozess p)

{
 InputStream in = null;
 InputStream-Fehler = null;
 int exitValue = -1; // wird an den Anrufer zurückgegeben, wenn PIs beendet ist
 versuchen {
 System.out.println("kommt");
 in = p.getInputStream();
 Fehler =p.getErrorStream();
 boolean finished = false; //Auf true setzen, wenn p fertig ist

 während (!fertig) {
 versuchen {
 während (in.available() > 0) {
  //Drucken Sie die Ausgabe unseres Systemaufrufs
  Zeichen c = neues Zeichen ((Zeichen) in.read());
  System.out.print(c);
 }
 während (err.available() > 0) {
  //Drucken Sie die Ausgabe unseres Systemaufrufs
  Zeichen c = neues Zeichen ((char) err.read());
  System.out.print(c);
 }

 //Fragen Sie den Prozess nach seinem ExitValue. Wenn der Prozess
 // ist nicht fertig, eine IllegalThreadStateException
 // wird geworfen. Wenn es fertig ist, fallen wir durch und
 // die Variable „finished“ wird auf „true“ gesetzt.
 ExitValue = p.ExitValue();
 fertig = wahr;

 } Fang(IllegalThreadStateException e) {
 // Vorgang ist noch nicht abgeschlossen;
 // Schlafen Sie ein wenig, um CPU-Zyklen zu sparen
 Thread.currentThread().sleep(500);
 }
 }
 } Fang (Ausnahme e) {
 // unerwartete Ausnahme! Zum Debuggen ausdrucken …
 System.err.println("doWaitFor();: unerwartete Ausnahme - "
 + e.getMessage());
 Endlich
 versuchen {
 wenn(in!=null)
 {
 in.schließen();
 }
 
 } Fang (IOException e) {
 System.out.println(e.getMessage());
 }
 wenn(err!=null)
 {
 versuchen {
 err.schließen();
 } Fang(IOException e) {
 System.out.println(e.getMessage());
 }
 }
 }
 // Abschlussstatus an den Anrufer zurückgeben
 ExitValue zurückgeben;
}

public void deleteFile(String Dateipfad) {
 Datei Datei = neue Datei (Dateipfad);
 if (PATH.equals(Dateipfad)) {
 if (datei.löschen()) {
 System.out.println("Datei" + Dateipfad + "gelöscht");
 }
 } anders {
 if (datei.löschen()) {
 System.out.println("Datei" + Dateipfad + "gelöscht");
 }
 Datei filedelete2 = neueDatei(PFAD);
 wenn (filedelete2.delete()){
 System.out.println("Datei" + PFAD + "gelöscht");
 }
 }
}

öffentliche Zeichenfolge SummeZeit(lange ms) {
 Int ss = 1000;
 langes mi = ss * 60;
 lang hh = mi * 60;
 lang dd = hh * 24;

 langer Tag = ms / tt;
 lange Stunde = (ms - Tag * tt) / hh;
 lange Minute = (ms - Tag * tt - Stunde * hh) /mi;
 lange Sekunde = (ms - Tag * tt - Stunde * hh - Minute * mi) / ss;
 lange Millisekunde = ms - Tag * tt - Stunde * hh - Minute * mi - Sekunde
 * ss;

 String strDay = Tag < 10 ? "0" +Tag + "Tag" : "" + Tag + "Tag";
 String strHour = Stunde < 10 ? "0"+ Stunde + "Stunde" : "" + Stunde + "Stunde";
 String strMinute = Minute < 10 ?"0" + Minute + "Minute" : "" + Minute + "Minute";
 String strSecond = Sekunde < 10 ?"0" + Sekunde + "Sekunden" : "" + Sekunde + "Sekunden";
 String strMilliSecond = Millisekunde< 10 ? "0" + Millisekunde : ""
 +Millisekunde;
 strMilliSecond = Millisekunde <100 ? "0" + strMilliSecond + "Millisekunden" : ""
 +strMilliSecond + "Millisekunden";
 return strDay + " " + strHour + ":" + strMinute+ ":" + strSecond + " "
 +strMilliSekunde;

}
}

Wenn Sie Fragen haben, hinterlassen Sie bitte eine Nachricht oder kommen Sie zur Diskussion in die Community. Vielen Dank fürs Lesen und ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung dieser Site!

Das könnte Sie auch interessieren:
  • Java ruft ffmpeg auf, um Videos zu konvertieren
  • Java+Windows+ffmpeg zur Realisierung der Videokonvertierungsfunktion
  • So rufen Sie ffmpeg mit Java auf, um eine Videokonvertierung durchzuführen
  • Verwenden Sie das Open Source-Projekt JAVAE2, um Videoformate zu konvertieren

<<:  Schreiben Sie ein React-ähnliches Framework von Grund auf

>>:  Alibaba Cloud ESC Server Docker-Bereitstellung von Single Node Mysql

Artikel empfehlen

Lösen Sie das Problem, dass Docker das MySQL-Image zu langsam zieht

Nachdem wir eine halbe Stunde lang versucht hatte...

So passen Sie einen EventEmitter in node.js an

Inhaltsverzeichnis Vorwort 1. Was ist 2. So verwe...

Detaillierte Erklärung der Desktop-Anwendung mit Vue3 und Electron

Inhaltsverzeichnis Vue CLI erstellt ein Vue-Proje...

Docker-Datenverwaltung und Netzwerkkommunikationsnutzung

Sie können Docker installieren und einfache Vorgä...

Spezifische Verwendung des Vollbild-Scrollens von fullpage.js

1.fullpage.js Download-Adresse https://github.com...

Detaillierte Schritte zum Bereitstellen von lnmp unter Docker

Inhaltsverzeichnis Ziehen Sie ein CentOS-Image Ge...

Einige Fähigkeiten, die Sie beim Erstellen von Webseiten kennen müssen

1. Z-Index ist in IE6 ungültig. In CSS wird die E...

Gruselige Halloween-Linux-Befehle

Auch wenn nicht Halloween ist, lohnt es sich, sic...

Drei gängige Methoden, um HTML-Seiten nach 3 Sekunden automatisch zu springen

In der Praxis stoßen wir häufig auf ein Problem: ...