在上一篇文章中,已经完成ffmpeg及x264库的安装,接下来编写代码对视频文件进行转换。
/**
*
* @param Directory 文件目录
* @param filename 文件名字
* @return
*/
public String ffmpeg2MP4(String Directory, String filename) {
List<String> params = new ArrayList<>();
params.add("-f");
params.add("mp4");
params.add("-loglevel");
params.add("quiet");
params.add("-vcodec");
params.add("libx264");
return ffmpegConvert("mp4", params, Directory, filename);
}
/**
* ffmpeg 转码
* @param format 转码格式 如mp4 能解析的格式:(asx,asf,mpg,wmv,3gp,mp4,mov,avi,flv等)
* @param params 转码参数,参考ffmpeg 命令
* @param Directory 原文件目录
* @param filename 原文件名称
* @return
*/
public String ffmpegConvert(String format, List<String> params, String Directory, String filename) {
String newDir = Directory + "news";
String newFileName = filename.substring(0, filename.lastIndexOf(".")) + "." + format;
String newFilePath = newDir + "/" + GlobalUuid.getUuid() + newFileName;
String before = Directory + filename;
new File(newDir).mkdirs();//创建对应的文件夹
List<String> commend = new ArrayList<>();
commend.add(fdsConfig.getFfmpegPath() + "ffmpeg");
commend.add("-i");
commend.add(before);
commend.addAll(params);
commend.add(newFilePath);
try {
//调用线程命令进行转码
log.info("ffmpeg convert begin");
ProcessBuilder builder = new ProcessBuilder(commend);
builder.command(commend);
Process process = builder.start();
int value = -1;
try {
value = process.waitFor();
} catch (InterruptedException e) {
log.warn("ffmpeg convert video error", e);
}
log.info("ffmpeg convert over");
log.info("ffmpeg转码成功!!文件位于: {} ", newDir);
return value == 0 ? newFilePath : null;
} catch (IOException e) {
log.warn("ffmpeg转码错误" + e);
return null;
}
}
-loglevel quiet比较关键,这个参数的意思是使用ffmpeg进行转码时不进行log输出。如果不写的话,程序会出现莫名其妙的卡死无任何响应,因为错误或正常输出会使缓冲区满,程序无法继续打印输出,也就卡死了。