多张图片合成一个mp4的视频

简介: 多张图片合成一个mp4的视频

maven配置阿里云镜像,包比较大

一、依赖

<dependency>
  <groupId>org.bytedeco</groupId>
  <artifactId>javacv-platform</artifactId>
  <version>1.5.4</version>
</dependency>

二、工具类

package com.cc.demo.unit;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.FrameRecorder;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.ffmpeg.global.avcodec;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
 
public class videoUtil {
    public static void createmp4(String outpath, String inputpath, int time) throws FrameRecorder.Exception {
        File folder = new File(outpath);
        if (!folder.exists()) {
            folder.mkdirs();
        }
        //合成的MP4
        String mp4SavePath = outpath + System.currentTimeMillis() + ".mp4";
        int width = 1600;
        int height = 900;
        //读取所有图片
        File file = new File(inputpath);
        File[] files = file.listFiles();
        Map<Integer, File> imgMap = new HashMap<Integer, File>();
        int num = 0;
        for (File imgFile : files) {
            imgMap.put(num, imgFile);
            num++;
        }
        create(mp4SavePath, imgMap, width, height, time);
    }
 
    private static void create(String mp4SavePath, Map<Integer, File> imgMap, int width, int height, int time) throws FrameRecorder.Exception, FrameRecorder.Exception {
        //视频宽高最好是按照常见的视频的宽高  16:9  或者 9:16
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(mp4SavePath, width, height);
        //设置视频编码层模式
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
        //设置视频为25帧每秒
        recorder.setFrameRate(25);
        //设置视频图像数据格式
        recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
        recorder.setFormat("mp4");
        try {
            recorder.start();
            Java2DFrameConverter converter = new Java2DFrameConverter();
            //根据文件数量定义视频时长
            for (int i = 0; i < imgMap.size(); i++) {
                BufferedImage read = ImageIO.read(imgMap.get(i));
                for (int j = 0; j < 25 * time; j++) {
                    recorder.record(converter.getFrame(read));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //最后一定要结束并释放资源
            recorder.stop();
            recorder.release();
        }
    }
}

三、测试

package com.xx.demo;
 
import com.xx.demo.unit.videoUtil;
import org.bytedeco.javacv.FrameRecorder;
import org.junit.jupiter.api.Test;
 
 
class DemoApplicationTests {
 
    @Test
    void contextLoads() throws FrameRecorder.Exception {
        //输入文件目录
        String img = "C:\\Users\\yjtzf\\Desktop\\file";
        //输出文件目录
        String mp4SavePath = "C:\\Users\\yjtzf\\Desktop\\mp4\\";
        //每张图片显示时间
        int time=3;
        videoUtil.createmp4(mp4SavePath,img,time);
    }
 
}

5张图片,每张3秒,共15秒。

相关文章
|
网络协议 测试技术 Linux
中国移动ML302模组(4G Cat.1 通信模组)TencentOS-tiny AT模组框架适配
中国移动ML302模组(4G Cat.1 通信模组)TencentOS-tiny AT模组框架适配
723 0
|
Java Linux Maven
IDEA集成Docker构建SpringBoot镜像上传服务器
IDEA集成Docker构建SpringBoot镜像上传服务器
IDEA集成Docker构建SpringBoot镜像上传服务器
|
11月前
|
人工智能 自然语言处理 搜索推荐
AI agent
AI Agent:从被动工具到主动伙伴,人工智能的下一场革命。它具备规划、工具调用、自主执行与迭代能力,不再是鹦鹉学舌的模型,而是能在数字世界替我们“动手做事”的智能体。依托大语言模型、推理框架与API工具链,AI Agent正重塑办公、客服、科研、生活等各领域,开启“人类指挥,AI执行”的人机协作新时代。尽管面临可靠性、安全与成本挑战,它仍标志着AI从“感知”迈向“行动”的关键跃迁。
|
8月前
|
数据采集 JSON Java
实战解析:淘宝商品评论item_review接口
本文详解2025年淘宝开放平台taobao.item.review.get接口合规调用方法,涵盖权限申请、参数配置、HMAC-SHA1签名生成及Java原生代码实现,无需第三方SDK,可快速集成至数据采集系统,稳定获取商品评论详情。
|
9月前
|
人工智能 数据可视化 测试技术
Coze, Dify, N8N:三款主流AI工作流平台在测试中的应用对比
在敏捷开发背景下,Coze、Dify和n8n三大AI工作流平台正革新测试自动化。Coze零代码易上手,适合AI密集型任务;Dify支持私有化部署,适配企业级复杂流程;n8n开源可控,擅长系统集成。三者各有优势,助力测试团队实现高效人机协同,提升测试效能。
|
图形学
【unity实战】时间控制 昼夜交替 四季变化 天气变化效果
【unity实战】时间控制 昼夜交替 四季变化 天气变化效果
1557 0
|
Java 微服务
SpringBoot整合SMS短信服务
本文介绍了如何在SpringBoot项目中整合阿里云SMS短信服务,包括添加依赖、配置文件、配置类、服务层接口和实现类,以及控制器层的实现,用于发送短信验证码。
SpringBoot整合SMS短信服务
|
Android开发 Kotlin
【错误记录】Kotlin 编译报错 ( Type mismatch: inferred type is String? but String was expected )
【错误记录】Kotlin 编译报错 ( Type mismatch: inferred type is String? but String was expected )
3629 0
【错误记录】Kotlin 编译报错 ( Type mismatch: inferred type is String? but String was expected )
|
前端开发 JavaScript
【Web 前端】$(document).ready() 是个什么函数?为什么要用它?
【5月更文挑战第2天】【Web 前端】$(document).ready() 是个什么函数?为什么要用它?
|
缓存 监控 UED
CDN(内容分发网络):加速网站加载与优化用户体验
CDN(内容分发网络):加速网站加载与优化用户体验

热门文章

最新文章