当前位置:   article > 正文

java如何做视频抽帧,视频转图片操作Demo_java视频流地址抽帧取图片

java视频流地址抽帧取图片

java如何做视频抽帧,视频转图片操作Demo!现在市面上很多客户提成需求,希望可以把本地的视频,抽帧(一个一个静态的图片)。至于为什么要抽帧,大家自己去百度查询。我们本次仅仅讨论如何使用java技术,实现视频的抽帧操作。


1:我们需要用到市面上一个的maven插件包。名字叫做:【javacv-platform】

在项目的pom.xml文件中加入依赖项。maven从仓库下载到本地仓库来,我们就可以开始写测试代码了。

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.7</version>
</dependency>

2:测试的demo代码如下所示:

这个代码仅仅是针对本地视频,某一个视频文件的抽帧操作。

  1. package com.yrl.managedemo.util;
  2. import org.bytedeco.javacv.FFmpegFrameGrabber;
  3. import org.bytedeco.javacv.Frame;
  4. import org.bytedeco.javacv.Java2DFrameConverter;
  5. import javax.imageio.ImageIO;
  6. import java.awt.image.BufferedImage;
  7. import java.io.File;
  8. import java.io.IOException;
  9. public class FrameExtractor {
  10. public static void main(String[] args) {
  11. // 本地存储的视频文件路径
  12. String videoFilePath = "H:\\base\\video\\3.mp4";//此处写自己的视频路径
  13. // 创建FFmpegFrameGrabber对象
  14. FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoFilePath);
  15. try {
  16. //记录开始的时间节点
  17. long startTime = System.currentTimeMillis();
  18. // 打开视频文件
  19. grabber.start();
  20. // 逐帧抓取视频
  21. Frame frame;
  22. int frameNumber = 1;
  23. //只要获取到帧对象不为null.就一直循环下去。
  24. while ((frame = grabber.grabImage()) != null) {
  25. BufferedImage bufferedImage = frameToBufferedImage(frame);
  26. // 生成保存帧图像的文件路径
  27. //字符串是帧图片的默认起始内容,不会变化的,唯一变化的是后面的数字,起始值是1
  28. String outputFilePath = String.format("%s/frame_%06d.jpg", "H:\\base\\frame-video\\3", frameNumber);//此处写自己的保存路径
  29. // 保存帧图像到文件
  30. try {
  31. ImageIO.write(bufferedImage, "jpg", new File(outputFilePath));
  32. System.out.println("保存帧图像:" + outputFilePath);
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. //完成一次帧图的存储后,末尾数字自动加1
  37. frameNumber++;
  38. }
  39. // 关闭视频文件
  40. grabber.stop();
  41. long endTime = System.currentTimeMillis();
  42. System.out.println("NeedTime is:" + (endTime - startTime)/1000 + " 秒");
  43. } catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. /**
  48. * 将Frame转换为BufferedImage
  49. */
  50. private static BufferedImage frameToBufferedImage(Frame frame) {
  51. Java2DFrameConverter converter = new Java2DFrameConverter();
  52. return converter.getBufferedImage(frame);
  53. }
  54. }

 

如图所示,代码开始疯狂的在存储帧图片到本地指定的目录下面。

 

 

 

12秒完成了这个操作任务。视频容积是 2.3MB.抽取帧后,存储的文件夹内占容积是28MB。

 如图,视频原始长度是14秒,图片帧存储了441张图片,由此,我们可以推算出来,视频是按照每秒30帧的帧速率制作的。

 里面的文字注解,写的很清晰了。不懂的话,可以留言咨询。很高兴和大家一起学习java知识。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/618464
推荐阅读
相关标签
  

闽ICP备14008679号