Java H265视频抽帧提取照片

  • 1. Windows下可调用ffmpeg.exe实现,亲测可行
  • 2. linux下调用FFmpegFrameGrabber
  • 3. 源码
  • 4. 效果图
  • 5. pom依赖
  • 参考:

1. Windows下可调用ffmpeg.exe实现,亲测可行

  • 可以直接执行命令行
# 把目录下视频——E:\\data\\test.h265抽帧每一帧为图片,并命名为1.jpg,2.jpg,3.jpg...存储在E:\\data\\test\\images\\文件夹
ffmpeg.exe -y -i E:\\data\\test.h265 -ss 00:00:00 -f image2 -vsync 2 E:\\data\\test\\images\\%d.jpg

前提需要目录E:\data\test\images\存在;

  • 可以Java ProcessBuilder调用如上命令行实现;

2. linux下调用FFmpegFrameGrabber

  • 调用跨平台的ffmpeg
  • python代码打包成linux平台可调用的二进制文件
  • 推荐优雅的方案:FFmpegFrameGrabber

3. 源码

包括

  • ffmpeg.exe windows支持,linux需要自己配置ffmpeg
  • FFmpegFrameGrabber,跨平台,支持windows,支持linux
    俩个的实现源码如下:
package com.video.extract.test;import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.bytedeco.javacv.*;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Arrays;/**************************************Class Name: VideoUtils*Description: <视频抽帧类>*@author: Seminar*@create: 2021/1/28*@since 1.0.0*************************************/
@Slf4j
public class VideoUtils {/*** 抽帧程序* <p>* ffmpeg.exe -y -i data\test.H265 -ss 00:00:00 -f image2 -vsync 2 data\test\image\%d.jpg** @param videoPath 原始视频文件路径* @param imgPath   抽帧图片存储路径* @throws IOException*/public static void ffmpegFrameExtract(String videoPath, String imgPath) throws IOException {if (StringUtils.isEmpty(videoPath)) {return;}File imgPathFolder = new File(imgPath);if (!imgPathFolder.exists()) {imgPathFolder.mkdirs();} else {delDir(imgPathFolder);imgPathFolder.mkdirs();}String path = System.getProperty("user.dir") + File.separator + "frameExtract" + File.separator + "ffmpeg.exe";ProcessBuilder processBuilder = new ProcessBuilder(path, "-y","-i", videoPath,"-ss", "00:00:00","-f", "image2","-vsync", "2",imgPath + "%d.jpg");processBuilder.redirectErrorStream(true);Process process = processBuilder.start();StringBuilder processOutput = new StringBuilder();try (BufferedReader processOutputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));) {String readLine;while ((readLine = processOutputReader.readLine()) != null) {processOutput.append(readLine + System.lineSeparator());}process.waitFor();} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();} finally {if (process != null) {process.destroy();}}// 只返回抽帧的最后3行总览信息String[] str = processOutput.toString().trim().split("\n");String[] res = new String[3];System.arraycopy(str, str.length - 3, res, 0, 3);log.info("ffmpegFrameExtract res: {}", String.join("\n", Arrays.asList(res)));}/*** 视频抽帧** @param videoPath 原始视频文件路径* @param imagePath 抽帧图片存储路径* @throws FrameGrabber.Exception* @throws FileNotFoundException*/public static void ffmpegFrameGrabber(String videoPath, String imagePath) throws FrameGrabber.Exception, FileNotFoundException {//        FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videoPath);// 此处可为视频路径,也可为二进制视频流FFmpegFrameGrabber ff = new FFmpegFrameGrabber(new FileInputStream(videoPath));// 此处可为视频路径,也可为二进制视频流
//        ff.setAudioCodecName("h265");ff.start();int ffLength = ff.getLengthInFrames();double ffFrameRate = ff.getFrameRate();long videoLength = ff.getLengthInTime();log.info("\n");log.info("ffmpegFrameGrabber: 帧数:{}, 帧率:{},视频长度:", ffLength, ffFrameRate, videoLength);Frame f = ff.grabImage();int k = 0;while (f != null) {Java2DFrameConverter converter = new Java2DFrameConverter();String imageMat = "jpg";String fileName = imagePath + k + "." + imageMat;BufferedImage bi = converter.getBufferedImage(f);File output = new File(fileName);try {ImageIO.write(bi, imageMat, output);} catch (IOException e) {log.error("writeJpgError: {}", e.getMessage());e.printStackTrace();}k++;f = ff.grabImage();}ff.stop();log.info("jpgSize: {}", k);}/*** 递归删除多层目录** @param file*/public static void delDir(File file) {// 文件直接删除if (file.isFile()) {file.delete();} else {// 目录,需要递归删除for (File sonfile : file.listFiles()) {delDir(sonfile);}}file.delete();}public static void main(String[] args) throws IOException {String videoPath = "D:\\project\\frame-extract\\doc\\test.h265";String imagePath = videoPath.substring(0, videoPath.lastIndexOf(".")).concat(File.separator).concat("images").concat(File.separator);// ffmpeg.exe抽帧ffmpegFrameExtract(videoPath, imagePath);// FFmpegFrameGrabber 抽帧ffmpegFrameGrabber(videoPath, imagePath);}
}

