自動ショート動画の「カクカク揺れ」を直しました:原因はズーム位置の整数への丸め

ミセルラボでは、台本を書くと絵・声・字幕・BGMを自動で組み立てて、縦長のショート動画にするプログラムを作っています。10月21日、そのショート動画を見た代表から「画面が揺れている」と指摘がありました。

この記事は、その原因と直し方の記録です。

どんな揺れだったか

ショート動画は、1枚の絵をゆっくり拡大していく作り(いわゆるKen Burns風のズーム)です。本来はなめらかに寄っていくはずが、絵全体が小刻みにブルブルと震えて見えました。

動いているのはズームだけなので、原因はズームの部分に絞れます。

原因:位置が「整数」に丸められていた

ズームには、動画ツールffmpegの zoompan という機能を使っていました。

ゆっくり拡大するとき、切り出す位置は1コマごとに1ピクセルより小さい量ずつ動くのが理想です。ところが zoompan は、この位置を整数のピクセルに丸めて使います。そのため、

  • あるコマでは動かない
  • 次のコマでは1ピクセル動く

ということが不規則に起こります。動きがなめらかに積み重ならず、これが「揺れ」に見えていました。

直し方:2倍の大きさでズームしてから縮める

完成サイズは1080×1920です。そこで、

  1. 元の絵をいったん 2倍の2160×3840 に拡大する
  2. その大きさでズームする
  3. 最後に1080×1920へ縮める

という順番に変えました。大きいサイズで1ピクセルずれても、縮めると0.5ピクセル分になります。丸めのずれが半分になり、揺れは目立たなくなりました。

あわせて、ズームの倍率を「動画のコマ番号に比例して増える」直線的な式にしています。

4倍にしなかった理由

ずれを4分の1にしようと 4倍 でも試しましたが、メモリが足りずに処理が止まりました。いまのパソコンで動く範囲として、2倍に決めています。

公開済みの動画について

10月21日に公開したネコのショート動画は、修正前に作ったものです。今回は作り直した版をとっておき、公開済みの動画は差し替えていません。次に作るショート動画から、新しい方法で書き出します。

この件で分かったこと

  • 「揺れる」と感じたら、まず動いている処理(今回はズーム)を疑う
  • 位置が整数に丸められる処理は、大きいサイズで動かしてから縮めると、ずれが小さくなる
  • 大きくしすぎるとメモリが足りなくなるので、パソコンに合わせて倍率を決める