javacv和opencv对图文视频编辑-按指定间隔从视频抽取缩略图

1、java代码抽取视频缩略图

直接上代码

首先pom

引入了javacv和Thumbnails

        <!-- 引入javacv --><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5.6</version></dependency><!--此包会自动引入各大平台的依赖jar(内含dll)--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.6</version></dependency><!-- 图片处理 --><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency>

代码:

package com.bitar.javavideo.test;import net.coobird.thumbnailator.Thumbnails;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;/*** 从视频固定间隔抽帧,并保存为图片*/
public class Test02 {public static void main(String[] args) throws IOException {String videoUrl = "D:\\desktop\\test\\test02\\01-result.mp4";videoIntercept("D:\\desktop\\test\\test02\\", videoUrl, 1000);}/*** 视频文件指定时间段的帧截取** @param outDir       输出目录* @param videoUrl     视频文件URL* @param milliSeconds 多少毫秒一张* @return*/public static void videoIntercept(String outDir, String videoUrl, long milliSeconds) {//<时间, 图片流>FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoUrl);fFmpegFrameGrabber.setOption("timeout", "40000000");try {fFmpegFrameGrabber.start();System.out.println(fFmpegFrameGrabber.getFormatContext().duration());//13002000System.out.println(fFmpegFrameGrabber.getLengthInTime());//13002000System.out.println(fFmpegFrameGrabber.getLengthInFrames());//390System.out.println(fFmpegFrameGrabber.getVideoFrameRate());//30.0//视频秒数=fFmpegFrameGrabber.getLengthInTime()/1000000LSystem.out.println(fFmpegFrameGrabber.getLengthInTime() / 1000000L);//13//实际不到13秒,但是计算的帧数按时间计算有偏差long total = fFmpegFrameGrabber.getLengthInTime();long start = 0;int num = 0;while (start <= total) {//不设置setTimestamp ,则逐帧拉取fFmpegFrameGrabber.setTimestamp(start);//逐帧拉取Frame frame = fFmpegFrameGrabber.grabImage();//因为秒计算有误差,导致溢出边界if (frame == null) {break;}num++;boolean ok = frameToImageFile(frame, String.format("%s/%s", outDir, num + ".jpg"),null);//缩小图片//Thumbnails.of(String.format("%s/%s", outDir, num + ".jpg")).size(512, 512).toFile(String.format("%s/%s", outDir, num + ".jpg"));System.out.println(num + "=" + ok);start += milliSeconds * 1000L;if (start > total) {break;}}fFmpegFrameGrabber.stop();} catch (Exception e) {e.printStackTrace();}}/**** @param frame* @param fileName* @param imgFormatName 默认jpg* @return* @throws IOException*/public static boolean frameToImageFile(Frame frame, String fileName, String imgFormatName) throws IOException {if (frame == null || frame.image == null) {return false;}if (imgFormatName == null || imgFormatName.length() == 0) {imgFormatName = "jpg";}Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage bi = converter.getBufferedImage(frame);//图片格式可调整return ImageIO.write(bi, imgFormatName, new File(fileName));}}

//代码中有注释,建议本地运行和调试,上手快

2、利用ffmpeg的命令行抽取

要从视频中抽取缩略图,您可以使用ffmpeg命令行工具。以下是从视频中按指定间隔抽取缩略图的步骤:

