一、需求背景
需要從上傳視頻中截取某一幀作為文件的封面圖(縮略圖)
二、引入jar
1.maven下引入
<!--start:視頻獲取某一幀的圖片-->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>4.0.2-1.4.3</version>
</dependency>
<!--end:視頻獲取某一幀的圖片-->
2.gradle下引入
/*start:視頻獲取某一幀的圖片*/
grab_video_1 = ["org.bytedeco:javacv:1.4.3"]
grab_video_2 = ["org.bytedeco.javacpp-presets:ffmpeg-platform:4.0.2-1.4.3"]
/*end:視頻獲取某一幀的圖片*/
dependencies{
compile grab_video_1,grab_video_2
}
三、工具類
1.導包
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.util.UUID;
import java.io.File;
2.代碼
/**
* 提取圖片:指定幀
*
* @param filePath 視頻文件地址
* @param tempPath 臨時文件地址
*/
public String grabImg(String filePath, String tempPath) {
if (StringUtils.isBlank(filePath)) {
return null;
}
File tempFile = new File(filePath);
if (!tempFile.exists()) {
return null;
}
//最后獲取到的縮略圖的路徑
String appointFramePicture = "";
//Frame對象
Frame frame = null;
//標識:第幾幀
int flag = 0;
try {
//獲取視頻文件
FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(filePath);
fFmpegFrameGrabber.start();
//獲取視頻總幀數
int ftp = fFmpegFrameGrabber.getLengthInFrames();
while (flag <= ftp) {
frame = fFmpegFrameGrabber.grabImage();
//對視頻第五幀進行處理
if (frame!=null && flag==5) {
//圖片文件路徑
appointFramePicture = tempPath + File.separator + UUID.randomUUID().toString() + "_" + String.valueOf(flag) + ".jpg";
//文件存儲對象
File outPut = new File(appointFramePicture);
ImageIO.write(frameToBufferedImage(frame), "jpg", outPut);
break;
}
flag++;
}
fFmpegFrameGrabber.stop();
fFmpegFrameGrabber.close();
} catch (Exception e) {
e.printStackTrace();
}
return appointFramePicture;
}
public static BufferedImage frameToBufferedImage(Frame frame) {
//創建BufferedImage對象
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
return bufferedImage;
}