Java原来可以这么玩!CV实现多张图片生成视频

前言

比如我像将几张图片变成一个视频的形式发不到短视频平台,虽然短视频平台也有上传图片变成视频的功能,但是我想要具体控制每张图片显示多久后切换到下一个图片,短视频平台目前无法实现,于是乎,我用java代码实现了这个功能。

生成视频展示

多张图片生成视频

javaCV 简介

JavaCV 是一个开源的计算机视觉库,专门为 Java 平台设计。它是一个封装库,通过提供一个统一且易于使用的 API,使得开发者能够访问和利用多种流行的计算机视觉和多媒体处理库。

以下是一些 JavaCV 的主要特性和方面:

  1. 集成多种库:JavaCV 集成了多个开源的计算机视觉和多媒体处理库,包括:

    • OpenCV:一个强大的实时计算机视觉库。
    • FFmpeg:一个广泛用于音频和视频处理的多媒体框架。
  2. 跨平台支持:JavaCV 支持多种操作系统,包括 Windows、Linux、MacOS,以及移动平台 Android 和 iOS。

  3. JNI 调用:JavaCV 基于 JavaCPP 调用方式(JNI 的一层封装),使得 Java 程序能够直接调用 C/C++ 的原生库,从而实现高性能的计算机视觉处理。

  4. 硬件加速:JavaCV 提供了硬件加速的全屏幕图像显示(CanvasFrame),可以提高图像处理和显示的效率。

  5. 并行处理:JavaCV 易于在多个内核中执行并行代码,有助于提升计算密集型任务的性能。

  6. 实用工具类:JavaCV 提供了一系列辅助类和方法,帮助开发者更容易地将 OpenCV、FFmpeg 等库的功能融入到 Java 应用程序中。

  7. 文档与资源:JavaCV 提供了中文文档和中英对照文档下载,包括 API 文档、源代码、Maven 依赖信息文件等,方便开发者参考和学习。

通过使用 JavaCV,开发者可以在 Java 平台上轻松地进行图像处理、视频分析、机器学习等计算机视觉相关的开发工作。

教程

添加jar依赖

   <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform --><dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.9</version></dependency>

需要要到的图片如下:
在这里插入图片描述

完整代码如下:


import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.*;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** @author tarzan*/
public class ImageToVideo {final static String imagePath = "E:/images";final static String videoPath = "E:/video/imageVideo3.mp4";final static int interval = 3;//视频每秒帧率final static int frameRate = 10;public static void main(String[] args) throws Exception {long start = System.currentTimeMillis();//图片合成视频imagesToVideo(videoPath, imagePath,interval);System.out.println("耗时 " + (System.currentTimeMillis() - start) + " ms");}public static void imagesToVideo(String saveMp4name, String imagesPath,int interval) throws IOException {// 列出目录中所有的图片File fileDir = new File(imagesPath);File[] listFiles = fileDir.listFiles();List<BufferedImage> images = new ArrayList<>(listFiles.length);for (File file : listFiles) {BufferedImage  image= null;try {//读取原图BufferedImage originalImage = ImageIO.read(file);if(BufferedImage.TYPE_4BYTE_ABGR==originalImage.getType()){//转换图片类型image = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_3BYTE_BGR);image.createGraphics().drawImage(originalImage,0,0,null);}else {image=originalImage;}} catch (IOException e) {System.out.println(e.getMessage());}if (image != null) {images.add(image);}}int maxWidth=Integer.MIN_VALUE;int maxHeight=Integer.MIN_VALUE;for (BufferedImage image : images) {if(image.getWidth()>maxWidth){maxWidth=image.getWidth();}if(image.getHeight()>maxHeight){maxHeight=image.getHeight();}}FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(saveMp4name,1920, 1080, 2);// recorder.setVideoBitrate(2000000);recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);recorder.setFormat("mp4");recorder.setFrameRate(frameRate);recorder.start();for (BufferedImage image : images) {int i=images.indexOf(image);System.out.println("处理进度条: " + (i+1) + "/" + images.size());Frame frame = Java2DFrameUtils.toFrame(image);for (int j = 0; j < frameRate*interval; j++) {recorder.record(frame);}i++;}recorder.stop();recorder.release();}}
  • 根据自己的情况修改代码中的图片目录和生成视频的路径,以及每张图片显示的时长。

原理

通过遍历指定文件夹下的所有图片,求出最大的宽度和高度,设置为视频的宽高。以每秒30帧为单位,复制每张图片为30张或者30*n张,添加到视频录制器内,最终生成视频。

控制台运行输出日志
在这里插入图片描述

