javacv和opencv对图文视频编辑-用多张图片合成MP4视频

狠人话不多,直接上代码

java 复制代码
package com.bitar.javavideo.test;

import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Java2DFrameConverter;

import javax.imageio.ImageIO;
import java.io.File;

/**
 * 把图片转换为MP4视频 ,
 * dir:D:\desktop\test\test01
 * 1个图1秒
 */
public class Test01 {

    public static void main(String[] args) throws Exception {

        String outPutFile = "D:\\desktop\\test\\test01\\01-result.mp4";


        int imgWidth = 512;
        int imgHeight = 512;

        // FFmpegFrameRecorder:处理视频帧
        //视频宽高最好是按照常见的视频的宽高  16:9  或者 9:16
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outPutFile, imgWidth, imgHeight);
        //设置视频编码层模式
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
        //1-代表1帧/s
        Double FrameRate = 25.0D;
        recorder.setFrameRate(FrameRate);

        /*
         * videoBitRate这个参数很重要,当然越大,越清晰,但最终的生成的视频也越大。
         * 查看一个资料,说均衡考虑建议设为videoWidth*videoHeight*frameRate*0.07*运动因子,运动因子则与视频中画面活动频繁程度有关,如果很频繁就设为4,不频繁则设为1
         */
        int motionFactory = 1;
        recorder.setVideoBitrate((int) ((imgWidth * imgHeight * FrameRate) * motionFactory * 0.07));

        //设置视频图像数据格式
        int pixelFormat = avutil.AV_PIX_FMT_YUV420P;
        recorder.setPixelFormat(pixelFormat);
        String format = "mp4";
        recorder.setFormat(format);
        //         双通道(立体声)
        // recorder.setAudioChannels(grabber.getAudioChannels());
        recorder.setAudioChannels(2);

        recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);

        recorder.start();
        // 录制视频
        Java2DFrameConverter converter = new Java2DFrameConverter();
        //URL imgUrl = new URL("D:\\desktop\\test\\img1.png");

        //根据每秒的帧数 记录多少次图片,
        for (int i = 0; i < 25; i++) {
            recorder.record(converter.getFrame(ImageIO.read(new File("D:\\desktop\\test\\test01\\512x512-1.png"))));
        }
        for (int i = 0; i < 25; i++) {
            recorder.record(converter.getFrame(ImageIO.read(new File("D:\\desktop\\test\\test01\\512x512-2.png"))));
        }
        for (int i = 0; i < 25; i++) {
            recorder.record(converter.getFrame(ImageIO.read(new File("D:\\desktop\\test\\test01\\512x512-3.png"))));
        }

        recorder.close();

    }
}

补充:

FFmpegFrameRecorder 可以当成录像机,往录像中加入一张张图片,最后就是视频。

FFmpegFrameRecorder 记录的是frame(视频帧),所以需要将图片转换为Frame需要借助Java2DFrameConverter 。可以将本地图片、字节、网络图片等作为录像机的图片来源。

注意:最终视频是一个固定宽高的视频,所以图片最好是相同尺寸,关于图片的编辑、音频编辑后续会讲到,欢迎关注下哈

相关推荐
Good kid.3 分钟前
基于XGBoost的中文垃圾分类系统实战(TF-IDF + XGBoost)
人工智能·分类·tf-idf
It's now7 小时前
Spring AI 基础开发流程
java·人工智能·后端·spring
Glad_R7 小时前
巧用AI流程图,让信息呈现更全面
人工智能·信息可视化·产品运营·流程图·产品经理
西南胶带の池上桜8 小时前
1.Pytorch模型应用(线性与非线性预测)
人工智能·pytorch·python
杀生丸学AI8 小时前
【无标题】VGGT4D:用于4D场景重建的视觉Transformer运动线索挖掘
人工智能·深度学习·3d·aigc·transformer·三维重建·视觉大模型
小和尚同志8 小时前
还在手动配置?这款开源软件让你一键配置 Claude Code 和 Codex
人工智能·aigc
阿正的梦工坊8 小时前
ProRL:延长强化学习训练,扩展大语言模型推理边界——NeurIPS 2025论文解读
人工智能·语言模型·自然语言处理
致Great8 小时前
Ollama 进阶指南
人工智能·gpt·chatgpt·agent·智能体
Nautiluss9 小时前
一起玩XVF3800麦克风阵列(八)
大数据·人工智能·嵌入式硬件·github·音频·语音识别