首页 > 解决方案 > FFmpeg 从图像中产生闪烁的视频

问题描述

所以我正在尝试制作一个分形旋转通过一些值的视频,就像在这里看到的一样。

我使用一个用 Java 编写的可以正常工作的不同程序生成帧(其中 1000 个),因此出于此场景的目的,假设所有图像都在目标文件夹中,并且按照它们需要出现的数字顺序出现在视频。

我在网上找到以下代码将图像拼接成视频,我一点也不知道它是如何工作的,当我运行它时,所有的图像确实都被拼接成一个视频并放在桌面上,但是视频似乎有一个特定的帧只是在随机位置跳入。我不确定是哪一个,但它是较早的帧之一,介于 1000 帧中的 1 到 200 帧之间。

我还测试了制作两个半视频,一个使用前 500 帧,另一个使用第二个 500 帧。第一个视频(1 -> 500)闪烁,第二个视频(501 -> 1000)在我的观察中似乎没有闪烁。

我正在寻求解决闪烁行为的帮助,如果被问到,我稍后会将视频文件上传到谷歌驱动器。图像均为 1920x1080,并按正确的数字顺序排列。

提前致谢!

import static org.bytedeco.javacpp.opencv_imgcodecs.*;
import java.io.File; 
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.OpenCVFrameConverter;
public class ImageToMovie{
    public static void main(String []args){
        String imgPath="C:\\Users\\John\\Images";
        String vidPath="C:\\Users\\John\\Desktop\\video.mp4";
        String[] links=new String[new File(imgPath).listFiles().length];
        File f=new File(imgPath);
        File[] f2=f.listFiles();
        for(int i=0;i<f2.length;i++) {
            links[i]=f2[i].getAbsolutePath();
        }
        convertJPGtoMovie(links, vidPath);
        System.out.println("Video has been created at "+vidPath);
    }
    public static void convertJPGtoMovie(String[] links, String vidPath){
        OpenCVFrameConverter.ToIplImage grabberConverter = new OpenCVFrameConverter.ToIplImage();
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(vidPath,1920,1080); 
        try {
            recorder.setFrameRate(50);
            recorder.setVideoCodec(avcodec.AV_CODEC_ID_MPEG4);
            recorder.setVideoBitrate(100000);
            recorder.setFormat("mp4");
            recorder.setVideoQuality(0);
            recorder.start();
            for (int i=0;i<links.length;i++){
                recorder.record(grabberConverter.convert(cvLoadImage(links[i])));
            }
            recorder.stop();
        }
        catch (org.bytedeco.javacv.FrameRecorder.Exception e){
            e.printStackTrace();
        }
    }
}

标签: javamavenvideoffmpeg

解决方案


您只需要将File数组排序为正确的顺序。

视频将使用 files 数组的任何顺序生成。因此,请确保文件按数字排序,因为如果不是,那么您可能会按顺序排列文件1, 10, 100, 101, 102而不是1, 2, 3, 4, 5, 6.

您没有注意到图像 500 和 1000 之间闪烁的原因是所有文件都是 3 个数字长,因此您不会在更大的数字中看到这种效果。


推荐阅读