FFmpeg从图像产生闪烁的视频

时间:2018-06-21 03:34:50

标签: java maven video ffmpeg

因此,我尝试制作一个通过一些值旋转的分形视频,就像看到的here一样。

我使用不同的用Java编写的程序生成了帧(其中的1000帧),效果很好,因此,出于本场景的目的,假定所有图像都位于目标文件夹中,并且根据需要按数字顺序出现在视频中。

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

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

我正在寻求帮助来解决闪烁问题,如果有要求,我稍后会将视频文件上传到Google驱动器。图片全部为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();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您只需要按正确的顺序对File数组进行排序即可。

视频将以文件数组所采用的任何顺序生成。因此,请确保文件按数字排序,因为如果没有,那么您很可能会像1, 10, 100, 101, 102而不是{{ 1}}。

您没有注意到图像500和1000之间出现闪烁的原因是,所有文件的长度均为3个数字,因此您看不到较大数字的效果。