maven导入依赖包:
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacpp</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>opencv-platform</artifactId>
<version>3.4.1-1.4.1</version>
</dependency>
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>3.4.2-1.4.1</version>
</dependency>
java方法:
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
/**
* 视频工具
* @author
*
*/
public class VideoUtil {
/**
* 获取指定视频的帧并保存为图片至指定目录
* @param file 源视频文件
* @param framefile 截取帧的图片存放路径
* @throws Exception
*/
public static void fetchPic(File file, String framefile,int second) throws Exception{
FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);
ff.start();
int lenght = ff.getLengthInAudioFrames();
System.out.println(ff.getFrameRate());
int i = 0;
Frame frame = null;
second = 0;
while (i < lenght) {
// 过滤前5帧,避免出现全黑的图片,依自己情况而定
frame = ff.grabImage();
// if (i>=(int) (ff.getFrameRate()*second)&&frame.image != null) {
System.out.print(i+",");
if(i==50){
int a =1;
}
if(frame!=null&&frame.image!=null) {
System.out.println(i);
writeToFile(frame, i);
}
// second++;
// }
i++;
}
ff.stop();
}
public static void writeToFile(Frame frame,int second){
File targetFile = new File("E:/223/"+second+".jpg");
String imgSuffix = "jpg";
Java2DFrameConverter converter =new Java2DFrameConverter();
BufferedImage srcBi =converter.getBufferedImage(frame);
int owidth = srcBi.getWidth();
int oheight = srcBi.getHeight();
// 对截取的帧进行等比例缩放
int width = 800;
int height = (int) (((double) width / owidth) * oheight);
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
bi.getGraphics().drawImage(srcBi.getScaledInstance(width, height, Image.SCALE_SMOOTH),0, 0, null);
try {
ImageIO.write(bi, imgSuffix, targetFile);
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取视频时长,单位为秒
* @param file
* @return 时长(s)
*/
public static Long getVideoTime(File file){
Long times = 0L;
try {
FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);
ff.start();
times = ff.getLengthInTime()/(1000*1000);
ff.stop();
} catch (Exception e) {
e.printStackTrace();
}
return times;
}
// public void getBySecond() {
// opencv_videoio.CvCapture capture = opencv_highgui.cvC("D:/085402.crf");
//
//
//
// //帧率
// int fps = (int) opencv_highgui.cvGetCaptureProperty(capture, opencv_highgui.CV_CAP_PROP_FPS);
// System.out.println("帧率:"+fps);
//
// opencv_core.IplImage frame = null;
// double pos1 = 0;
//
// int rootCount = 0;
//
// while (true) {
//
// //读取关键帧
// frame = opencv_highgui.cvQueryFrame(capture);
//
// rootCount = fps;
// while(rootCount > 0 ){
// //这一段的目的是跳过每一秒钟的帧数,也就是说fps是帧率(一秒钟有多少帧),在读取一帧后,跳过fps数量的帧就相当于跳过了1秒钟。
// frame = opencv_highgui.cvQueryFrame(capture);
// rootCount--;
// }
//
// //获取当前帧的位置
// pos1 = opencv_highgui.cvGetCaptureProperty(capture,opencv_highgui.CV_CAP_PROP_POS_FRAMES);
// System.out.println(pos1);
//
// if (null == frame)
// break;
//
// opencv_highgui.cvSaveImage("d:/img/" + pos1 + ".jpg",frame);
//
// }
//
// opencv_highgui.cvReleaseCapture(capture);
// }
public static void main(String[] args){
try {
File file = new File("E:/22.mp4");
VideoUtil.fetchPic(file,"E:/123.jpg",5);
System.out.println(VideoUtil.getVideoTime(file));
} catch (Exception e) {
e.printStackTrace();
}
}
}