计算要删除的帧以获得所需长度的游戏中时光倒流
Calculate frames to remove to get timelapse of desired length
我在服务器上存储了很多图像,并且在 MySQL 数据库中有一个引用,这样我就可以轻松地从特定 dates/time 中查询图像。
图像以 7 images/hour 的间隔拍摄。
假设我想制作过去 4 天的延时摄影,并制作一部 5 秒的电影。我如何计算如何平均丢帧以达到所需的 5 秒长度?
这是我目前得到的。
图像总数:4 天 * 24 小时 * 7 images/hour = 672 张图像
24 fps 所需图像:24 * 5 = 120 张图像
将总图像除以所需图像以找出我需要保留的which/every帧
672 / 120 = 5.6
然后我循环遍历所有 672 张图像,每隔 5 次或第 6 次我将对图像的引用存储在一个数组中。
这是我的问题。如果我向上舍入,我得到的视频比我想要的要长,如果我向下舍入,我得到的视频比我想要的要短。
如果我在循环时保留每 5 张图像:134 张图像/24 fps = 5.6 秒视频
如果我在循环时保留每 6 张图像:112 张图像/24 fps = 4.6 秒视频
有没有可能让它变得更好,并且仍然均匀地跳过图像?
使用 xxfelixxx 在 PHP 中的回答解决了这个问题
这是 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);
您可以尝试使用线性插值来获得恰好 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
您应该不需要执行任何计算。
基本命令模板应该是
ffmpeg -framerate 672/5 -i img%d.png -r 24 output.mp4
FFmpeg 将负责帧选择和计时。我跳过了比特率等编码参数
我在服务器上存储了很多图像,并且在 MySQL 数据库中有一个引用,这样我就可以轻松地从特定 dates/time 中查询图像。
图像以 7 images/hour 的间隔拍摄。
假设我想制作过去 4 天的延时摄影,并制作一部 5 秒的电影。我如何计算如何平均丢帧以达到所需的 5 秒长度?
这是我目前得到的。
图像总数:4 天 * 24 小时 * 7 images/hour = 672 张图像 24 fps 所需图像:24 * 5 = 120 张图像
将总图像除以所需图像以找出我需要保留的which/every帧
672 / 120 = 5.6
然后我循环遍历所有 672 张图像,每隔 5 次或第 6 次我将对图像的引用存储在一个数组中。
这是我的问题。如果我向上舍入,我得到的视频比我想要的要长,如果我向下舍入,我得到的视频比我想要的要短。
如果我在循环时保留每 5 张图像:134 张图像/24 fps = 5.6 秒视频 如果我在循环时保留每 6 张图像:112 张图像/24 fps = 4.6 秒视频
有没有可能让它变得更好,并且仍然均匀地跳过图像?
使用 xxfelixxx 在 PHP 中的回答解决了这个问题 这是 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);
您可以尝试使用线性插值来获得恰好 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
您应该不需要执行任何计算。
基本命令模板应该是
ffmpeg -framerate 672/5 -i img%d.png -r 24 output.mp4
FFmpeg 将负责帧选择和计时。我跳过了比特率等编码参数