Detailed explanation of Java calling ffmpeg to convert video format to flv

Detailed explanation of Java calling ffmpeg to convert video format to flv

Detailed explanation of Java calling ffmpeg to convert video format to flv

Note: The following program is run under Linux. If you convert rmvb to avi under Windows, there will be problems. To succeed, you need to download the drv43260.dll and put it under C:WindowsSystem32

I'm writing a video management system these days, and I encountered a big problem: how to convert different formats to flv format! After some searching on the Internet, I summarized, sorted and organized it myself, and finally figured it out! It realizes the functions of video conversion, video screenshot and deletion of original files at the same time!

The main principle of format conversion is to use java to call the ffmpeg exe file first!

But some formats cannot be processed by ffmpeg, such as rmvb. In this case, you can first call mencoder to convert the format to avi and then convert it to flv!

I mainly write 3 classes: Conver.java

ConverBegin.java ConverVideo.java

The code of Conver.java is as follows:

package org.Conver;



import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

@SuppressWarnings("serial")
public class Conver extends JFrame{
public static JTextArea OutShowLog;
public Conver() {
 setTitle("FLV Conversion");
 setSize(500, 400);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 OutShowLog = new JTextArea();
 JScrollPane OutPane = newJScrollPane(OutShowLog);
 add(OutPane,BorderLayout.CENTER);
 setVisible(true);
}
public static void main(String args[]) {
 new Conver();
 ConverBegin cb = new ConverBegin();
 cb.start();
}
}

The ConverBegin.java code is as follows:

package org.Conver;



import java.io.File;

public class ConverBegin extends Thread{
String[] ff;
public void run(){
 while (true) {
 String folderpath = "other/";
 //String path = null;
 File f = newFile(folderpath);
  if (f.isDirectory()) {
 ff = f.list();
 int i =0;
 while (i< ff.length) {
 new ConverVideo(folderpath+ff[i]).beginConver();
 i++;
 }
 Conver.OutShowLog.append("---------------Total converted "+ff.length+"-----------videos------------");
 ff =null;
 }
  f = null;
 
  try {
 Thread.sleep(10000);
 } catch (InterruptedExceptione) {
 //If it fails, restart the thread this.start();
 }
 }
 

}
}

ConverBegin.java code is as follows

package org.Conver;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;



public class ConverVideo {
private Date dt;
private long begintime;
private String PATH;
private String filerealname; // file name does not include extensionprivate Stringfilename; // includes extensionprivate String videofolder = "other/"; //directory of other video formatsprivate String flvfolder ="flv/"; //flv video directoryprivateStringffmpegpath="ffmpeg/ffmpeg.exe"; //ffmpeg.exe directoryprivateStringmencoderpath="ffmpeg/mencoder"; //mencoder directoryprivateStringvideoRealPath="flv/"; //screenshot video directory;
 privateString imageRealPath = "img/"; //Storage directory for screenshots //privateString batrealpath = "ffmpeg/ffmpeg.bat"; //bat directory publicConverVideo(){}
public ConverVideo(String path) {
 PATH = path;
}
 publicString getPATH() {
 return PATH;
}

public void setPATH(String path) {
 PATH = path;
}
public boolean beginConver(){
 File fi = new File(PATH);
 filename = fi.getName();
 filerealname = filename.substring(0,filename.lastIndexOf("."))
 .toLowerCase();
 Conver.OutShowLog.append("----Received file ("+PATH+") needs to be converted--------------------------");
 if (!checkfile(PATH)) {
 Conver.OutShowLog.append(PATH+ "file does not exist"+" ");
 return false;
 }
 dt = new Date();
 begintime = dt.getTime();
 Conver.OutShowLog.append("----Start converting files ("+PATH+")--------------------------");
 if (process()) {
 Date dt2 = new Date();
 Conver.OutShowLog.append("Conversion successful");
 long endtime =dt2.getTime();
 long timecha = (endtime -begintime);
 String totaltime =sumTime(timecha);
 Conver.OutShowLog.append("Shared: " + totaltime+" ");
  if(processImg()) {
  Conver.OutShowLog.append("Screenshot successful");
  }else {
  Conver.OutShowLog.append("Screenshot failed");
 }
  PATH = null;
  return true;
 }else {
  PATH = null;
 return false;
 }
}
public boolean processImg() {
// System.out.println(newfilename + "->" +newimg);
  List<String, String> = new java.util.ArrayList();
  commend.add(ffmpegpath);
  commend.add("-i");
  commend.add(videoRealPath+filerealname+".flv");
  commend.add("-y");
  commend.add("-f");
  commend.add("image2");
  commend.add("-ss");
  commend.add("38");
  commend.add("-t");
  commend.add("0.001");
  commend.add("-s");
  commend.add("320x240");
  commend.add(imageRealPath+filerealname+".jpg");
 try {
  ProcessBuilder builder = new ProcessBuilder();
  builder.command(commend);
  builder.start();
  return true;
  } catch (Exception e) {
  e.printStackTrace();
  return false;
  }
 }
private boolean process() {
 int type = checkContentType();
 boolean status = false;
 if (type == 0) {

 // status =processFLV(PATH); // Convert the file to flv file directly status =processFLV(PATH);
 } else if (type == 1) {
 String avifilepath =processAVI(type);
 if (avifilepath == null)
 returnfalse;
 //avi file not obtained else {
 System.out.println("kaishizhuang");
 status =processFLV(avifilepath); // Convert avi to flv
 }
 }
 return status;
}

