飞道的博客

硬核干货!!!JavaCV 将抖音小视频分割成图片帧图片和将图片合成小视频代码实现

365人阅读  评论(0)

效果视频

美女屏幕跳舞视频

本功能实现需要用到第三方jar包 javaCV。

javaCV简介

JavaCV 提供了在计算机视觉领域的封装库,包括:OpenCV、ARToolKitPlus、libdc1394 2.x 、PGR FlyCapture和FFmpeg。此外,该工具可以很容易地使用Java平台的功能。

JavaCV 还带有硬件加速的全屏幕图像显示(CanvasFrame),易于在多个内核中执行并行代码(并行),用户友好的几何和色彩的相机和投影仪校准(GeometricCalibrator,ProCamGeometricCalibrator,ProCamColorCalibrator ),检测和特征点(ObjectFinder),一类是实现投影,摄像系统(直接图像对齐设置匹配主要GNImageAligner,ProjectiveTransformer,ProjectiveGainBiasTransformer,ProCamTransformer 和ReflectanceInitializer),以及在 JavaCV 类杂项功能。

spring boot项目pom文件中添加以下依赖


  
  1. <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
  2. <dependency>
  3. <groupId>org.bytedeco </groupId>
  4. <artifactId>javacv-platform </artifactId>
  5. <version>1.5.5 </version>
  6. </dependency>

Java单类实现代码,创建Spring boot项目,再项目中新建JavaCV 类,复制粘贴下面代码, 用idea编辑器 主方法运行即可。共有两个方法

videoToImages()
将视频按帧数分成图片
imagesToVideo()

 将图片合成视频


  
  1. package com.tarzan.reptile.demo;
  2. import org.bytedeco.ffmpeg.global.avcodec;
  3. import org.bytedeco.javacv.FFmpegFrameGrabber;
  4. import org.bytedeco.javacv.FFmpegFrameRecorder;
  5. import org.bytedeco.javacv.Frame;
  6. import org.bytedeco.javacv.Java2DFrameConverter;
  7. import javax.imageio.ImageIO;
  8. import java.awt.image.BufferedImage;
  9. import java.io.File;
  10. import java.io.IOException;
  11. public class JavaCV {
  12. final static String imagePath = "C:/Users/tarzan/Desktop/image/";
  13. final static String videoPath = "C:/Users/tarzan/Desktop/video/";
  14. final static String videoName = "video.mp4";
  15. final static String imageMat = "png";
  16. public static void main(String[] args) throws Exception {
  17. //视频按帧数分成图片
  18. videoToImages(videoPath + videoName, imagePath + videoName.substring( 0, videoName.lastIndexOf( ".")));
  19. //图片合成视频
  20. imagesToVideo(videoPath + "newVideo.mp4", imagePath);
  21. }
  22. public static void videoToImages(String filePath, String fileTargetName) throws Exception {
  23. FFmpegFrameGrabber ff = FFmpegFrameGrabber.createDefault(filePath);
  24. ff.start();
  25. System.out.println( "视频编码:" + ff.getVideoCodec());
  26. System.out.println( "像素格式:" + ff.getPixelFormat());
  27. System.out.println( "帧速率:" + ff.getFrameRate());
  28. System.out.println( "比特率:" + ff.getVideoBitrate());
  29. System.out.println( "图片高度:" + ff.getImageHeight());
  30. System.out.println( "图片宽度:" + ff.getImageWidth());
  31. int grabSize = ff.getLengthInFrames();
  32. for ( int i = 0; i < grabSize; i++) {
  33. Frame frame = ff.grabImage();
  34. doExecuteFrame(frame, fileTargetName, i);
  35. }
  36. ff.stop();
  37. }
  38. public static void doExecuteFrame(Frame frame, String targetFileName, int index) {
  39. if (frame == null || frame.image == null) {
  40. return;
  41. }
  42. Java2DFrameConverter converter = new Java2DFrameConverter();
  43. String fileName = targetFileName + "/" + index + "." + imageMat;
  44. BufferedImage bi = converter.getBufferedImage(frame);
  45. File output = new File(fileName);
  46. if (!output.exists()) {
  47. output.mkdirs();
  48. }
  49. try {
  50. ImageIO.write(bi, imageMat, output);
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. public static void imagesToVideo(String saveMp4name, String imagesPath) throws Exception {
  56. FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(saveMp4name, 640, 480);
  57. recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 13
  58. recorder.setFormat( "mp4");
  59. recorder.setFrameRate( 24.148380638004276);
  60. recorder.setPixelFormat( 0);
  61. recorder.setVideoBitrate( 846472);
  62. recorder.setImageHeight( 736);
  63. recorder.setImageWidth( 544);
  64. recorder.start();
  65. // 列出目录中所有的图片
  66. File file = new File(imagesPath + videoName.substring( 0, videoName.lastIndexOf( ".")));
  67. File[] listFiles = file.listFiles();
  68. for ( int i = 0; i < listFiles.length; i++) {
  69. String imgPath = imagesPath + "/" + videoName.substring( 0, videoName.lastIndexOf( ".")) + "/" + i + "." + imageMat;
  70. System.out.println(imgPath);
  71. Java2DFrameConverter frameConverter = new Java2DFrameConverter();
  72. BufferedImage image = ImageIO.read( new File(imgPath));
  73. recorder.record(frameConverter.convert(image));
  74. }
  75. recorder.stop();
  76. recorder.release();
  77. }
  78. }

运行结果截图

在桌面建立video和image文件夹,将要转换的视频文件放入进去video文件夹里。

 

原视频文件 

将视频按原帧数分割图片

 

测试结果

视频格式为mp4,大小约2.80MB,按帧数分离成316张图片,转化时间1s左右。

相关文章《震惊,java仅用30行代码就实现了视频转音频的批量转换


转载:https://blog.csdn.net/weixin_40986713/article/details/116593539
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场