栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java获取视频时长及截取帧截图详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java获取视频时长及截取帧截图详解

前言

只是最近碰到有这方面的项目需求,所以简单 Mark 下本文。下面的示例是参考过他人分享的文章,之后本人再自行实践、调整和测试过的,希望对有这方面需求的人有所帮助。

示例

添加依赖

    
      org.bytedeco
      javacv-platform
      1.4.4
    

上述这段 maven 依赖包含了完整的 javacv 功能 (非常多,依赖Jar就占大概有500MB),由于这里只使用到了其中 ffmpeg 这块的特性,因此也可以像下面这样排除掉无关的部分

    
      org.bytedeco
      javacv
      1.4.4
      
 
   org.bytedeco
   javacpp
 
 
   org.bytedeco.javacpp-presets
   flycapture
 
 
   org.bytedeco.javacpp-presets
   libdc1394
 
 
   org.bytedeco.javacpp-presets
   libfreenect
 
 
   org.bytedeco.javacpp-presets
   libfreenect2
 
 
   org.bytedeco.javacpp-presets
   librealsense
 
 
   org.bytedeco.javacpp-presets
   videoinput
 
 
   org.bytedeco.javacpp-presets
   opencv
 
 
   org.bytedeco.javacpp-presets
   tesseract
 
 
   org.bytedeco.javacpp-presets
   leptonica
 
 
   org.bytedeco.javacpp-presets
   flandmark
 
 
   org.bytedeco.javacpp-presets
   artoolkitplus
 
      
    
    
      org.bytedeco
      javacv-platform
      1.4.4
      
 
   org.bytedeco
   javacv
 
 
   org.bytedeco.javacpp-presets
   flycapture-platform
 
 
   org.bytedeco.javacpp-presets
   libdc1394-platform
 
 
   org.bytedeco.javacpp-presets
   libfreenect-platform
 
 
   org.bytedeco.javacpp-presets
   libfreenect2-platform
 
 
   org.bytedeco.javacpp-presets
   librealsense-platform
 
 
   org.bytedeco.javacpp-presets
   videoinput-platform
 
 
   org.bytedeco.javacpp-presets
   opencv-platform
 
 
   org.bytedeco.javacpp-presets
   tesseract-platform
 
 
   org.bytedeco.javacpp-presets
   leptonica-platform
 
 
   org.bytedeco.javacpp-presets
   flandmark-platform
 
 
   org.bytedeco.javacpp-presets
   artoolkitplus-platform
 
      
    

核心代码

获取视频时长

  
  public static long getVideoDuration(File video) {
    long duration = 0L;
    FFmpegframeGrabber ff = new FFmpegframeGrabber(video);
    try {
      ff.start();
      duration = ff.getLengthInTime() / (1000 * 1000);
      ff.stop();
    } catch (frameGrabber.Exception e) {
      e.printStackTrace();
    }
    return duration;
  }

截取视频指定帧为图片

  
  public static void getVideoPic(File video, String picPath) {
    FFmpegframeGrabber ff = new FFmpegframeGrabber(video);
    try {
      ff.start();
      // 截取中间帧图片(具体依实际情况而定)
      int i = 0;
      int length = ff.getLengthInframes();
      int middleframe = length / 2;
      frame frame = null;
      while (i < length) {
 frame = ff.grabframe();
 if ((i > middleframe) && (frame.image != null)) {
   break;
 }
 i++;
      }
      // 截取的帧图片
      Java2DframeConverter converter = new Java2DframeConverter();
      BufferedImage srcImage = converter.getBufferedImage(frame);
      int srcImageWidth = srcImage.getWidth();
      int srcImageHeight = srcImage.getHeight();
      // 对截图进行等比例缩放(缩略图)
      int width = 480;
      int height = (int) (((double) width / srcImageWidth) * srcImageHeight);
      BufferedImage thumbnailImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
      thumbnailImage.getGraphics().drawImage(srcImage.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
      File picFile = new File(picPath);
      ImageIO.write(thumbnailImage, "jpg", picFile);
      ff.stop();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

测试用例

  public static void main(String[] args) {
    String videoPath = ResourceUtils.CLASSPATH_URL_PREFIX + "video.mp4";
    File video = null;
    try {
      video = ResourceUtils.getFile(videoPath);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    String picPath = "video.jpg";
    getVideoPic(video, picPath);

    long duration = getVideoDuration(video);
    System.out.println("videoDuration = " + duration);
  }

示例源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/137734.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号