java调用ffmpeg实现视频转换的方法
本文实例讲述了java调用ffmpeg实现视频转换的方法。分享给大家供大家参考。具体分析如下:
这里环境我是在windows平台下测试的。。。
需要在e:\下有ffmpeg.exe;mencoder.exe;drv43260.dll;pncrt.dll共4个文件。
还要在e:\input下放各种文件名为a的以下各种视频文件;还要e:\output;java程序执行后能得到一个a.flv的已转换的文件。
ffmpeg.exe能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
对ffmpeg.exe无法解析的文件格式(wmv9,rm,rmvb等),可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式;
mencoder.exe;drv43260.dll;pncrt.dll这3个文件是为文件格式(wmv9,rm,rmvb等)转换为avi(ffmpeg能解析的)格式准备的;
再把转换好的avi文件再用ffmpeg.exe转换成flv格式的视频文件。。。
java文件的内容如下:
importjava.io.File;
importjava.util.List;
publicclassConvertVideo{
privatefinalstaticStringPATH="c:\\test\\a.mpg";
publicstaticvoidmain(String[]args){
if(!checkfile(PATH)){
System.out.println(PATH+"isnotfile");
return;
}
if(process()){
System.out.println("ok");
}
}
privatestaticbooleanprocess(){
inttype=checkContentType();
booleanstatus=false;
if(type==0){
status=processFLV(PATH);//直接将文件转为flv文件
}elseif(type==1){
Stringavifilepath=processAVI(type);
if(avifilepath==null)
returnfalse;//avi文件没有得到
status=processFLV(avifilepath);//将avi转为flv
}
returnstatus;
}
privatestaticintcheckContentType(){
Stringtype=PATH.substring(PATH.lastIndexOf(".")+1,
PATH.length()).toLowerCase();
//ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
if(type.equals("avi")){
return0;
}elseif(type.equals("mpg")){
return0;
}elseif(type.equals("wmv")){
return0;
}elseif(type.equals("3gp")){
return0;
}elseif(type.equals("mov")){
return0;
}elseif(type.equals("mp4")){
return0;
}elseif(type.equals("asf")){
return0;
}elseif(type.equals("asx")){
return0;
}elseif(type.equals("flv")){
return0;
}
//对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),
//可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
elseif(type.equals("wmv9")){
return1;
}elseif(type.equals("rm")){
return1;
}elseif(type.equals("rmvb")){
return1;
}
return9;
}
privatestaticbooleancheckfile(Stringpath){
Filefile=newFile(path);
if(!file.isFile()){
returnfalse;
}
returntrue;
}
//对ffmpeg无法解析的文件格式(wmv9,rm,rmvb等),可以先用别的工具(mencoder)转换为avi(ffmpeg能解析的)格式.
privatestaticStringprocessAVI(inttype){
List<String>commend=newjava.util.ArrayList<String>();
commend.add("e:\\mencoder");
commend.add(PATH);
commend.add("-oac");
commend.add("lavc");
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("c:\\home\\a.avi");
try{
ProcessBuilderbuilder=newProcessBuilder();
builder.command(commend);
builder.start();
return"c:\\home\\a.avi";
}catch(Exceptione){
e.printStackTrace();
returnnull;
}
}
//ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
privatestaticbooleanprocessFLV(Stringoldfilepath){
if(!checkfile(PATH)){
System.out.println(oldfilepath+"isnotfile");
returnfalse;
}
List<String>commend=newjava.util.ArrayList<String>();
commend.add("e:\\ffmpeg");
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("c:\\home\\a.flv");
try{
ProcessBuilderbuilder=newProcessBuilder();
builder.command(commend);
builder.start();
returntrue;
}catch(Exceptione){
e.printStackTrace();
returnfalse;
}
}
}
希望本文所述对大家的java程序设计有所帮助。