我在服务器上存储了很多图像,在MySQL数据库中有一个引用,这样我就可以很容易地查询特定日期/时间的图像。
以7张图像/小时的间隔拍摄图像。
比方说,我想创建一个过去4天的时间间隔,并制作一部5秒的电影。我如何计算如何均匀地放下帧以达到所需的5秒长度?
这就是我到目前为止得到的
总图像数:4天*24小时*7个图像/小时=672个图像24帧/秒所需图像:24*5=120图像
将总图像与所需图像进行分割,找出我需要保留的帧
672/120=5.6
然后,我循环浏览所有672个图像,并且每5次或第6次,我在阵列中存储对图像的引用。
这是我的问题。如果我四舍五入,我会得到一个比我想要的更长的视频,如果我四取四入,我就会得到一个更短的视频
如果我在循环时保持每5个图像:134个图像/24 fps=5.6秒视频如果我在循环时保持每6个图像:112个图像/24 fps=4.6秒视频
有可能做到更好,并且仍然均匀地跳过图像吗?
在PHP中使用xxfelixxx的答案解决了这个问题以下是PHP中的代码:
$start = 1;
$stop = 672; // Total Images
$dur = 5; // Video Duration
$n = 24 * $dur; // Required frames - 24 FPS * Duration
$next = $start;
$step = ( $stop - $start ) / $n;
$frames = array();
for ($i = 1; $i <= $n; $i++) {
$frames[] = round($next);
$next += $step;
};
var_dump($frames);
您不需要执行任何计算。
基本命令模板应为
ffmpeg -framerate 672/5 -i img%d.png -r 24 output.mp4
FFmpeg将负责帧选择和定时。我跳过了对比特率等参数的编码。。etc
您可以尝试线性插值来获得精确的120帧。插值会得到分数帧数,所以你只需要四舍五入到最接近的整数。
对于1-672范围内的120帧,以下是索引:
perl -e '
my $start = 1;
my $stop = 672;
my $n = 120;
my $step = ( $stop - $start ) / $n;
my $next = $start;
my @frames;
for ( 1 .. $n ) {
push @frames, int($next+0.5); # int truncates, so add 1/2 to round correctly
$next += $step;
};
print join(",", @frames) . "n"
'
1,7,12,18,23,29,35,40,46,51,57,63,68,74,79,85,90,96,102,107,113,118,124,130,135,141,146,152,158,163,169,174,180,186,191,197,202,208,213,219,225,230,236,241,247,253,258,264,269,275,281,286,292,297,303,309,314,320,325,331,336,342,348,353,359,364,370,376,381,387,392,398,404,409,415,420,426,432,437,443,448,454,460,465,471,476,482,487,493,499,504,510,515,521,527,532,538,543,549,555,560,566,571,577,583,588,594,599,605,610,616,622,627,633,638,644,650,655,661,666