移动端自动化录制后的视频,需要进行转图片再做一些业务逻辑处理
package com.wx;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class TestAviDemo {
static{ System.load("/Users/wuxi/Downloads/opencv_java342.dylib");}
//视频文件路径
private static String videoPath = "/Users/wuxi/Movies/";
//视频帧图片存储路径
public static String videoFramesPath = "/Users/wuxi/Movies/";
public static Mat flag5;
public static Mat flag200;
public static Mat flagresult=new Mat();
/**
* TODO 将视频文件帧处理并以“jpg”格式进行存储。
* 依赖FrameToBufferedImage方法:将frame转换为bufferedImage对象
*
* @param videoFileName
*/
public static void grabberVideoFramer(String videoFileName) {
//Frame对象
Frame frame = null;
//标识
int flag = 0;
/*
获取视频文件
*/
FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath + "/" + videoFileName);
try {
fFmpegFrameGrabber.start();
/*
.getFrameRate()方法:获取视频文件信息,总帧数
*/
int ftp = fFmpegFrameGrabber.getLengthInFrames();
System.out.println(fFmpegFrameGrabber.grabKeyFrame());
System.out.println(fFmpegFrameGrabber.getFrameRate());
System.out.println("时长 " + ftp / fFmpegFrameGrabber.getFrameRate() / 60);
System.out.println("开始运行视频提取帧,耗时较长");
while (flag <= ftp) {
//文件绝对路径+名字
String fileName = videoFramesPath + "/img_" + String.valueOf(flag) + ".jpg";
//文件储存对象
File outPut = new File(fileName);
//获取帧
frame = fFmpegFrameGrabber.grabImage();
if (frame != null&&flag==200) {
ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);
flag5= Imgcodecs.imread(fileName);
}
if (frame != null&&flag==201) {
//获取帧
ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);
flag200= Imgcodecs.imread(fileName);
}
flag++;
}
Core.absdiff(flag5,flag200,flagresult);
Scalar scalar = Core.sumElems(flagresult);
System.out.println(scalar.toString());
System.out.println("============运行结束============");
fFmpegFrameGrabber.stop();
} catch (IOException E) {
}
}
public static BufferedImage FrameToBufferedImage(org.bytedeco.javacv.Frame frame) {
//创建BufferedImage对象
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
return bufferedImage;
}
/*
测试.....
*/
public static void main(String[] args) {
String videoFileName = "test.mov";
grabberVideoFramer(videoFileName);
}
}
引用MAVEN包
<dependency>
<groupId>org.bytedeco.javacpp-presets</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>3.2.1-1.3</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.4.1</version>
</dependency>