java实现视频抽帧以及获取其他视频信息

java实现视频抽帧以及获取其他视频信息

1.在pom.xml文件中导入jar包

<dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.4.3</version>
</dependency><dependency><groupId>org.bytedeco.javacpp-presets</groupId><artifactId>ffmpeg-platform</artifactId><version>4.0.2-1.4.3</version>
</dependency>

2.创建工具类FetchVideoFrameUtil,复制以下代码

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.util.Lists;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FrameGrabber;
import org.bytedeco.javacv.Java2DFrameConverter;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.*;
import java.io.File;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;/*** Created with IDEA* 视频取帧,可设置间隔秒数或获取所有帧数** @Author shunzi* @Date 2023/08/16 14:38:12* @Description* @Version 1.0*/
@Slf4j
public class FetchVideoFrameUtil {// 主函数public static void main(String[] args){try {//批量处理,视频所在文件夹String videoPath = "C:\\Users\\17386\\Desktop\\video\\normal video.mp4";//输出图片文件夹String picPath = "C:\\Users\\17386\\Desktop\\video-image3\\";// 获取视频FPSDouble videoFrameRate = FetchVideoFrameUtil.getVideoFrameRate(new File(videoPath));log.info("视频频率:{}", videoFrameRate);// 根据FPS,动态计算抽帧速率。示例为:每秒取一帧BigDecimal frameNumber = BigDecimal.valueOf(videoFrameRate);BigDecimal frameDecimal = frameNumber.setScale(0, RoundingMode.HALF_UP);// TODO 这里来更改抽帧速率,通过乘法运算来控制。比如:控制抽帧频率为2秒一帧,int second = 2 * frameDecimal.intValue()。以此类推int second = frameDecimal.intValue();log.info("抽帧频率:{}", second);// 视频时长log.info("视频总时长:{}", FetchVideoFrameUtil.getVideoTime(new File(videoPath)));// 视频总帧数log.info("视频总共帧数:{}", FetchVideoFrameUtil.getVideoFrameTotalLength(new File(videoPath)));// 开始视频取帧流程SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("开始视频取帧流程=====开始时间" + sdf.format(new Date()));List<File> files = FetchVideoFrameUtil.fetchPic(new File(videoPath), picPath, second);System.out.println("结束视频取帧流程=====结束时间" + sdf.format(new Date()));log.info("抽取的图片集合:{}", JSONObject.toJSONString(files));} catch (Exception e) {e.printStackTrace();}}/*** 获取指定视频的帧并保存为图片至指定目录* @param file  源视频文件* @param picPath  截取帧的图片存放路径* @throws Exception*/public static java.util.List<File> fetchPic(File file, String picPath, int second) throws Exception{java.util.List<File> list = Lists.newArrayList();FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file); // 获取视频文件int length = FetchVideoFrameUtil.getVideoFrameTotalLength(file);ff.start(); // 调用视频文件播放int i = 0; // 图片帧数,如需跳过前几秒,则在下方过滤即可org.bytedeco.javacv.Frame frame = null;int count = 0;while (i < length) {frame = ff.grabImage(); // 获取该帧图片流System.out.print(i + ",");if(frame!=null && frame.image!=null) {System.out.println(i);writeToFile(frame, picPath, count,second,list); // 生成帧图片count++;}i++;}ff.stop();return list;}/**** @param frame // 视频文件对象* @param picPath // 图片存放路径* @param count // 当前取到第几帧* @param second // 每隔多少帧取一张,一般高清视频每秒 20-24 帧,根据情况配置,如果全部提取,则将second设为 0 即可* @param list // 返回文件结果*/public static void writeToFile(org.bytedeco.javacv.Frame frame, String picPath, int count, int second, java.util.List<File> list){if (second == 0) {// 跳过间隔取帧判断} else if (count % second != 0){ // 提取倍数,如每秒取一张,则: second = 20return;}File targetFile = new File(picPath + count + ".jpg");System.out.println("创建了文件:" + picPath + count + ".jpg");list.add(targetFile);String imgSuffix = "jpg";Java2DFrameConverter converter =new Java2DFrameConverter();BufferedImage srcBi =converter.getBufferedImage(frame);int owidth = srcBi.getWidth();int oheight = srcBi.getHeight();// 对截取的帧进行等比例缩放int width = 800;int height = (int) (((double) width / owidth) * oheight);BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);bi.getGraphics().drawImage(srcBi.getScaledInstance(width, height, Image.SCALE_SMOOTH),0, 0, null);try {ImageIO.write(bi, imgSuffix, targetFile);}catch (Exception e) {e.printStackTrace();}}/*** 获取视频时长,单位为秒* @param file* @return 时长(s)*/public static Long getVideoTime(File file){Long times = 0L;try {FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);ff.start();times = ff.getLengthInTime()/(1000*1000);ff.stop();} catch (Exception e) {e.printStackTrace();}return times;}/*** 获取视频帧率,单位FPS* @return*/public static Double getVideoFrameRate(File file) {double frameRate = 0.0;try {FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);ff.start();frameRate = ff.getVideoFrameRate();ff.stop();} catch (FrameGrabber.Exception e) {throw new RuntimeException(e);}return frameRate;}/*** 获取视频真实格式* @param file* @return*/public static String getVideoRealFormat(File file){String videoFormat = "";try {FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);ff.start();videoFormat = ff.getFormat();ff.stop();} catch (FrameGrabber.Exception e) {throw new RuntimeException(e);}return videoFormat;}/*** 获取视频总帧数长度* @return*/public static int getVideoFrameTotalLength(File file) {int frameCount = 0;try {FFmpegFrameGrabber ff = new FFmpegFrameGrabber(file);ff.start();org.bytedeco.javacv.Frame frame;while ((frame = ff.grabImage()) != null) {frameCount++;}ff.stop();} catch (FrameGrabber.Exception e) {throw new RuntimeException(e);}return frameCount;}
}

