2016-06-11 22 views
0

我有很多存储在服务器上的图像,并且在MySQL数据库中有一个引用,这样我就可以轻松地从特定的日期/时间查询图像。计算要移除的帧以获得所需长度的timelapse

以7张图像/小时的间隔拍摄图像。

比方说,我想创建一个从过去4天的过程,并制作5秒的电影。我如何计算如何均匀地放下帧以达到5秒所需的长度?

这就是我到目前为止。

图像总数:4天* 24小时* 7张图片/小时= 672个图像 以24fps需要的图像:24 * 5 = 120图像

除以与所需要的图像的总图像以找出哪些/每帧i需要保持

672/120 = 5.6

然后i循环槽672个的所有图像,并且每第5或第6时刻i存储在数组中的图像的参考。

这是我的问题。如果我收起来,我得到的视频比我想要的要长,如果我下来,我会看到一段视频短一些。

如果我保持每第五图像循环时:134个图像/ 24帧= 5.6秒视频 如果我保持每第六图像循环时:112个图像/ 24帧= 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); 

回答

1

你可以尝试线性插值得到完全120帧。插值会得到分数帧数,所以你只需要四舍五入到最接近的整数。

对于范围为1 120帧 - 672,这里的指标:

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 
+0

非常感谢!这在PHP中完全使用相同的方法。 –

1

您无需执行任何计算。

基本命令模板应该是

ffmpeg -framerate 672/5 -i img%d.png -r 24 output.mp4 

的FFmpeg会照顾帧选择和时机。我已经跳过编码参数比如比特率..等

+0

谢谢,我不知道ffmpeg中的那个特性。 现在它没有帮助我,因为我需要知道在渲染视频之前要使用哪些帧。这些帧不会像运行脚本一样存储在同一台服务器上,所以在渲染timelapse之前,我会从另一台服务器上下载所需的图像。 将所有图像转移到将来运行脚本的同一服务器上,那么这就是我所需要的。 –