//视频上传过程中自动转换为flv格式并截图生成缩略图(Java调用命令实现)
import java.util.ArrayList;
import java.util.List;
public class VideoProcess {
System.out.println(oldfilepath+"->"+newfilename+"->"+newimg);
List<String> commendF = new ArrayList<String>();
List<String> commendI=new java.util.ArrayList<String>();
commendF.add("D://tools//mencoder//mencoder");
commendF.add(oldfilepath);
commendF.add("-o");
commendF.add(newfilename);
commendF.add("-of");
commendF.add("lavf");
commendF.add("-oac");
commendF.add("mp3lame");
commendF.add("-lameopts");
commendF.add("abr:br=32:vol=1");
commendF.add("-srate");
commendF.add("22050");
commendF.add("-ovc");
commendF.add("lavc");
commendF.add("-lavcopts");
commendF.add("vcodec=flv:vbitrate=480:mbd=2:v4mv:turbo:vb_strategy=1:last_pred=2:trell");
commendF.add("-vf");
commendF.add("scale=400:226");
commendI.add("d://tools//ffmpeg");
commendI.add("-i");
commendI.add(oldfilepath);
commendI.add("-y");
commendI.add("-f");
commendI.add("image2");
commendI.add("-ss");
commendI.add("8");
commendI.add("-t");
commendI.add("0.001");
commendI.add("-s");
commendI.add("100x100");
commendI.add(newimg);
try {
ProcessClass.exec(commendF);
ProcessClass.exec(commendI);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static void main(String[] args){
String oldfilepath = "D://video//a1.avi";
String newfilename = "D://video//a1.flv";
String newimg = "D://video//a1.jpg";
processTransToImg2(oldfilepath,newfilename,newimg);
System.out.println("over");
}
}
ProcessClass.java
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ProcessClass{
public List<String> commendList = new ArrayList<String>();
public ProcessClass(List<String> commendList){
this.commendList = commendList;
}
//同步使只能有一个进程执行该方法(实现格式转换进程完成后执行截图进程操作)
public static synchronized Process exec(List<String> commendlist){
StringBuffer strBuf = new StringBuffer();
for(Iterator iter =commendlist.iterator();iter.hasNext(); ){
String Strtemp = (String)iter.next();
strBuf.append(Strtemp);
strBuf.append(" ");
}
try {
return Runtime.getRuntime().exec(strBuf.toString());
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
这并不是完善的程序,还存在一些问题:
1、 由于对于ffmpeg中的命令参数我并不是很了解,对于命令中的参数值并不是最优的选择,我在运行过程中出现转换后的文件大小还大于原文件。
2、 如果当你转换后没有看到生成图片,则你可以尝试修改
commendI.add("100x100"); 这个里面的值。
当我在程序中设置为100x75就不会生成图片,而当设置为100x100就可以看到图片生成出来了。
网上看到有一个朋友给的实例中设置为320X240,不过在我的项目感觉图片太大了,影响了整体的美观。你可以自己尝试一下。