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

JavaScript implements product details of e-commerce platform

This article shares a common example of viewing p...

How to access the local machine (host machine) in Docker

Question How to access the local database in Dock...

Mysql method to copy a column of data in one table to a column in another table

mysql copy one table column to another table Some...

Analysis of MySQL latency issues and data flushing strategy process

Table of contents 1. MySQL replication process 2....

Three ways to communicate between React components (simple and easy to use)

Table of contents 1. Parent-child component commu...

Upgrade MySQL 5.1 to 5.5.36 in CentOS

This article records the process of upgrading MyS...

How to use ECharts in WeChat Mini Programs using uniapp

Today, we use uniapp to integrate Echarts to disp...

JavaScript implements select all and unselect all operations

This article shares the specific code for JavaScr...

Mysql 5.6.37 winx64 installation dual version mysql notes

If MySQL version 5.0 already exists on the machin...

Detailed explanation of docker command to backup linux system

tar backup system sudo tar cvpzf backup.tgz --exc...

Summary of methods for cleaning Mysql general_log

Method 1: SET GLOBAL general_log = 'OFF';...

Sample code for generating QR code using js

Some time ago, the project needed to develop the ...