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 。可以将本地图片、字节、网络图片等作为录像机的图片来源。

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

相关推荐
zhangfeng11332 小时前
国家超算中心 scnet.cn 跨用户文件分享流程总结 多个用户之间 文件共享 不需要反复下载上传
人工智能·语言模型·大模型
ting94520005 小时前
Tornado 全栈技术深度指南:从原理到实战
人工智能·python·架构·tornado
果汁华6 小时前
Browserbase Skills:让 Claude Agent 真正“看见“网页世界
人工智能·python
ZhengEnCi6 小时前
04-缩放点积注意力代码实现 💻
人工智能·python
HackTwoHub7 小时前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
段一凡-华北理工大学7 小时前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章08:多模态数据融合:让数据更聪明
人工智能·python·高炉炼铁·ai赋能·工业智能体·高炉炉温
网络工程小王7 小时前
【LangChain 大模型6大调用指南】调用大模型篇
linux·运维·服务器·人工智能·学习
HIT_Weston7 小时前
63、【Agent】【OpenCode】用户对话提示词(示例)
人工智能·agent·opencode
CV-杨帆7 小时前
Phi-4-mini-flash-reasoning 部署安装与推理测试完整记录
人工智能
MediaTea8 小时前
AI 术语通俗词典:C4.5 算法
人工智能·算法