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

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

相关推荐
Panesle几秒前
月之暗面开源-音频理解、生成和对话生成模型:Kimi-Audio-7B-Instruct
人工智能·音视频·语音生成
视觉语言导航8 分钟前
复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航
人工智能·深度学习·机器人·transformer·具身智能
kebijuelun9 分钟前
OpenVLA:大语言模型用于机器人操控的经典开源作品
人工智能·语言模型·机器人
掘金安东尼17 分钟前
大模型+Python脚本,打造属于你的“批量生成文档”应用!
人工智能
vocal18 分钟前
谷歌第七版Prompt Engineering—第二部分
人工智能·后端
Blossom.11827 分钟前
量子计算在密码学中的应用与挑战:重塑信息安全的未来
人工智能·深度学习·物联网·算法·密码学·量子计算·量子安全
子燕若水28 分钟前
How do I install OpenCV with gpu support
人工智能·opencv·计算机视觉
明明跟你说过38 分钟前
深度学习常见框架:TensorFlow 与 PyTorch 简介与对比
人工智能·pytorch·python·深度学习·自然语言处理·tensorflow
搏博40 分钟前
专家系统的基本概念解析——基于《人工智能原理与方法》的深度拓展
人工智能·python·深度学习·算法·机器学习·概率论
yzx99101340 分钟前
决策树随机深林
人工智能·python·算法·决策树·机器学习