  1. 下载并安装ffmpeg:您可以从官方网站(https://ffmpeg.org/)下载适合您操作系统的版本,并将其安装到您的计算机上。

  2. 打开命令提示符(Windows)或终端(Mac和Linux)。

  3. 导航到包含您的视频文件的目录。例如,如果视频文件位于桌面上的"video"文件夹中,则可以使用以下命令导航到该目录:

cd Desktop/video

  1. 使用以下命令从视频中抽取缩略图:
ffmpeg -i input_video.mp4 -vf fps=1/10 thumbnail%d.png

在这个命令中,您需要将"input_video.mp4"替换为您的视频文件名。指定的"-vf fps=1/10"选项表示您想要每10帧抽取一个缩略图。"thumbnail%d.png"指定了输出文件的名称和格式,其中"%d"将被替换为序号(例如,thumbnail1.png,thumbnail2.png等)。

  1. 执行命令后,ffmpeg将开始处理视频并抽取缩略图。您会在当前目录下看到生成的缩略图文件。

请注意,ffmpeg还有许多其他选项和参数,您可以根据您的需求进行自定义。您可以参考ffmpeg的文档以获取更多信息和示例。

下一篇,将多个视频和音频拼接为一个完整视频

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

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

相关文章

Spring Boot - Application Events 同步 VS 异步 发布订阅事件实战

文章目录 PreCode基础工程启动类切入口事件 发布事件同步 Listener异步Listener增加EnableAsync增加 Async 测试 Pre Spring Boot - Application Events 的发布顺序_ApplicationStartingEvent Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEv…

Android Lint的使用

代码检查方式一&#xff1a; Android Studio使用Lint进行代码检查 找到Analyze目录下的Inspect Code检查代码选项点击然后弹出下面这个框框&#xff0c;在这个列表选项中我们可以选择Inspect Code的范围&#xff0c;点击OK 待分析完毕后&#xff0c;我们可以在Inspection栏目中…

安装、运行和控制AI apps在您的计算机上一键式

pinokio 你是否曾为安装、运行和自动化 AI 应用程序和大模型而感到困惑&#xff1f;是否希望有一个简单而强大的工具来满足你的需求&#xff1f;如果是这样&#xff0c;那么 Pinokio 将会是你的理想选择&#xff01;Pinokio 是一款革命性的人工智能浏览器&#xff0c;是一个开…

Nocalhost 为 KubeSphere 提供更强大的云原生开发环境

1 应用商店安装 Nocalhost Server 已集成在 KubeSphere 应用商店&#xff0c;直接访问&#xff1a; 设置应用「名称」&#xff0c;确认应用「版本」和部署「位置」&#xff0c;点击「下一步」&#xff1a; 在「应用设置」标签页&#xff0c;可手动编辑清单文件或直接点击「安装…

【Tricore】基于主流芯片, 浅谈ECU多核架构与“核间通信”

文章目录 概要 整体架构 简单聊聊什么是多核架构和“核间通信”

力扣labuladong——一刷day91

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣208. 实现 Trie (前缀树)二、力扣648. 单词替换 前言 Trie 树又叫字典树、前缀树、单词查找树&#xff0c;是一种二叉树衍生出来的高级数据结构&#x…

2024.1.13

今天想开个新坑&#xff0c;于是我就开始学习数据结构了&#xff0c;那玩意怎么说呢&#xff0c;挺抽象的东西&#xff0c;有点难懂&#xff0c;我就一边做笔记一边暂停&#xff0c;就这么硬学&#xff0c;数据结构确实是编程中一个十分重要的东西&#xff0c;必须给他拿下昂。…

#每日一题#力扣#2085.统计出现过一次的公共字符串

给你两个字符串数组 words1 和 words2 &#xff0c;请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 示例 1&#xff1a; 输入&#xff1a;words1 [“leetcode”,“is”,“amazing”,“as”,“is”], words2 [“amazing”,“leetcode”,“is”] 输出&#xff1a;…

HCIP-1

一、网络类型&#xff1a; 点到点 BMA&#xff1a;广播型多路访问 – 在一个MA网络中同时存在广播&#xff08;洪泛&#xff09;机制 NBMA&#xff1a;非广播型多路访问—在一个MA网络中&#xff0c;没有洪泛机制 MA&#xff1a;多路访问 在一个网段内&#xff0c;存在的节…

大模型实战营Day4 XTuner 大模型单卡低成本微调实战

本次讲师是一位从事算法工作的优秀贡献者。 一起来看看吧&#xff01; 本次课程内容主要有&#xff1a; 我将在此整理前三节的内容&#xff0c;第四节放在作业章节进行讲解&#xff1a; 同第三节的建立数据库中所提及到的&#xff0c;如果通用大模型在专用领域表现能力不强&…

MySQL操作手册:高效管理、轻松查询!

MySQL操作手册&#xff1a;高效管理、轻松查询&#xff01; 文章目录 MySQL操作手册&#xff1a;高效管理、轻松查询&#xff01;1、常用SQL命令1.1 数据库操作1.2 表操作1.3 数据操作1.4 索引操作1.5 权限管理1.5.1 创建用户1.5.2 授予权限1.5.3 撤销权限1.5.4 刷新权限 2、常…

普通两样本孟德尔随机化仍能发一区! | 孟德尔随机化周报(1.03-1.09)

欢迎报名2024年孟德尔随机化方法高级班课程&#xff01; 郑老师团队开设的孟德尔随机化高级班2024年1月20-21日开课&#xff0c;欢迎报名 孟德尔随机化,Mendilian Randomization&#xff0c;简写为MR&#xff0c;是一种在流行病学领域应用广泛的一种实验设计方法&#xff0c;利…

【C++ 程序设计入门基础】- 第4节-函数

1、函数 函数是对实现某一功能的代码的模块化封装。 函数的定义&#xff1a; 标准函数&#xff1a; 输入 n 对整数的 a、b &#xff0c;输出它们的和。 #include <iostream> #include <windows.h> using namespace std;int add(int a,int b);//函数原型声明int…

分享一个好用的免费在线扣图网址

具体效果 附地址 https://cutout.aiwave.cc/

洛谷 P8443 gcd.

题目描述 T T T 组数据&#xff0c;每一组数据给定 l , r , x l,r,x l,r,x&#xff0c;试求&#xff1a; gcd ⁡ ( ⌊ l x ⌋ , ⌊ l 1 x ⌋ , ⋯ , ⌊ r x ⌋ ) \gcd(\lfloor \frac{l}{x}\rfloor,\lfloor \frac{l1}{x}\rfloor,\cdots,\lfloor \frac{r}{x}\rfloor) gcd(⌊xl​…

dpdk20.11.9 编译arm版本以及在arm 应用中引用dpdk20.11.9

以往19版本的dpdk 都是可以直接用make 的方式进行编译, e.g, make Tx86_64-native-linux-gcc install 为了和客户那边用的DPDK 版本一致, 这次要用dpdk20.11.9, 并且要把之前跑在X86 版本的服务器上的程序跑在ARM 版本上. 目前有两个问题: 1. 编译出arm 版本的dpdk. 2. 把…

程序员副业之AI文库项目(超详细完整全流程)

引言 大家好&#xff0c;我是小黑&#xff0c;今天给大家介绍一个特别简单的项目&#xff0c;用AI辅助咱们来编写各种word&#xff0c;PPT等资料上传到百度文库、原创力、道客巴巴、csdn等平台赚取被动的睡后收益。 但要注意&#xff0c;只是辅助&#xff0c;即便是用AI辅助&…

Flink窗口(2)—— Window API

目录 窗口分配器 时间窗口 计数窗口 全局窗口 窗口函数 增量聚合函数 全窗口函数&#xff08;full window functions&#xff09; 增量聚合和全窗口函数的结合使用 Window API 主要由两部分构成&#xff1a;窗口分配器&#xff08;Window Assigners&#xff09;和窗口函…

【力扣100】20.有效的括号 || 栈

添加链接描述 class Solution:def isValid(self, s: str) -> bool:if len(s)%2!0:return Falsestack[]dic{")":"(","]":"[","}":"{",}for i in s:if i not in dic:stack.append(i)elif not stack or dic[i]!s…

wpf使用Popup封装数据筛选框--粉丝专栏

类似于DevExpress控件的功能 这是DevExpress的winform筛选样式&#xff0c;如下&#xff1a; 这是DevExpress的wpf筛选样式&#xff0c;如下&#xff1a; 这是Excel的筛选样式&#xff0c;如下&#xff1a; 先看效果 本案例使用wpf原生控件封装&#xff0c;功能基本上都满足…