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

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

相关推荐
Elastic 中国社区官方博客3 小时前
Elasticsearch 混合搜索 - Hybrid Search
大数据·人工智能·elasticsearch·搜索引擎·ai·语言模型·全文检索
@心都3 小时前
机器学习数学基础:29.t检验
人工智能·机器学习
9命怪猫3 小时前
DeepSeek底层揭秘——微调
人工智能·深度学习·神经网络·ai·大模型
kcarly5 小时前
KTransformers如何通过内核级优化、多GPU并行策略和稀疏注意力等技术显著加速大语言模型的推理速度?
人工智能·语言模型·自然语言处理
EasyNVR5 小时前
EasyRTC智能硬件:实时畅联、沉浸互动、消音护航
运维·服务器·网络·安全·音视频·webrtc·p2p
MinIO官方账号6 小时前
使用 AIStor 和 OpenSearch 增强搜索功能
人工智能
江江江江江江江江江7 小时前
深度神经网络终极指南:从数学本质到工业级实现(附Keras版本代码)
人工智能·keras·dnn
Fansv5877 小时前
深度学习-2.机械学习基础
人工智能·经验分享·python·深度学习·算法·机器学习
小怪兽会微笑7 小时前
PyTorch Tensor 形状变化操作详解
人工智能·pytorch·python
Erekys8 小时前
视觉分析之边缘检测算法
人工智能·计算机视觉·音视频