Java调用命令实现视频上传过程中自动转换为flv格式并截图生成缩略图
时间:2011-10-16 chenhongxin
//视频上传过程中自动转换为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");
c ommendF.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,不过在我的项目感觉图片太大了,影响了整体的美观 。你可以自己尝试一下。 |