java实现视频的转换功能:有两种实现方法ffmpeg和mencoder,ffmpeg支持的视频格式有asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等mencoder支持的视频格式wmv9,rm,rmvb。能用ffmpeg转换的尽量使用ffmpeg进行转换。mencoder转换视频不仅转换速度慢而且容易报错在转换到一半时经常报:应用程序错误“0x6342dae”指令引用的“0x022b6000”内存。该内存不能为“written” 然后就终止了 。
ffmpeg的实现方法:
public synchronized String compressFile(String path,Integer breate,String fileName){
//低精度
List<String> commend = new ArrayList<String>();
commend.add("E:/ffmpeg.exe");
commend.add("-i");
commend.add(path);
commend.add("-ab"); //比特率
commend.add(breate+"k");
commend.add("-ac"); //声道
commend.add("1");
commend.add("-ar"); //采样率
commend.add("22050"); //44100 22050
commend.add("-y");
String newP = "D:/www/test/";
File ff = new File(newP);
if(!ff.exists()){
ff.mkdirs();
}
String newName = newP+"/"+fileName+"_"+breate+".mp3";
commend.add(newName);
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
Process process = builder.start();
InputStream is = process.getErrorStream(); // 获取ffmpeg进程的输出流
BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 缓冲读入
StringBuilder buf = new StringBuilder(); // 保存ffmpeg的输出结果流
String line = null;
while((line = br.readLine()) != null) {
buf.append(line); // 循环等待ffmpeg进程结束
}
return newName;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
mencoder是实现方法:
private String processAVI(String filepath,int type, String outputPath) {
List<String> commend = new java.util.ArrayList<String>();
commend.add("e:/mencoder.exe");
commend.add(filepath);
commend.add("-oac");
commend.add("mp3lame");
commend.add("-lavcopts");
commend.add("acodec=mp3:abitrate=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(outputPath);
// String str = "E:/mencoder.exe D:/www/test/av.rm -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600 -of avi -o rmvb.avi";
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.redirectErrorStream(true);
Process process = builder.start();
BufferedReader stdout = new BufferedReader(new InputStreamReader(process.getInputStream()));
while (stdout.readLine()!= null) {
System.out.println(stdout.readLine());
}
return outputPath;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
对于以上的实现方法仍旧在转换上还是存在问题大家能给些建议吗?