Java怎样获取视频时长及截取帧截图
创始人
2024-12-21 20:02:45
0次

示例

添加依赖

      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                  

核心代码

获取视频时长

/**   * 获取视频时长,单位为秒   *   * @param video 源视频文件   * @return 时长(s)   */  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;  }

截取视频指定帧为图片

/**   * 截取视频获得指定帧的图片   *   * @param video  源视频文件   * @param picPath 截图存放路径   */  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);  }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...