文章引用出处:https://cloud.tencent.com/developer/article/1655887,并在原有基础上做了优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/45394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stable diffusion基础

整合包下载&#xff1a;秋叶大佬 【AI绘画8月最新】Stable Diffusion整合包v4.2发布&#xff01; 参照&#xff1a;基础04】目前全网最贴心的Lora基础知识教程&#xff01; VAE 作用&#xff1a;滤镜微调 VAE下载地址&#xff1a;C站&#xff08;https://civitai.com/models…

漏洞指呗-VluFocus靶场专栏-番外篇

漏洞指呗-VluFocus靶场专栏-番外篇奇技淫巧 &#x1f338;struts2漏洞扫描工具&#x1f338;step1 修改ip和端口step2 验证漏洞是否存在step3 执行cmd命令&#xff0c;获取flag &#x1f338;Goby插件工具headshot&#x1f338;step1 输入ip和端口 检测step2 cmd 输入指令 &…

vactor中迭代器失效问题

目录 什么是迭代器失效导致迭代器失效的操作VS和g环境下对与迭代器失效的态度 什么是迭代器失效 迭代器的底层其实就是一个指针&#xff0c;或者对指针进行了封装 vector的迭代器就是一个指针T* 一个迭代器指向某一个空间&#xff0c;此时这块空间被释放了&#xff0c;这个迭…

【SA8295P 源码分析】35 - QNX侧 Marvell 88Q5152 Phy_Switch 导通实录(硬核)

