1

サーバーに大量の画像が保存されており、MySQL データベースに参照があるため、特定の日付/時刻から画像を簡単に照会できます。

画像は 1 時間あたり 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 秒のビデオ

それを改善し、画像を均等にスキップすることは可能ですか?

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);
4

2 に答える 2

1

線形補間を試して、正確に 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
于 2016-06-12T02:47:30.507 に答える