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

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

相关推荐
lusasky6 分钟前
大模型混合多语言理解的原理
人工智能·神经网络·机器学习·nlp
AI即插即用7 分钟前
即插即用系列 | 2025 SOTA Strip R-CNN 实战解析:用于遥感目标检测的大条带卷积
人工智能·pytorch·深度学习·目标检测·计算机视觉·cnn·智慧城市
冬虫夏草199313 分钟前
在transformer中使用househoulder reflection(mirror transform)替代layernorm
人工智能·transformer
沛沛老爹23 分钟前
AI入门之GraphRAG企业级部署性能优化策略:从索引到检索的全链路提效实践
人工智能·ai·性能优化·rag·入门知识·graphrag·lightrag
FreeBuf_25 分钟前
突破IAM孤岛:身份安全架构为何对保护AI与非人类身份至关重要
人工智能·安全·安全架构
大千AI助手30 分钟前
平衡二叉树:机器学习中高效数据组织的基石
数据结构·人工智能·机器学习·二叉树·大模型·平衡二叉树·大千ai助手
z***I39431 分钟前
机器学习难点
人工智能·机器学习
U***e6331 分钟前
机器学习超参数调优:GridSearch
人工智能·机器学习
n***293231 分钟前
机器学习超参数调优
人工智能·机器学习
九年义务漏网鲨鱼32 分钟前
【多模态大模型面经】现代大模型架构(一): 组注意力机制(GQA)和 RMSNorm
人工智能·深度学习·算法·架构·大模型·强化学习