PHP小丑 发表于 2021-10-6 15:29:35

java调用ffmpeg实现转换视频

这篇文章主要为大家详细介绍了java调用ffmpeg实现转换视频功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
最近由于项目需要把不同格式的视频转换为ts流,故研究了一下ffmpeg。在网上找了很多资料,主要参考了java+windows+ffmpeg实现视频转换功能。
期间也加了几个qq群,咨询了各大高手,其中在代码中关于ffmpeg的命令就是来自其中一个qq群里面的大神。
下载相关文件
ffmpeg地址,我下载是windows 64位static版本。
xuggler下载地址
下面的代码我上传到了github,需要的可以下载下来看看。
步骤:
1.研究java如何调用外部程序
2.研究ffmpeg转换视频格式的命令
3.利用xuggle获取ffmpeg解析的ts流的时长、分辨率以及文件大小。
下面直接上代码:
1.ffmpeg转换实现


package vedio.ffmpeg;
import java.io.file;
import java.util.arraylist;
import java.util.list;

public class ffmpegutil {

public static boolean ffmpeg(stringffmpegpath, string inputpath, string outputpath) throwsffmpegexception{

if (!checkfile(inputpath)) {
throw newffmpegexception("文件格式不合法");
}

int type =checkcontenttype(inputpath);
list command = getffmpegcommand(type,ffmpegpath, inputpath, outputpath);
if (null != command &&command.size() > 0) {
return process(command);

}
return false;
}

private static int checkcontenttype(stringinputpath) {
string type =inputpath.substring(inputpath.lastindexof(".") + 1,inputpath.length()).tolowercase();
//ffmpeg能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
if (type.equals("avi")) {
return 1;
} else if (type.equals("mpg")){
return 1;
} else if (type.equals("wmv")){
return 1;
} else if (type.equals("3gp")){
return 1;
} else if (type.equals("mov")){
return 1;
} else if (type.equals("mp4")){
return 1;
} else if(type.equals("mkv")){
return 1;
}else if (type.equals("asf")){
return 0;
} else if (type.equals("flv")){
return 0;
}else if (type.equals("rm")){
return 0;
} else if (type.equals("rmvb")){
return 1;
}
return 9;
}

private static boolean checkfile(stringpath) {
file file = new file(path);
if (!file.isfile()) {
return false;
}
return true;
}

private static boolean process(listcommand) throws ffmpegexception{

try {

if (null == command || command.size() ==0)
return false;
process videoprocess = newprocessbuilder(command).redirecterrorstream(true).start();

newprintstream(videoprocess.geterrorstream()).start();

newprintstream(videoprocess.getinputstream()).start();

int exitcode =videoprocess.waitfor();

if (exitcode == 1) {
return false;
}
return true;
} catch (exception e) {
throw new ffmpegexception("file uploadfailed",e);
}

}

private static list getffmpegcommand(inttype, string ffmpegpath, string oldfilepath, string outputpath)throws ffmpegexception {
list command = newarraylist();
if (type == 1) {
command.add(ffmpegpath +"\\ffmpeg");
command.add("-i");
command.add(oldfilepath);
command.add("-c:v");
command.add("libx264");
command.add("-x264opts");
command.add("force-cfr=1");
command.add("-c:a");
command.add("mp2");
command.add("-b:a");
command.add("256k");
command.add("-vsync");
command.add("cfr");
command.add("-f");
command.add("mpegts");
command.add(outputpath);
} else if(type==0){
command.add(ffmpegpath +"\\ffmpeg");
command.add("-i");
command.add(oldfilepath);
command.add("-c:v");
command.add("libx264");
command.add("-x264opts");
command.add("force-cfr=1");
command.add("-vsync");
command.add("cfr");
command.add("-vf");
command.add("idet,yadif=deint=interlaced");
command.add("-filter_complex");
command.add("aresample=async=1000");
command.add("-c:a");
command.add("libmp3lame");
command.add("-b:a");
command.add("192k");
command.add("-pix_fmt");
command.add("yuv420p");
command.add("-f");
command.add("mpegts");
command.add(outputpath);
}else{
throw newffmpegexception("不支持当前上传的文件格式");
}
return command;
}
}

class printstream extends thread{
java.io.inputstream __is =null;

public printstream(java.io.inputstream is){
__is = is;
}

public void run() {
try {
while (this != null) {
int _ch = __is.read();
if (_ch == -1) {
break;
} else {
system.out.print((char) _ch);
}

}
} catch (exception e) {
e.printstacktrace();
}
}
}
2.调用测试类


package vedio.ffmpeg;

public class convertvedio {
public static void convertvedio(stringinputpath){
string ffmpegpath =getffmpegpath();
string outputpath =getoutputpath(inputpath);
try {
ffmpegutil.ffmpeg(ffmpegpath, inputpath,outputpath);
} catch (ffmpegexception e) {
e.printstacktrace();
}

}

private static string getffmpegpath(){
return "ffmpeg";
}

private static string getoutputpath(stringinputpath) {
return inputpath.substring(0,inputpath.lastindexof(".")).tolowercase() + ".ts";
}
}
3.自定义的异常类


package vedio.ffmpeg;

public class ffmpegexception extendsexception {

private static final long serialversionuid= 1l;

public ffmpegexception() {
super();
}

public ffmpegexception(string message){
super(message);
}

public ffmpegexception(throwable cause){
super(cause);
}

public ffmpegexception(string message,throwable cause) {
super(message, cause);
}
}
4.获取ts流的时长、大小以及分辨率(用到了xuggle,需要下载对应jar包)


importcom.xuggle.xuggler.icodec;
importcom.xuggle.xuggler.icontainer;
importcom.xuggle.xuggler.istream;
importcom.xuggle.xuggler.istreamcoder;

*/
public static void getvedioinfo(string filename){


   // first we create a xuggler containerobject
   icontainer container =icontainer.make();

   // we attempt to open up thecontainer
   int result = container.open(filename,icontainer.type.read, null);

   // check if the operation wassuccessful
   if (result<0)
    return;
   
   // query how many streams the call to openfound
   int numstreams =container.getnumstreams();
   // query for the total duration
   long duration =container.getduration();
   // query for the file size
   long filesize =container.getfilesize();
   long secondduration =duration/1000000;
   
   system.out.println("时长:"+secondduration+"秒");
   system.out.println("文件大小:"+filesize+"m");


   for (int i=0; i
    istreamstream = container.getstream(i);
    istreamcoder coder = stream.getstreamcoder();
    if(coder.getcodectype() == icodec.type.codec_type_video){
    system.out.println("视频宽度:"+coder.getwidth());
   system.out.println("视频高度:"+coder.getheight());
    }
   }

}
以上就是在开发过程中做的全部,希望大家多多学习,交流!
原文链接:https://blog.csdn.net/zhengdesheng19930211/article/details/64443620

http://www.zzvips.com/article/172421.html
页: [1]
查看完整版本: java调用ffmpeg实现转换视频