多张图片合成一个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秒。

相关文章
|
7月前
|
人工智能 自然语言处理 API
图片转音乐模型来了!Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!
图片转音乐模型来了!Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!
285 1
[笔记]音视频学习之SDL篇《五》裁剪图片成子图片(裁剪精灵表)
[笔记]音视频学习之SDL篇《五》裁剪图片成子图片(裁剪精灵表)
|
编解码 算法 文件存储
浅谈动图文件格式 - GIF
介绍动图的文件格式,及其优劣
1967 0
浅谈动图文件格式 - GIF
|
3月前
|
Python
图像序列帧恢复为GIF动图
使用Python的imageio库将图像序列帧恢复为GIF动图,支持自定义持续时间和尺寸调整。
图像序列帧恢复为GIF动图
使用ffmpeg拼接两张图片
最近在工作中遇到了一个需求,就是需要将两张图片拼接在一起,作为一个封面图。如果只是临时拼接一张,我们可以只用photoshop之类的图片编辑工具,将两张图片拼接在一起。而我们的需要是需要实现自动化,由于之前使用过ffmpeg做过图片的操作,于是搜索了下,ffmpeg确实能实现两张图片的拼接,这里分享下相关操作的命令行。
162 0
|
机器学习/深度学习 计算机视觉
【图片操作】提取GIF的图片帧
gif是我们日常生活中常用的一种图片,它介于视频和图片之间。我们可以用图片的内存体验到一些视频的感觉。但是有时候我们会想把gif的图片全部提取出来,今天我们就来实现一下这个操作。
432 0
|
前端开发
canvas实现海报 两张图片合成一张并且可以保存
canvas实现海报 两张图片合成一张并且可以保存
canvas实现海报 两张图片合成一张并且可以保存
|
JavaScript
php-单张图片、多张图片、视频上传
php-单张图片、多张图片、视频上传
257 0
php-单张图片、多张图片、视频上传
【图片操作】给图片添加滤镜
现在我们都喜欢给图片添加滤镜,现在很多相机也自带了许多滤镜。我们可以在拍照的时候选择需要的滤镜。但是有时候我们需要给大量图片添加同样的滤镜,这个时候手动添加就非常麻烦了。为了方便,我们可以使用程序来帮我们完成添加滤镜的操作。
266 0
|
计算机视觉
【方便的Opencv】实现图片合成视频+附带图片生成gif
【方便的Opencv】实现图片合成视频+附带图片生成gif
【方便的Opencv】实现图片合成视频+附带图片生成gif