java - 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();
}
}
}
解决方案
您只需要将File
数组排序为正确的顺序。
视频将使用 files 数组的任何顺序生成。因此,请确保文件按数字排序,因为如果不是,那么您可能会按顺序排列文件1, 10, 100, 101, 102
而不是1, 2, 3, 4, 5, 6
.
您没有注意到图像 500 和 1000 之间闪烁的原因是所有文件都是 3 个数字长,因此您不会在更大的数字中看到这种效果。
推荐阅读
- function - 将一个数字范围映射到另一个数字范围的通用名称是什么?
- python - 无法根据规则“安全”将数组数据从 dtype('O') 转换为 dtype('float64')
- ms-access - 有没有最快的方法在 Excel 表中写入记录集结果?
- r - 按行和列重叠合并 2 个数据帧
- deep-learning - keras中的多标签分类
- mysql - VBA/ADODB 错误地将数据库视为只读的
- c# - 将列表中的字符串与 datagridview 列值进行比较
- kotlin-exposed - Exposed 有什么方法可以在表声明中执行 ON UPDATE 吗?
- matlab - 作为结构体与元胞数组写入文本文件
- vba - 如果字符串的一部分仅在 Excel 中使用 VBA 公式由空格分隔,如何删除它?