最近工作中遇到一個需求:在視頻上傳的時候截取視頻圖片。就調研了兩種方法,親測有效~~~
方式一:使用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(); } }
