最近工作中遇到一个需求:在视频上传的时候截取视频图片。就调研了两种方法,亲测有效~~~
方式一:使用ffmpng工具
一、ffmpng工具的安装
1.官网http://www.ffmpeg.org/download.html下载windows版本
2.下载完成并解压后,设置环境变量
3.dos窗口输入 ffmpeg -version 命令,测试是否成功;
以上就是ffmpng工具的安装过程,下面就一起进入正题吧~
二、视频截图的实现
1.配置文件:新建一个bat文件,文件内容如下图
解释一下个别参数的意思吧
D:/ffmpeg/bin/ffmpeg.exe 工具所在的具体位置
-ss 后面的数值代表截取多上秒后的图片(注意:小于视频的时间长度)
2.java的实现
public class ImageTest { @Test public void save() 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 block e.printStackTrace(); } } }
3.实现的效果
由于该项目要使用docker构建,最终这个方法被舍弃~~,调研了另外一种使用java包的方式实现
方式二:使用javacv包
一、添加maven依赖
<dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.3.1</version> </dependency>
二、java实现
/** * 截取视频第六帧的图片 * @param filePath 视频路径 * @param dir 文件存放的根目录 * @return 图片的相对路径 例:pic/1.png * @throws FrameGrabber.Exception */ public static String videoImage(String filePath,String dir) throws FrameGrabber.Exception { String pngPath = ""; FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath); ff.start(); int ffLength = ff.getLengthInFrames(); Frame f; int i = 0; while (i < ffLength) { f = ff.grabImage(); //截取第6帧 if((i>5) && (f.image != null)){ //生成图片的相对路径 例如:pic/uuid.png pngPath = getPngPath(); //执行截图并放入指定位置 doExecuteFrame(f, dir+pngPath); break; } i++; } ff.stop(); return pngPath; } /** * 生成图片的相对路径 * @return 图片的相对路径 例:pic/1.png */ private static String getPngPath(){ return "pic/"+getUUID()+".png"; } /** * 生成唯一的uuid * @return uuid */ private static String getUUID(){ return UUID.randomUUID().toString().replace("-",""); } /** * 截取缩略图 * @param f Frame * @param targerFilePath:封面图片存放路径 */ private static void doExecuteFrame(Frame f, String targerFilePath) { String imagemat = "png"; if (null == f || null == f.image) { return; } Java2DFrameConverter converter = new Java2DFrameConverter(); BufferedImage bi = converter.getBufferedImage(f); File output = new File(targerFilePath); try { ImageIO.write(bi, imagemat, output); } catch (IOException e) { e.printStackTrace(); } }