最近工作中遇到一个需求:在视频上传的时候截取视频图片。就调研了两种方法,亲测有效~~~
方式一:使用ffmpng工具
一、ffmpng工具的安装
2.下载完成并解压后,设置环境变量
3.dos窗口输入 ffmpeg -version 命令,测试是否成功;
以上就是ffmpng工具的安装过程,下面就一起进入正题吧~
二、视频截图的实现
1.配置文件:新建一个bat文件,文件内容如下图
解释一下个别参数的意思吧
D:/ffmpeg/bin/ffmpeg.exe 工具所在的具体位置
-ss 后面的数值代表截取多上秒后的图片(注意:小于视频的时间长度)
2.java的实现
public classImageTest {
@Testpublic voidsave() throws Exception {//视频文件String videoRealPath= "E:\\test\\FFOutput\\1.mp4";//截图的路径(输出路径)String imageRealPath="E://a.jpg";try{//调用批处理文件Runtime.getRuntime().exec("cmd /c start D://ffmpeg//ffmpeg.bat" + videoRealPath + " " +imageRealPath);
}catch(IOException e) {//TODO Auto-generated catch blocke.printStackTrace();
}
}
}
3.实现的效果
由于该项目要使用docker构建,最终这个方法被舍弃~~,调研了另外一种使用java包的方式实现
方式二:使用javacv包
一、添加maven依赖
org.bytedeco
javacv-platform
1.3.1
二、java实现
/*** 截取视频第六帧的图片
*@paramfilePath 视频路径
*@paramdir 文件存放的根目录
*@return图片的相对路径 例:pic/1.png
*@throwsFrameGrabber.Exception*/
public static String videoImage(String filePath,String dir) throwsFrameGrabber.Exception {
String pngPath= "";
FFmpegFrameGrabber ff=FFmpegFrameGrabber.createDefault(filePath);
ff.start();int ffLength =ff.getLengthInFrames();
Frame f;int i = 0;while (i
f=ff.grabImage();//截取第6帧
if((i>5) && (f.image != null)){//生成图片的相对路径 例如:pic/uuid.png
pngPath =getPngPath();//执行截图并放入指定位置
doExecuteFrame(f, dir+pngPath);break;
}
i++;
}
ff.stop();returnpngPath;
}/*** 生成图片的相对路径
*@return图片的相对路径 例:pic/1.png*/
private staticString getPngPath(){return "pic/"+getUUID()+".png";
}/*** 生成唯一的uuid
*@returnuuid*/
private staticString getUUID(){return UUID.randomUUID().toString().replace("-","");
}/*** 截取缩略图
*@paramf Frame
*@paramtargerFilePath:封面图片存放路径*/
private static voiddoExecuteFrame(Frame f, String targerFilePath) {
String imagemat= "png";if (null == f || null ==f.image) {return;
}
Java2DFrameConverter converter= newJava2DFrameConverter();
BufferedImage bi=converter.getBufferedImage(f);
File output= newFile(targerFilePath);try{
ImageIO.write(bi, imagemat, output);
}catch(IOException e) {
e.printStackTrace();
}
}