java调用ffmpeg转换视频格式为flv

注意:下面的程序是在Linux下运行的,如果在windows下rmvb转换成avi会出现问题,想成功需要下载下个drv43260.dll东西放到C:WindowsSystem32下面

这几天在写一个视频管理系统,遇到一个很大的问题就是如果把不同格式转换为flv,格式!经过网上的一番搜索,自己在总结,整理,整理,终于整出来了!实现了视频进行转换的同时还能够进行视频截图和删除原文件的功能!

格式转换主要原理就是先用java调用ffmpeg的exe文件!

但是有些格式是ffmpeg不能处理的比如rmvb,这样的可以先调用mencoder先把格式转换为avi再进行转换为flv!

我主要写3个类:分别为Conver.java 

   ConverBegin.java  ConverVideo.java



Conver.java 
  代码如下:

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转换");
 
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();
}
}


ConverBegin.java 
代码如下:

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("---------------总共转换了"+ff.length+"-----------视频------------");
 
   ff =null;
 
  }
 
    f = null;
 
  
 
    try {
 
  Thread.sleep(10000);
 
  } catch (InterruptedExceptione) {
 
  //如果失败重启线程
 
  this.start();
 
  }
 
}
 
 

}
}


ConverBegin.java 代码如下

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; // 文件名 不包括扩展名
private Stringfilename; 
   // 包括扩展名
private String videofolder = "other/"; 
//别的格式视频的目录
private String flvfolder ="flv/"; 
    //flv视频的目录
 
   privateStringffmpegpath="ffmpeg/ffmpeg.exe";  //ffmpeg.exe的目录
 
   privateStringmencoderpath="ffmpeg/mencoder";  //mencoder的目录
 
   privateStringvideoRealPath="flv/";   //截图的视频目录;
 
   privateString imageRealPath ="img/";  //截图的存放目录
 
   //privateString batrealpath="ffmpeg/ffmpeg.bat"; //bat目录
 
   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("----接收到文件("+PATH+")需要转换--------------------------");
 
if (!checkfile(PATH)) {
 
  Conver.OutShowLog.append(PATH+ "文件不存在"+" ");
 
  return false;
 
}
 
dt = new Date();
 
begintime = dt.getTime();
 
Conver.OutShowLog.append("----开始转文件("+PATH+")--------------------------");
 
if (process()) {
 
  Date dt2 = new Date();
 
  Conver.OutShowLog.append("转换成功");
 
  long endtime =dt2.getTime();
 
  long timecha = (endtime -begintime);
 
  String totaltime =sumTime(timecha);
 
 Conver.OutShowLog.append("共用了:" + totaltime+" ");
 
    if(processImg()) {
 
     Conver.OutShowLog.append("截图成功了 ");
 
    }else {
 
     Conver.OutShowLog.append("截图不成功了 ");
 
  }
 
    PATH = null;
 
    return true;
 
}else {
 
    PATH = null;
 
  return false;
 
}
}
public boolean processImg() {
// 
    System.out.println(newfilename + "->" +newimg);
 
    List commend = 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);// 直接将文件转为flv文件
 
  status =processFLV(PATH);
 
} else if (type == 1) {
 
  String avifilepath =processAVI(type);
 
  if (avifilepath == null)
 
   returnfalse;
 
  // avi文件没有得到
 
  else {
 
  System.out.println("kaishizhuang");
 
   status =processFLV(avifilepath);// 将avi转为flv
 
  }
 
}
 
return status;
}

private int checkContentType() {
 
String type =PATH.substring(PATH.lastIndexOf(".") + 1, PATH.length())
 
  .toLowerCase();
 
//ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
 
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;
 
}
 
// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
 
// 可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
 
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;
 
}
}

// 对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
private String processAVI(int type) {
 
List commend = 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");
 
// 命令类型: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;
 
}
}

// ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
private boolean processFLV(String oldfilepath) {

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

 
List commend = 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("comeing");
 
  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("文件" + filepath + "已删除");
 
  }
 
} else {
 
  if (file.delete()) {
 
  System.out.println("文件" + filepath + "已删除 ");
 
  }
 
  File filedelete2 = newFile(PATH);
 
  if (filedelete2.delete()){
 
  System.out.println("文件" + PATH + "已删除");
 
  }
 
}
}

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 + "天";
 
String strHour = hour < 10 ? "0"+ hour + "小时" : "" + hour + "小时";
 
String strMinute = minute < 10 ?"0" + minute + "分" : "" + minute + "分";
 
String strSecond = second < 10 ?"0" + second + "秒" : "" + second + "秒";
 
String strMilliSecond = milliSecond< 10 ? "0" + milliSecond : ""
 
   +milliSecond;
 
strMilliSecond = milliSecond <100 ? "0" + strMilliSecond + "毫秒" : ""
 
   +strMilliSecond + " 毫秒";
 
return strDay + " " + strHour + ":" + strMinute+ ":" + strSecond + " "
 
   +strMilliSecond;

}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值