图片生成视频

图片生成视频

需要引入jar包

        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv</artifactId>
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacpp</artifactId>
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>opencv</artifactId>
            <version>4.1.2-1.5.2</version>
            <!-- 本机和Linux不同环境配置不一样 -->
            <!--            <classifier>windows-x86_64</classifier>-->
            <classifier>linux-x86_64</classifier>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>openblas</artifactId>
            <version>0.3.7-1.5.2</version>
            <!--            <classifier>windows-x86_64</classifier>-->
            <classifier>linux-x86_64</classifier>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>ffmpeg</artifactId>
            <version>4.2.1-1.5.2</version>
            <!--            <classifier>windows-x86_64</classifier>-->
            <classifier>linux-x86_64</classifier>
        </dependency>

单个图片生成视频代码,可自行修改为多图生成视频

	/**
     * 图片生成视频
     *
     * @param mp4SavePath 
     * @param img
     * @param second
     * @throws FrameRecorder.Exception
     */
    public static void createMp4(String mp4SavePath, File img, int second) throws FrameRecorder.Exception {
        BufferedImage imgBuff = ImgUtil.read(img);
        //视频宽高最好是按照常见的视频的宽高  16:9  或者 9:16
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(mp4SavePath, imgBuff.getWidth(), imgBuff.getHeight());
        //设置视频编码层模式
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
        //设置视频为25帧每秒
        recorder.setFrameRate(25);
        recorder.setFormat("mp4");
        try {
            recorder.start();
            Java2DFrameConverter converter = new Java2DFrameConverter();
            BufferedImage read = ImageIO.read(img);
            for (int i = 0; i < second; i++) {
                //一秒是25帧 所以要记录25次
                for (int j = 0; j < 25; j++) {
                    recorder.record(converter.getFrame(read), avutil.AV_PIX_FMT_RGB32_1);
                }
            }
        } catch (Exception e) {
            System.out.println("图片生成视频异常 " + e);
        } finally {
            //最后一定要结束并释放资源
            recorder.stop();
            recorder.release();
        }
    }
经实践得经验!!!
在Java中,生成图片序列并将其转换为视频的过程通常涉及到图像处理库,如Apache Commons Imaging或者JavaFX中的SceneGraph API,以及一些视频编码库,比如FFmpeg。以下是一个简单的步骤概述: 1. **图像数据获取**:首先,你需要有一系列的图片文件或从程序内部生成的位图。 2. **图像处理库**:使用`java.awt.image.BufferedImage`或者`javax.imageio.ImageIO`读取和操作图像。 3. **创建帧序列**:将处理后的BufferedImage存储到一个列表或数组中,每张图片代表一帧。 4. **视频框架整合**:使用FFmpeg的Java API(如JNA or JNAerator)或者直接通过命令行调用FFmpeg脚本,将图片序列转换成视频。你可以指定输出视频的格式、分辨率、帧率等参数。 ```java import static com.google.common.io.Files.readAllBytes; import static org.bytedeco.javacpp.opencv.highgui.HighGui.imwrite; import static org.bytedeco.javacv.FrameGrabber.grabFrame; // ... String[] images = ...; // 图片路径数组 int width = ...; // 视频宽度 int height = ...; // 视频高度 // 创建FFmpeg命令 ProcessBuilder pb = new ProcessBuilder("ffmpeg", "-framerate", "25", "-i", String.join(" ", images), "-c:v", "libx264", "-pix_fmt", "yuv420p", "output.mp4"); pb.redirectErrorStream(true); try (Process process = pb.start()) { while (process.isAlive()) { byte[] frameData = readAllBytes(grabFrame(process.getInputStream())); Mat mat = HighGui.createMat(height, width, CvType.CV_8UC3); // 解析字节流为Mat mat.put(0, 0, frameData); // 将字节数组复制到mat imwrite("frame%d.png", mat); // 写入临时图片文件 } } catch (Exception e) { e.printStackTrace(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值