1.ffmpeg
这种方式需要我们安装ffmpeg这个客户端软件!然后在java代码中打开程序并且截图!
直接上代码:---------》ffmpegPath:ffmpeg安装的路径 upFilePath:视频的路径 (可以是线上地址) mediaPicPath:截图想要存放的路径
String url = AbstractOssClientUtil.putObject(picture.getInputStream(), FILE_PATH, AbstractOssClientUtil.getFileName(fileNa), picture.getSize());
Map<String, String> map = new HashMap();
//保存在服务器的路径
String tempUrl="/tmp/"+System.currentTimeMillis()+".jpg";
PictureInterceptionUtils.handler("/spring/ffmpeg/bin/ffmpeg", url, tempUrl);
public static void handler(String ffmpegPath,String upFilePath,String mediaPicPath){
List cutpic = new ArrayList();
cutpic.add(ffmpegPath); // 视频提取工具的位置
cutpic.add("-i"); // 添加参数"-i",该参数指定要转换的文件
cutpic.add(upFilePath); // 视频文件路径
cutpic.add("-y");
cutpic.add("-f");
cutpic.add("image2");
cutpic.add("-ss"); // 添加参数"-ss",该参数指定截取的起始时间
cutpic.add("1"); // 添加起始时间为第1秒
cutpic.add("-t"); // 添加参数"-t",该参数指定持续时间
cutpic.add("0.001"); // 添加持续时间为1毫秒
cutpic.add("-s"); // 添加参数"-s",该参数指定截取的图片大小
cutpic.add("600*600"); // 添加截取的图片大小为800*600
cutpic.add(mediaPicPath); // 添加截取的图片的保存路径
boolean mark = true;
ProcessBuilder builder = new ProcessBuilder();
try {
builder.command(cutpic);
builder.redirectErrorStream(true);
// 如果此属性为 true,则任何由通过此对象的 start() 方法启动的后续子进程生成的错误输出都将与标准输出合并,
//因此两者均可使用 Process.getInputStream() 方法读取。这使得关联错误消息和相应的输出变得更容易
builder.start();
} catch (Exception e) {
mark = false;
System.out.println(e);
e.printStackTrace();
}
}
截图出现的小问题:
java.io.IOException: No such file or directory
我们在程序中通常是截图和图片上传放在一起来做!而截图我们是需要去让ffmpeg来做,这个时候ffmpeg便占用了一个进程,而本身java自己的程序也占用一个进程!如果放在一起做的话,可能存在一种情况就是我图片还没有截完,便执行上传操作!导致出现这个问题!
解决方案:
1.在截完之后加一个休眠的操作,直接上代码!
PictureInterceptionUtils.handler("/spring/ffmpeg/bin/ffmpeg", url, tempUrl);
//休眠,等到图截完之后再去做操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("4l");
e.printStackTrace();
}
File file = new File(tempUrl);
InputStream fileInputStream = new FileInputStream(file);
//上传图片
String coverUrl = AbstractOssClientUtil.putObject1(fileInputStream, FILE_PATH, AbstractOssClientUtil.getFileName(file.getName()), file.length());