private int checkContentType() {
 String type =PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length())
 .toLowerCase();
 //Formats that ffmpeg can parse: (asx, asf, mpg, wmv, 3gp, mp4, mov, avi, flv, etc.)
 if (type.equals("avi")) {
 return 0;
 } else if (type.equals("mpg")) {
 return 0;
 } else if (type.equals("wmv")) {
 return 0;
 } else if (type.equals("3gp")) {
 return 0;
 } else if (type.equals("mov")) {
 return 0;
 } else if (type.equals("mp4")) {
 return 0;
 } else if (type.equals("asf")) {
 return 0;
 } else if (type.equals("asx")) {
 return 0;
 } else if (type.equals("flv")) {
 return 0;
 }
 // For file formats that ffmpeg cannot parse (wmv9, rm, rmvb, etc.),
 // You can use other tools (mencoder) to convert to avi (which ffmpeg can parse) format first.
 else if (type.equals("wmv9")) {
 return 1;
 } else if (type.equals("rm")) {
 return 1;
 } else if (type.equals("rmvb")) {
 return 1;
 }
 return 9;
}

private boolean checkfile(String path) {
 File file = new File(path);
 if (!file.isFile()) {
 return false;
 }else {
 return true;
 }
}

// For file formats that ffmpeg cannot parse (wmv9, rm, rmvb, etc.), you can first use other tools (mencoder) to convert them to avi (which ffmpeg can parse).
private String processAVI(int type) {
 List<String, String> = new java.util.ArrayList();
 
 commend.add(mencoderpath);
 commend.add(PATH);
 commend.add("-oac");
 commend.add("mp3lame");
 commend.add("-lameopts");
 commend.add("preset=64");
 commend.add("-ovc");
 commend.add("xvid");
 commend.add("-xvidencopts");
 commend.add("bitrate=600");
 commend.add("-of");
 commend.add("avi");
 commend.add("-o");
 commend.add(videofolder + filerealname + ".avi");
 // Command type: mencoder 1.rmvb -oac mp3lame -lameoptspreset=64 -ovc xvid
 // -xvidencopts bitrate=600 -of avi -ormvb.avi
 try {
 ProcessBuilder builder = newProcessBuilder();
 builder.command(commend);
 Process p =builder.start();

 doWaitFor(p);
 return videofolder +filerealname + ".avi";
 } catch (Exception e) {
 e.printStackTrace();
 return null;
 }
}

// Formats that ffmpeg can parse: (asx, asf, mpg, wmv, 3gp, mp4, mov, avi, flv, etc.)
private boolean processFLV(String oldfilepath) {

 if (!checkfile(PATH)) {
 System.out.println(oldfilepath+ " is not file");
 return false;
 }

 List<String, String> = new java.util.ArrayList();
 commend.add(ffmpegpath);
 commend.add("-i");
 commend.add(oldfilepath);
 commend.add("-ab");
 commend.add("64");
 commend.add("-acodec");
 commend.add("mp3");
 commend.add("-ac");
 commend.add("2");
 commend.add("-ar");
 commend.add("22050");
 commend.add("-b");
 commend.add("230");
 commend.add("-r");
 commend.add("24");
 commend.add("-y");
 commend.add(flvfolder + filerealname + ".flv");
 try {
 ProcessBuilder builder = newProcessBuilder();
 String cmd =commend.toString();
 builder.command(commend);
 //builder.redirectErrorStream(true);
 Process p =builder.start();
 doWaitFor(p);
 p.destroy();
 deleteFile(oldfilepath);
 return true;
 } catch (Exception e) {
 e.printStackTrace();
 return false;
 }
}

public int doWaitFor(Process p)

