【发布时间】:2018-11-30 06:45:21
【问题描述】:
所以我正在尝试制作一个分形旋转通过一些值的视频,就像看到的 here。
我使用一个用 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();
}
}
}
【问题讨论】: