Java:视频按帧进行截图

news2025/1/16 20:49:38

主要介绍了Java获取视频时长、总帧数,并按照时间或者帧进行截图,希望对大家的学习有所帮助!

1、Maven依赖

<!--start:视频获取某一帧的图片-->
<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、代码示例 

package com.wav.utils;

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;

/**
 * @author summer
 * @date 2023-10-24 15:48
 */
public class VideoToImageUtil {

    public static final Logger log = LoggerFactory.getLogger(VideoToImageUtil.class);
    /**
     * 获取视频第一帧
     *
     * @param videoPath 视频地址
     * @param imgPath   生成图片的名字(包含全路径)
     * @throws Exception
     */
    public static void getVideoPicture(String videoPath, String imgPath) throws Exception{
        File imgFile = new File(imgPath);
        //判断保存的文件的文件夹是否存在,不存在创建。
        if (!imgFile.getParentFile().exists()) {
            log.info("保存文件的文件夹不存在,创建。");
            imgFile.getParentFile().mkdirs();
        }

        File videoFile = new File(videoPath);
        if (videoFile.exists()) {
            log.info("视频存在:{}", videoFile);
            //实例化“截取视频首帧”对象
            FFmpegFrameGrabber ff = new FFmpegFrameGrabber(videoFile);
            ff.start();
            int width = ff.getImageWidth();
            int height = ff.getImageHeight();
            System.out.println("宽:" + width + ";高:" + height);

            long ftp = ff.getLengthInFrames();
            System.out.println("一共有:" + ftp + "帧");
            // 视频帧率
            double videoFrameRate = ff.getVideoFrameRate();
            System.out.println("帧率:" + videoFrameRate);
            long delayedTime = ff.getLengthInTime() / 1000000;
            System.out.println("秒数:" + delayedTime);
            int step = 5;
            System.out.println("每隔:" + step + "帧取一帧");
            long count = ftp / step;
            for(long i = 0; i < count; i++){
                System.out.println("截图进度:" + i + "/" +count);
//                long time = (step * (i + 1)) * 1000000L;
//                ff.setTimestamp(time);
                ff.setFrameNumber((int) (step * i + 1));
                Frame f = ff.grabImage();
                //生成文件名称
                String fileName = imgPath + "/" + i + ".jpg";
                System.out.println("截图保存:" +fileName);
                File out = new File(fileName);
                ImageIO.write(frameToBufferedImage(f), "jpg", out);
            }
            ff.close();
            ff.stop();
        } else {
            log.info("视频不存在:{}", videoFile);
        }
    }

    /**
     * 帧转为流
     *
     * @param frame
     * @return
     */

    private static RenderedImage frameToBufferedImage(Frame frame) {
        //创建BufferedImage对象
        Java2DFrameConverter converter = new Java2DFrameConverter();
        BufferedImage bufferedImage = converter.getBufferedImage(frame);
        return bufferedImage;
    }

    public static void main(String[] args) {
        try {
            String videoPath = "E:\\ffmpegTest\\smgnews.mp4";
            String imgPath = "E:\\ffmpegTest\\img\\";
            getVideoPicture(videoPath, imgPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

3、运行结果

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

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

相关文章

前后端分离项目(六):数据分页查询(前端视图)

&#x1f680; 优质资源分享 &#x1f680; &#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一个全栈订餐系统。 &#x1f49b;Python量化交易实战&#x1f49…

无糖茶饮三十年,从无人问津到人手一瓶

【潮汐商业评论/原创】 Joan又在外卖上点了一堆瓶装茶饮&#xff0c;东方树叶、燃茶、三得利乌龙茶……买了四五种纯茶&#xff0c;用她的话说&#xff0c;和美式咖啡相比&#xff0c;这些无糖茶更适合他这个中国体质。 事实上&#xff0c;越来越多的消费者开始像Joan一样&am…

食堂管理,这个操作不要太绝哦!

随着科技的不断进步&#xff0c;餐饮行业也在积极寻求创新的方式来提高效率、提供更好的客户体验以及降低运营成本。智慧收银系统为餐饮业提供了一个全新的方式来管理交易、优化库存和了解客户需求。 智慧收银系统使食堂经营者能够实现更高的自动化、更大的精确度和更好的数据分…

第58篇-某看准招聘参数分析-AES加密【2023-10-31】

声明&#xff1a;该专栏涉及的所有案例均为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请私信联系本人删帖&#xff01; 文章目录 一、前言二、网站分析1.参数kiv2.参数b3.响应加密 一、前…

React 组件prop传值

将 props 传递给子组件 开发环境&#xff1a;Reacttsant 将一些 props 传递给 Avatar。例如&#xff0c;让我们传递两个 props&#xff1a;person&#xff08;一个对象&#xff09;和 size&#xff08;一个数字&#xff09; 定义类组件Avatar&#xff08;子组件&#xff09;和…

【k8s】pod详解

一、pod介绍 1、pod的基础概念 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象&#xff0c;一个pod代表着集群中运行的一个进程。kubernetes中其它大多数组件都是围绕着pod来进行支持和扩展pod功能的。 例如&#xff0c;用于管理po…

科技战再次升级!国内前沿科技行业影响悬而未决

&#xff08;图片来源&#xff1a;网络&#xff09; 美国与中国的科技贸易战正在升级&#xff0c;美国总统拜登发布行政命令限制美国对半导体和微电子、量子信息技术和人工智能等特定行业的跨国投资。在此前美国对中国芯片相关出口的一系列限制之后&#xff0c;又增加了此项新…

遥遥领先,免费开源的django4-vue3项目

星域后台管理系统前端介绍 &#x1f33f;项目简介 本项目前端基于当下流行且常用的vue3作为主要技术栈进行开发&#xff0c;融合了typescript和element-plus-ui&#xff0c;提供暗黑模式和白昼模式两种主题以及全屏切换&#xff0c;开发bug少&#xff0c;简单易学&#xff0c…

面试算法44:二叉树中每层的最大值

题目 输入一棵二叉树&#xff0c;请找出二叉树中每层的最大值。例如&#xff0c;输入图7.4中的二叉树&#xff0c;返回各层节点的最大值[3&#xff0c;4&#xff0c;9]。 分析&#xff1a;用一个队列实现二叉树的广度优先搜索 由于要找出二叉树中每层的最大值&#xff0c;因…

TDengine 受邀参加 CNCC 2023,大会现场展位前“人山人海”!

10 月 26 日-28 日&#xff0c;2023 年度中国计算机大会&#xff08;CNCC 2023&#xff09;在沈阳新世界博览馆成功举办&#xff0c;本届大会以“发展数字基础设施&#xff0c;支撑数字中国建设”作为会议主题&#xff0c;参会规模头一次达到上万人。本届 CNCC 组织了 19 个特邀…

加速软件开发和交付的革命性方法-DevOps

“ 随着信息技术的快速发展&#xff0c;现代软件开发和交付已经经历了巨大的变革。DevOps&#xff08;Development和Operations的结合&#xff09;已经成为这一变革的关键推动力&#xff0c;让开发团队和运维团队之间的界限变得模糊&#xff0c;以加速软件的开发、测试和部署过…

Redis两大持久化方式

Redis具有两种主要的持久化方式&#xff1a;RDB&#xff08;Redis Database Backup&#xff09;和AOF&#xff08;Append-Only File&#xff09;。 1. RDB持久化方式 1.1 RDB概述 RDB&#xff08;Redis Database Backup&#xff09; RDB是Redis进行快照持久化的一种方式。它…

【Javascript】Javascript高级程序设计:dom 随手笔记

文章目录 一、dom 元素类型1.1 Node1.2 document1.3 Element1.4 Text 二、dom 操作2.1 querySelector、querySelectorAll2.2 元素遍历2.3 classList 操作2.4 焦点管理2.5 HTMLDocument 变化2.6 自定义数据属性2.7 插入标记2.7.1 innerHTML2.7.2 outerHTML 2.8 scrollIntoView 三…

【推荐系统】推荐算法:冷启动-召回-粗排-精排-重排 解读

【推荐系统】推荐算法&#xff1a;冷启动-召回-粗排-精排-重排 解读 文章目录 【推荐系统】推荐算法&#xff1a;冷启动-召回-粗排-精排-重排 解读1. 介绍2. 冷启动2.1 用户冷启动2.1.1 利用用户注册信息冷启动2.1.2 好物推荐冷启动2.1.3 问题启发式冷启动2.1.4 社交冷启动2.1.…

Qt程序执行编译输出内容解释

以这个为例&#xff1a; D:\SoftwareInstall\Qt6\Tools\QtCreator\bin\jom\jom.exe -f Makefile.Debug cd AuthorizeTools\ && ( if not exist Makefile D:\SoftwareInstall\Qt6\5.15.2\msvc2019_64\bin\qmake.exe -o Makefile E:\Coding\project\DigitalCamera\digita…

渗透测试流程是什么?这篇给你讲清楚!

在学习渗透测试之初&#xff0c;有必要先系统了解一下它的流程&#xff0c;静下心来阅读一下&#xff0c;树立一个全局观&#xff0c;一步一步去建设并完善自己的专业领域&#xff0c;最终实现从懵逼到牛逼的华丽转变。渗透测试是通过模拟恶意黑客的攻击方法&#xff0c;同时也…

ceph高可用、手动安装

操作系统&#xff1a;centos8 三台服务器&#xff1a; 192.168.6.22&#xff1a;mon,mgr,mds,osd 192.168.6.23&#xff1a;mon,mgr,mds,osd 192.168.6.24&#xff1a;mon,mgr,mds,osd 正式环境osd和mon不应该在一个节点&#xff0c;建议osd单独服务器安装。 ceph版本&am…

python scrapy 报错 DEBUG: Ignoring response 403

DEBUG: Ignoring response <403 https://digital.ucas.com/coursedisplay/results/courses?studyYear2024>: HTTP status code is not handled or not allowed原因&#xff1a;被屏蔽了&#xff0c;在settings.py 里面配一下USER_AGENT&#xff08;随便写一个就行&#…

历年上午真题笔记(2014年)

解析:A 网络设计的三层模型 : 接入层:Layer 2 Switching,最终用户被许可接入网络的点,用户通过接入层可以访问网络设备。 汇聚层:Layer2/3 Switching,访问层设备的汇聚点,负责汇接配线单元,利用二、三层技术实现工作组分段及网络故障的隔离,以免对核心层网络设备造…

A股风格因子看板 (2023.10 第13期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第13期&#xff0c;指数组合数据截止日2023-09-30&#xff0c;要点如下 近1年A股风格因子检验统…