第一步,解析视频文件
private static String processVideo(String filePath) {
List<String> commend=new java.util.ArrayList<String>();
commend.add("ffmpeg");//可以设置环境变量从而省去这行//d:\ffmpeg\ffmpeg.exe
commend.add("-i");
commend.add(filePath);
try {
ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
builder.redirectErrorStream(true);
Process p= builder.start();
BufferedReader buf = null; // 保存ffmpeg的输出结果流
String line = null;
buf = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringBuffer sb= new StringBuffer();
while ((line = buf.readLine()) != null) {
sb.append(line);
continue;
}
p.waitFor();//这里线程阻塞,将等待外部转换进程运行成功运行结束后,才往下执行
return sb.toString();
} catch (Exception e) {
System.out.println("ffmpeg解析视频文件【" + filePath +"】失败!");
return null;
}
}
第二步,获取相关metadata,获取视频的旋转角度
private static String getRotate() { String rotate = ""; String result = processVideo(videoPath); System.out.println(result); if(StringUtils.isNotEmpty(result)){ PatternCompiler compiler =new Perl5Compiler(); try { String regexRotate ="rotate\\s*:\\s*(\\w*)\\s*"; Pattern patternRotate = compiler.compile(regexRotate, Perl5Compiler.CASE_INSENSITIVE_MASK); PatternMatcher matcherRotate = new Perl5Matcher(); if(matcherRotate.contains(result, patternRotate)){ MatchResult re = matcherRotate.getMatch(); rotate = re.group(1); System.out.println("rotate:"+rotate); } } catch (MalformedPatternException e) { System.out.println("获取【" + videoPath +"】视频信息失败!"); } System.out.println("获取【" + videoPath +"】视频信息成功!"); }else{ System.out.println("执行成功!但未获取到【" + videoPath +"】视频信息!"); } return rotate; }
第三步,根据rotate角度信息,调用旋转命令
private static boolean rotate90mp4(String rotate) { List<String> commend = new ArrayList<String>(); //ffmpeg -i demo.mp4 -vf "transpose=1" o.mp4 try { Runtime runtime = Runtime.getRuntime(); // String cmd = " ffmpeg -i "+ videoPath + " -vf \"transpose=1\" d:\\out\\vertical.mp4"; StringBuffer buf = new StringBuffer(); buf.append(" ffmpeg "); buf.append(" -i "); buf.append(videoPath); if(!StringUtils.isBlank(rotate)){ buf.append(" -vf "); if(rotate.equals("90")) buf.append(" \"transpose=1\" "); else if(rotate.equals("180")) buf.append(" \"transpose=2,transpose=2\" "); else if(rotate.equals("270")) buf.append(" \"transpose=2\" "); } buf.append(destPath); runtime.exec(buf.toString()); return true; } catch (Exception e) { e.printStackTrace(); return false; } }