我已经在服务器上存储了很多图像,并且在MySQL数据库中有一个引用,以便我可以轻松地从特定日期/时间查询图像。

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

可以说我想从最近4天开始创建间隔拍摄,并制作5秒的电影。我如何计算如何平均丢帧以达到所需的5秒长度?

这就是我到目前为止所得到的。

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

将全部图像与所需图像相除,以找出我需要保留的每一帧

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

关于php - 计算要删除的帧以获得所需长度的延时拍摄,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37766899/

10-08 23:02