依赖引入
<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>
测试代码
package top.fqq.demo;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.util.UUID;
/**
* @author: fitch
* @description: 描述
* @data: 2020/10/21 10:01
**/
public class VideoProcessing {
// 存放截取视频某一帧的图片
public static String videoFramesPath = "D:/test";
/**
* 将视频文件帧处理并以“jpg”格式进行存储。 依赖FrameToBufferedImage方法:将frame转换为bufferedImage对象
*
* @param path
*/
public static byte[] grabberVideoFramer(String path) {
// Frame对象
Frame frame = null;
// 标识
int flag = 0;
try {
/*
获取视频文件
*/
URL url =new URL(path);
//利用HttpURLConnection对象,我们可以从网络中获取网页数据.
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream inputStream= conn.getInputStream();
FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(inputStream);
fFmpegFrameGrabber.start();
//视频旋转角度,可能是null
String rotate_old=fFmpegFrameGrabber.getVideoMetadata("rotate");
// 获取视频总帧数
int ftp = fFmpegFrameGrabber.getLengthInFrames();
System.out.println("时长 " + ftp / fFmpegFrameGrabber.getFrameRate() / 60);
while (flag <= ftp) {
frame = fFmpegFrameGrabber.grabImage();
/*
对视频的第五帧进行处理
*/
if (frame != null && flag == 1) {
BufferedImage bufferedImage= FrameToBufferedImage(frame);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "jpg", out);
byte[] b = out.toByteArray();
fFmpegFrameGrabber.stop();
//有需要旋转
if(rotate_old!=null && !rotate_old.isEmpty()){
int rotate=Integer.parseInt(rotate_old);
VideoProcessing.rotatePhonePhoto(bufferedImage,rotate);
}
fFmpegFrameGrabber.close();
return b;
}
flag++;
}
} catch (Exception E) {
E.printStackTrace();
}
return null;
}
public static BufferedImage FrameToBufferedImage(Frame frame) {
// 创建BufferedImage对象
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
return bufferedImage;
}
/**
* 旋转照片
*
* @return
*/
public static String rotatePhonePhoto(BufferedImage bufferedImage, int angel) {
BufferedImage src;
try {
src = bufferedImage;
int src_width = src.getWidth(null);
int src_height = src.getHeight(null);
int swidth = src_width;
int sheight = src_height;
if (angel == 90 || angel == 270) {
swidth = src_height;
sheight = src_width;
}
Rectangle rect_des = new Rectangle(new Dimension(swidth, sheight));
BufferedImage res = new BufferedImage(rect_des.width, rect_des.height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = res.createGraphics();
g2.translate((rect_des.width - src_width) / 2, (rect_des.height - src_height) / 2);
g2.rotate(Math.toRadians(angel), src_width / 2, src_height / 2);
g2.drawImage(src, null, null);
ImageIO.write(res,"jpg", new File("D:/test/90.jpg"));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 测试: 1、在D盘中新建一个test文件夹,test中再分成video和img,在video下存入一个视频,并命名为test D:/test/video D:/test/img
*
* @param args
*/
public static void main(String[] args) {
byte[] bytes= grabberVideoFramer("http://172.16.205.240:11935/group1/M00/00/07/rBEABV-PiJiEFeyOAAAAAAAAAAA149.mp4");
System.out.println(bytes);
}
}