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

Implementieren Sie ein einfaches Datenantwortsystem

Inhaltsverzeichnis 1. Dep 2. Verstehen Sie den Be...

Detaillierte Erklärung langer Transaktionsbeispiele in MySQL

Vorwort: Die Artikelserie „Erste Schritte mit MyS...

Bringen Sie Ihnen bei, wie Sie wartbaren JS-Code schreiben

Inhaltsverzeichnis Was ist wartbarer Code? Code-K...

Beste Tools zum Erstellen und Bearbeiten von Screenshots unter Linux

Als ich mein primäres Betriebssystem von Windows ...

Alibaba Cloud Centos7 Installation und Konfiguration von SVN

1. SVN-Server installieren yum installiere Subver...

Detaillierte Erläuterung der 6 Möglichkeiten der JS-Vererbung

Vererbung von Prototypketten Die Prototypenvererb...

Zwei Boxmodelle in Webseiten (W3C-Boxmodell, IE-Boxmodell)

Es gibt zwei Arten von Webseiten-Boxmodellen: 1: S...

Verwendung des Linux-Befehls bzip2

1. Befehlseinführung bzip2 wird zum Komprimieren ...

JavaScript BOM-Standortobjekt + Navigatorobjekt + Verlaufsobjekt

Inhaltsverzeichnis 1. Standortobjekt 1. URL 2. Ei...