【SA8295P 源码分析】35 - QNX侧 Marvell 88Q5152 Phy_Switch 导通实录(硬核) 一、硬件原理分析二、88Q5152 芯片读写时序分析2.1 Clause 22 读、写寄存器配置(配置 Port 5 采用C22条款)2.1.1 88Q5152 P5 端口配置2.2 Clause 45 读寄存器时序(配置 Port 1、Port 2 采用C45…

HTML <source> 标签

实例 拥有两份源文件的音频播放器。浏览器应该选择它所支持的文件(如果有的话): <audio controls><source src="horse.ogg" type="audio/ogg"><source src="horse.mp3" type="audio/mpeg">Your browser does n…

Keepalived配置文件详解+主从IP接管实战

文章目录 Keepalived配置文件全局配置VRRP实例主备配置对比 LVS配置Keepalived一主一从IP接管实战MASTER配置文件BACKUP配置文件检查效果测试 Keepalived配置文件 全局配置 #以下是官方给的默认配置文件(示例配置) #以#或&#xff01;为注释符 global_defs {notification_ema…

Appium Desktop安装

【提示&#xff1a;官方已不再维护&#xff0c;建议命令行方式安装&#xff0c;但可以学习了解一下】 Appium Desktop是一款适用于Mac、Windows和Linux的应用程序&#xff0c;它以漂亮灵活的UI为您提供Appium自动化服务器的强大功能。它基本上是Appium Server的图形界面。您可…

【华为认证数通高级证书实验-分享篇2】

实验拓扑 注&#xff1a;代码块为各交换机路由器中的配置命令 配置拓扑文件 实验要求 实现全网通 实验配置 SW3 [SW3]v b 10 20 [SW3]int e0/0/1 [SW3-Ethernet0/0/1]po link-t a [SW3-Ethernet0/0/1]po de v 10 [SW3-Ethernet0/0/1]int e0/0/2 [SW3-Ethernet0/0/2]po li…

ES6自用笔记

目录 原型链 引用类型&#xff1a;__proto__(隐式原型)属性&#xff0c;属性值是对象函数&#xff1a;prototype(原型)属性&#xff0c;属性值是对象 相关方法 person.prototype.isPrototypeOf(stu) Object.getPrototypeOf(Object)替换已不推荐的Object._ _ proto _ _ Ob…

【hive】hive中row_number() rank() dense_rank()的用法

hive中row_number() rank() dense_rank()的用法 一、函数说明 主要是配合over()窗口函数来使用的&#xff0c;通过over(partition by order by )来反映统计值的记录。 rank() over()是跳跃排序&#xff0c;有两个第二名时接下来就是第四名(同样是在各个分组内)dense_rank() …

神经网络基础-神经网络补充概念-60-卷积步长

概念 在深度学习中&#xff0c;卷积步长&#xff08;convolution stride&#xff09;是指在卷积操作中滑动卷积核的步幅。卷积操作是神经网络中常用的操作之一&#xff0c;用于从输入数据中提取特征。步长决定了卷积核在输入数据上的滑动间隔&#xff0c;从而影响输出特征图的…

WebStorm运行vue项目

WebStorm运行vue项目&#xff08;vue2&#xff09; 1.安装webstorm 2. 需要安装node.js 环境&#xff0c;可以去官网下载 https://nodejs.org/en 3. 安装完需要查看 按winr 输入cmd进入 输入命令node -v 和npm -v 查看&#xff0c;会出现相应的版本号,代表安装成功 vue官网安…

【Python】Web学习笔记_flask(6)——会话session对象

处理利用cookie来判断用户登录外&#xff0c;也可以使用session来判断用户是否登录 html代码和cookie对象的设置相同 from flask import Flask,request,render_template,make_response,session,url_for,redirectappFlask(__name__) app.secret_keyps1234567890 app.route(/) …

Vue-5.编译器Idea

Vue专栏&#xff08;帮助你搭建一个优秀的Vue架子&#xff09; Vue-1.零基础学习Vue Vue-2.Nodejs的介绍和安装 Vue-3.Vue简介 Vue-4.编译器VsCode Vue-5.编译器Idea Vue-6.编译器webstorm Vue-7.命令创建Vue项目 Vue-8.Vue项目配置详解 Vue-9.集成&#xff08;.editorconfig、…

开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块

文章目录 前言 S-Fuction模块 电路方程模型 编写S函数 仿真验证 Tips 分析和应用 总结 前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;一&#xff09;——powergui模块》 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff…

[Google] DeepMind Gemini: 新一代LLM结合AlphaGo技术将力压 GPT-4|未来 AI 领域的新巨头

2016年&#xff0c;Google DeepMind 人工智能实验室孕育出的 AlphaGo 人工智能程序在围棋赛场上一举击败冠军选手&#xff0c;成为历史的见证者。如今&#xff0c;DeepMind 联合创始人兼首席执行官 Demis Hassabis 表示&#xff0c;他们的工程师正借鉴 AlphaGo 的技术研发一款名…

23年9月到24年3月苹果产品发布

2023年到2024年的苹果产品发布 9月 基本就是手机&#xff0c;4款&#xff1a;15、15plus、15pro、15pro max 手表和ipodmini 10月就是新的M3芯片&#xff0c;至于M pro芯片会放在24年的3月份。 其他的就没什么新意了

自动化集装箱码头建设指南

1 总则 1.0.1 为规范和指导自动化集装箱码头建设&#xff0c;提高自动化集装箱码头建设和装卸自动化应用水平&#xff0c;做到技术先进、经济合理、安全可靠、高效节能、绿色环保&#xff0c;制定本指南。 1.0.2本指南适用于新建、改建和扩建自动化集装箱码头的设计&#xff0…

AI 绘画Stable Diffusion 研究(十)sd图生图功能详解-精美二维码的制作

免责声明: 本案例所用安装包免费提供&#xff0c;无任何盈利目的。 大家好&#xff0c;我是风雨无阻。 为了让大家更直观的了解图生图功能&#xff0c;明白图生图功能到底是干嘛的&#xff0c;能做什么事情&#xff1f;今天我们继续介绍图生图的实用案例-精美二维码的制作。 对…

Datawhale Django后端开发入门 TASK03 QuerySet和Instance、APIVIew

一、QuerySet QuerySet 是 Django 中的一个查询集合&#xff0c;它是由 Model.objects 方法返回的&#xff0c;并且可以用于生成数据库中所有满足一定条件的对象的列表。 QuerySet 在 Django 中表示从数据库中获取的对象集合,它是一个可迭代的、类似列表的对象集合。主要特点…