4. 效果图

5. pom依赖

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bytedeco/javacv -->
<dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5</version>
</dependency>
<dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5</version>
</dependency>
<dependency><groupId>org.bytedeco</groupId><artifactId>javacpp</artifactId><version>1.5</version>
</dependency>
<dependency><groupId>org.bytedeco.javacpp-presets</groupId><artifactId>ffmpeg-platform</artifactId><version>4.1-1.4.4</version>
</dependency>

参考:

  • https://blog.csdn.net/qq_34928194/article/details/108388653
  • https://blog.csdn.net/jl19861101/article/details/94555851

Java h265视频抽帧提取照片支持Window,Linux相关推荐

  1. java 视频抽帧_opencv3.2.0实现视频抽帧,并保存成图片

    .实现指定帧数的抽取.和全部帧数的抽取,并保存到指定目录. 在QT新建一个控制台程序,程序源码如下:(程序实现每十帧获取一次帧) #include #include #include #include ...

  2. 视频抽帧Java实现

    视频抽帧Java实现 依赖: <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv --><dependency&g ...

  3. 视频数据处理方法!关于开源软件FFmpeg视频抽帧的学习

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 视频文件是多媒体数据中比较常见的一种,也是入门门槛比较高的一个领域.视频数据相关的领域 ...

  4. python 视频抽帧_FFmpeg视频抽帧那些事

    视频文件是多媒体数据中比较常见的一种,也是入门门槛比较高的一个领域.视频数据相关的领域任务包括视频物体检测.视频物体追踪.视频分类.视频检索和视频摘要抽取等. 视频数据与图像数据非常类似,都是由像素点 ...

  5. javacv之视频抽帧

    视频抽帧可以做一些处理,比如水印,去水印等操作,然后再合成视频.下面直接上代码: 引入maven步骤看javacv去水印的文章:https://blog.csdn.net/weixin_3800810 ...

  6. 视频抽帧:多视频、可视化、手动旋转

    一.目的 兵马未动.粮草先行. cv领域,在设计.训练你的模型之前,最重要的事情莫过于处理数据了. 很多时候,我们获取到的原始数据并非别人整理好的图片,而是一段一段的视频:这个时候,就需要我们自己抽帧 ...

  7. 视频处理之视频抽帧的python脚本

    在计算机视觉研究中,处理视频的时候,往往需要将视频抽帧成图片.如果多个视频都存放在一个文件夹里,并且希望抽帧出来的图片,以一个视频对应一个文件夹的形式存放,可以用以下代码,抽帧频率可自己手动修改,下面 ...

  8. python视频抽帧 后 前端javascript如何显示_使用OpenCV编写一个可以定时抽帧的脚本...

    一.概述 在计算机视觉数据预处理阶段,一个常用的工序是要将原始的视频数据抽帧,得到图像数据集.有时候视频很长,而我们感兴趣的场景可能只在某些较短的时段内出现.这种情况下如果对整个视频抽帧再进行人工筛选 ...

  9. Python视频抽帧,视频转图片帧并保存

    注(新方法):如果不想用python跑,可以直接终端命令行安装ffmpeg包,然后cd到含有视频文件夹的位置,终端执行: for f in *.mp4; do mkdir -p "${f}_ ...

最新文章

  1. 尝试远程添加Git存储库时收到“致命错误:不是git存储库”
  2. mysql分组区某列最后一条_[MySQL]MySQL数据库如何按某列分组排序后查询每个分组的最后一条数据?...
  3. Problem D: 顺序串的基本运算
  4. 【Java】总结Integer类的API
  5. ShadeGraph教程之节点详解4:Master Nodes
  6. linux tcp客户端端口号,Linux网络编程--服务器客户端(TCP实现)
  7. 从ASCII到UTF-8——字符集到底是什么?
  8. envi精度评定_利用ArcGIS+envi实现遥感分类精度评价(分层抽样法),ArcGISENVI,评估,的...
  9. MySQL的 初步认识 - 细节狂魔
  10. android Studio里查看db文件
  11. 重学前端学习笔记(十二)--浏览器工作解析(二)
  12. 又看了一遍鲁迅的《祝福》
  13. windows 10 时间同步,时间显示不准自动校准。
  14. Strings and Runes
  15. Python学习之re.compile与findall
  16. PAT-A1010解题报告
  17. 【论文阅读记录】孪生网络(Siamese network)
  18. 基于MATLAB车牌图像识别的设计与实现
  19. Nacos默认用户名和密码
  20. cube station下载_cubestation魔方软件下载-cubestation安卓版v1.4.4_5577安卓网

热门文章

  1. Android动画之帧动画和补间动画
  2. 2021年大数据常用语言Scala(十九):基础语法学习 iterator迭代器
  3. Django 缓存6.2
  4. vim的简单介绍与使用
  5. Windows 10系统中如何显示文件后缀名
  6. Binary XML file line #8: Error inflating class android.support.v7.widget.RecyclerView
  7. Android Html.fromHtml 的使用
  8. No service of type Factory available in ProjectScopeServices
  9. .net2.0网站多语言
  10. Mysql for Mac 安装及环境配置