{
 InputStream in = null;
 InputStream err=null;
 int exitValue = -1; // returned to caller when pis finished
 try {
 System.out.println("coming");
 in = p.getInputStream();
 err =p.getErrorStream();
 boolean finished = false; //Set to true when p is finished

 while (!finished) {
 try {
 while (in.available() > 0) {
  // Print the output of our system call
  Character c = new Character((char) in.read());
  System.out.print(c);
 }
 while (err.available() > 0) {
  // Print the output of our system call
  Character c = new Character((char) err.read());
  System.out.print(c);
 }

 //Ask the process for its exitValue. If the process
 // is not finished, an IllegalThreadStateException
 // is thrown. If it is finished, we fall through and
 // the variable finished is set to true.
 exitValue = p.exitValue();
 finished = true;

 } catch(IllegalThreadStateException e) {
 // Process is not finished yet;
 // Sleep a little to save on CPU cycles
 Thread.currentThread().sleep(500);
 }
 }
 } catch (Exception e) {
 // unexpected exception! printit out for debugging...
 System.err.println("doWaitFor();: unexpected exception - "
 + e.getMessage());
 finally
 try {
 if(in!=null)
 {
 in.close();
 }
 
 } catch (IOException e) {
 System.out.println(e.getMessage());
 }
 if(err!=null)
 {
 try {
 err.close();
 } catch(IOException e) {
 System.out.println(e.getMessage());
 }
 }
 }
 // return completion status to caller
 return exitValue;
}

public void deleteFile(String filepath) {
 File file = new File(filepath);
 if (PATH.equals(filepath)) {
 if (file.delete()) {
 System.out.println("file" + filepath + "deleted");
 }
 } else {
 if (file.delete()) {
 System.out.println("file" + filepath + "deleted");
 }
 File filedelete2 = newFile(PATH);
 if (filedelete2.delete()){
 System.out.println("file" + PATH + "deleted");
 }
 }
}

public String sumTime(long ms) {
 int ss = 1000;
 long mi = ss * 60;
 long hh = mi * 60;
 long dd = hh * 24;

 long day = ms / dd;
 long hour = (ms - day * dd) / hh;
 long minute = (ms - day * dd - hour * hh) /mi;
 long second = (ms - day * dd - hour * hh -minute * mi) / ss;
 long milliSecond = ms - day * dd - hour * hh -minute * mi - second
 * ss;

 String strDay = day < 10 ? "0" +day + "day" : "" + day + "day";
 String strHour = hour < 10 ? "0"+ hour + "hour" : "" + hour + "hour";
 String strMinute = minute < 10 ?"0" + minute + "分" : "" + minute + "分";
 String strSecond = second < 10 ?"0" + second + "seconds" : "" + second + "seconds";
 String strMilliSecond = milliSecond< 10 ? "0" + milliSecond : ""
 +milliSecond;
 strMilliSecond = milliSecond <100 ? "0" + strMilliSecond + "milliseconds" : ""
 +strMilliSecond + "milliseconds";
 return strDay + " " + strHour + ":" + strMinute+ ":" + strSecond + " "
 +strMilliSecond;

}
}

If you have any questions, please leave a message or come to the community to discuss. Thank you for reading and I hope it can help you. Thank you for your support of this site!

You may also be interested in:
  • Java calls ffmpeg to convert video
  • Java+Windows+ffmpeg to realize video conversion function
  • How to use java to call ffmpeg to achieve video conversion
  • Use open source project JAVAE2 to convert video formats

<<:  Write a React-like framework from scratch

>>:  Alibaba Cloud ESC Server Docker Deployment of Single Node Mysql

Recommend

MySQL database terminal - common operation command codes

Table of contents 1. Add users 2. Change the user...

Raspberry Pi msmtp and mutt installation and configuration tutorial

1. Install mutt sudo apt-get install mutt 2. Inst...

Example of how to build a Mysql cluster with docker

Docker basic instructions: Update Packages yum -y...

How to convert Chinese into UTF-8 in HTML

In HTML, the Chinese phrase “學好好學” can be express...

How to install MySQL 5.7.29 with one click using shell script

This article refers to the work of 51CTO blog aut...

Implementation of 2D and 3D transformation in CSS3

CSS3 implements 2D plane transformation and visua...

Analysis and solution of the problem that MySQL instance cannot be started

Table of contents Preface Scenario Analysis Summa...

js to realize a simple disc clock

This article shares the specific code of js to im...

React implements infinite loop scrolling information

This article shares the specific code of react to...

JavaScript canvas to achieve raindrop effect

This article example shares the specific code for...

Problems installing TensorRT in docker container

Uninstall the installed version on Ubuntu: sudo a...

Cause Analysis and Solution of I/O Error When Deleting MySQL Table

Problem phenomenon I recently used sysbench to te...

A brief analysis of whether using iframe to call a page will cache the page

Recently, I have a project that requires using ifr...