日期:2018/08/13
本文写的是纯java调用FFmepg.exe,推荐有c基础的dalao们可以去雷神的博客找解决方案
这段时间要做一个小东西(对我来说并不是)去实现多视频的一键转码上传,网上查来查去,最后还是选择FFmpeg,不过FFmpeg网上资料不太多,中间也是经常卡住(主要是自己水平问题)...闲话少说吧,写这篇文章是因为我自己百度找Java调用FFmpeg.exe,转一个视频输出一个提示的时候没有搜到比较有用的东西,所以实现之后我就自己写一篇给纯java的兄dei们一点参考吧
思路:
将FFmpeg命令的集合放到cmd里面运行
↓
获取cmd中ffmpeg的输出信息,转完一个后返回提示
很简单吧(没错),但是我相信也会有和我一样的小白不会的,瓶颈是对cmd操作的不熟悉,还有百度找不到相关信息
代码:
ShowTime
CmdExcuter.java:最重要的类,创建进程生成器调用FFmpeg.exe并获取cmd的输出,这里的List<String> cmd就是输入的cmd命令,把调用FFmpeg的String数组赋值给cmd变量即可
这段代码并不是我个人原创,实习公司的dalao给了很多帮助,一些地方我也没法正确表述,因此我就不写太多注释了,看jdk文档吧
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;
public class CmdExecuter {
private static Logger logger = LoggerFactory.getLogger(CmdExecuter.class);
public static void exec(List<String> cmd, CmdOutputGetter getter) {
if (logger.isInfoEnabled()) {
logger.info("exec command: ");
StringBuilder sb = new StringBuilder();//StringBuilder是字符串生成器,上面这部分和cmd操作没关系
for (String c : cmd) {
sb.append(c).append(" ");
}
logger.info(sb.toString());
}
//cmd操作部分
try {
ProcessBuilder builder = new ProcessBuilder();//创建新线程
builder.command(cmd);//执行FFmpeg命令
builder.redirectErrorStream(true);
Process proc = builder.start();
BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line;
while ((line = stdout.readLine()) != null) {
if (getter != null)
getter.dealLine(line);
}
proc.waitFor();
stdout.close();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
CmdOutputGetter.java:用于获取cmd输出的每行信息,要自己写deal方法决定怎么处理返回的每行信息
public interface CmdOutputGetter {
public void dealLine(String str);
}
ConvertVideo.java(部分)我只把有关联的那几行放一下
commend是ffmpeg命令的集合(存放一条完整的ffmpeg命令)
//调用cmd操作类
CmdExecuter.exec(commend, new CmdOutputGetter() {
@Override
public void dealLine(String line) {
System.out.println(line);//把cmd输出的信息每行syso,这个是实时输出的,可以换其他的处理方式
}
});
System.out.println("AMD,YES!");//可以换成其他提示转换完成的方法
之后我会做个小demo放评论里面,供需要的人下载,现在是凌晨1点,感觉再熬会秃头
这是我第一次写博客,对于这篇文章有什么不太明白的地方欢迎评论,我会尽力说明