依赖引入
<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); } }