  • 6张图片生成每秒30帧的视频,需要8.5s。
  • 6张图片生成每秒10帧的视频,需要4.6s。
  • 帧率设置为10以下时候,首次打开视频的开头会出现延时黑屏的现象,所以建议帧率为10以上。
    在这里插入图片描述
    -后续还可以用视频工具(比如剪映等)整合背景音乐视频。

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

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

相关文章

【数据结构】C语言实现链式二叉树(附完整运行代码)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.项目功能演示 三.逐步实现项目功能模块及其逻辑详解 1.实现链式二叉树程序菜单 2.实现链式二叉树程序功能可循环使用 3.实现链式二叉树的新结点…

LeetCode-回文链表(234)

题目描述&#xff1a; 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 因为这一题是受到876题求链表中间节点的启发&#xff0c;所以在这里也加一下。 876.链表的中间结点…

探索 HTTP 请求的世界:get 和 post 的奥秘(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

在Go语言中实现HTTP中间件

在Web开发中&#xff0c;中间件是一种非常流行的设计模式&#xff0c;它可以用于处理请求、拦截请求并对其进行处理或转换。而在Go语言中&#xff0c;实现HTTP中间件就像给自己的HTTP服务器穿上了一层“魔法外衣”&#xff0c;让它变得更加灵活、可配置和可扩展。下面&#xff…

有可以平替SSL证书的数字证书吗

SSL证书和数字证书并不是完全等价的概念。SSL证书是一种数字证书的一种应用&#xff0c;用于在网络中加密和身份验证。数字证书是一种用于加密通信和验证身份的技术&#xff0c;SSL证书就是数字证书的一种特定形式。 除了SSL证书之外&#xff0c;还有其他类型的数字证书&#…

QT trimmed和simplified

trimmed&#xff1a;去除了字符串开头前和结尾后的空白&#xff1b; simplified&#xff1a;去除了字符串开头前和结尾后的空白&#xff0c;以及中间内部的空白字符也去掉&#xff08;\t,\n,\v,\f,\r和 &#xff09; 代码&#xff1a; QString str " 1 2 3 4 5 …

Apache Commons BeanUtils: JavaBean操作的艺术

第1部分&#xff1a;Apache Commons BeanUtils 简介 咱们今天聊聊Apache Commons BeanUtils。这货简直就是处理JavaBean的利器&#xff0c;用起来又方便又快捷。不管是属性拷贝、类型转换&#xff0c;还是动态访问&#xff0c;BeanUtils都能轻松应对。 BeanUtils是啥&#xf…

043、循环神经网络

之——RNN基础 杂谈 第一个对于序列模型的网络&#xff0c;RNN。 正文 1.潜变量自回归模型 潜变量总结过去的信息&#xff0c;再和当前信息一起结合出新的信息。 2.RNN 循环神经网络将观察作为x&#xff0c;与前层隐变量结合得到输出 其中Whh蕴含了整个模型的时序信息&#xf…

NET中使用SQLSugar操作sqlserver数据库

目录 一、SqlSugar是什么&#xff1f; 二、迁移和建表 1.建立实体 2.创建上下文类 3.在Program中添加SqlSugar服务 4.在控制器中注入上下文类 三、简单实现CURD功能 总结 一、SqlSugar是什么&#xff1f; SqlSugar是一款老牌 .NET 开源ORM框架。 主要特点&#xff1a…

让某个页面一直处于最前面,可以屏蔽切屏检测

前言 学习通智慧树网课分屏&#xff0c;让某个页面一直处于最前面&#xff0c;可以屏蔽切屏检测。 页面一直处于最前面 前言1 安装包2 使用 1 安装包 https://download.csdn.net/download/qq_44850489/76684366 2 使用 一直下一步就可以 选择要放到前面的窗口&#xff0c…

设计模式--工厂方法模式

实验3&#xff1a;工厂方法模式 本次实验属于模仿型实验&#xff0c;通过本次实验学生将掌握以下内容&#xff1a; 1、理解工厂方法模式的动机&#xff0c;掌握该模式的结构&#xff1b; 2、能够利用工厂方法模式解决实际问题。 [实验任务]&#xff1a;加密算法 目前常用…

ts相关笔记(extends、infer、Pick、Omit)

最近刷了本ts小册&#xff0c;对一些知识点做下笔记。 extends extends 是一个关键字&#xff0c;用于对类型参数做一些约束。 A extends B 意味着 A 是 B 的子类型&#xff0c;比如下面是成立的 ‘abc’ extends string599 extends number 看下面例子&#xff1a; type …

Leetcode—86.分隔链表【中等】

2023每日刷题&#xff08;六十九&#xff09; Leetcode—86.分隔链表 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* partition(struct ListNode* head, int x) {struct ListNode…

C语言操作符if语句好习惯 详解分析操作符(详解4)

各位少年&#xff1a; 前言 还记得我们上一章讲过一个比较抽象的代码&#xff0c;它要比较两次都是真的情况下才能打印&#xff0c;那么很显然这样写代码是有弊端的&#xff1f;哪我们C语言之父丹尼斯.里奇&#xff0c;先介绍一下上次拉掉了if语句的好习惯 好再分享一些操作符…

【基础篇】一、认识JVM

文章目录 1、虚拟机2、Java虚拟机3、JVM的整体结构4、Java代码的执行流程5、JVM的三大功能6、JVM的分类7、JVM的生命周期 1、虚拟机 虚拟机&#xff0c;Virtual Machine&#xff0c;一台虚拟的计算机&#xff0c;用来执行虚拟计算机指令。分为&#xff1a; 系统虚拟机&#x…

结构体的对齐规则

1.引入 我们在掌握了结构体的基本使⽤后。 现在我们深⼊讨论⼀个问题&#xff1a;计算结构体的大小。 这也是⼀个特别热门的考点&#xff1a; 结构体内存对齐。 2.具体分析 ⾸先我们得掌握结构体的对⻬规则&#xff1a; 1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量…

Flutter详解及案例代码

概念 Flutter是由Google开发的开源UI框架&#xff0c;旨在快速构建高质量的移动应用程序。与传统的移动应用开发方式不同&#xff0c;Flutter使用单一代码库构建应用程序&#xff0c;可以同时在iOS和Android上运行。 Flutter的核心是使用Dart语言编写的&#xff0c;并且具有自…

如何解决HTTP 404错误,这里给出详细解决办法

404错误是一个HTTP状态代码,这意味着你试图在网站上访问的页面在他们的服务器上找不到。 需要明确的是,该错误表示虽然服务器本身是可访问的,但显示该错误的特定页面是不可访问的。 个别网站经常自定义这个错误信息。所以,请记住,错误可能会以任何可以想象的方式出现,这…

网络编程--socket编程

这里写目录标题 套接字概念通信原理总结 预备知识网络字节序简介字节转换函数 IP地址转换函数为什么单独列出函数原型sockaddr结构体 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 套接字 概念 Socket本身有插座的意思&#xff0c;但他是进程之间网络通…

解决Qt“报无法定位程序输入点xxx于动态连接库“问题

今天&#xff0c;在使用QtVS2019编译工程时&#xff0c;弹出"无法定位程序输入点xxx于动态链接库"问题&#xff0c;如图(1)所示&#xff1a; 图(1) 报"无法定位程序输入点xxx于动态链接库"问题 出现这种问题的原因有很多&#xff1a; (1) 工程Release/Deb…