自動ショート動画の「カクカク揺れ」を直しました:原因はズーム位置の整数への丸め
ミセルラボでは、台本を書くと絵・声・字幕・BGMを自動で組み立てて、縦長のショート動画にするプログラムを作っています。10月21日、そのショート動画を見た代表から「画面が揺れている」と指摘がありました。
この記事は、その原因と直し方の記録です。
どんな揺れだったか
ショート動画は、1枚の絵をゆっくり拡大していく作り(いわゆるKen Burns風のズーム)です。本来はなめらかに寄っていくはずが、絵全体が小刻みにブルブルと震えて見えました。
動いているのはズームだけなので、原因はズームの部分に絞れます。
原因:位置が「整数」に丸められていた
ズームには、動画ツールffmpegの zoompan という機能を使っていました。
ゆっくり拡大するとき、切り出す位置は1コマごとに1ピクセルより小さい量ずつ動くのが理想です。ところが zoompan は、この位置を整数のピクセルに丸めて使います。そのため、
- あるコマでは動かない
- 次のコマでは1ピクセル動く
ということが不規則に起こります。動きがなめらかに積み重ならず、これが「揺れ」に見えていました。
直し方:2倍の大きさでズームしてから縮める
完成サイズは1080×1920です。そこで、
- 元の絵をいったん 2倍の2160×3840 に拡大する
- その大きさでズームする
- 最後に1080×1920へ縮める
という順番に変えました。大きいサイズで1ピクセルずれても、縮めると0.5ピクセル分になります。丸めのずれが半分になり、揺れは目立たなくなりました。
あわせて、ズームの倍率を「動画のコマ番号に比例して増える」直線的な式にしています。
4倍にしなかった理由
ずれを4分の1にしようと 4倍 でも試しましたが、メモリが足りずに処理が止まりました。いまのパソコンで動く範囲として、2倍に決めています。
公開済みの動画について
10月21日に公開したネコのショート動画は、修正前に作ったものです。今回は作り直した版をとっておき、公開済みの動画は差し替えていません。次に作るショート動画から、新しい方法で書き出します。
この件で分かったこと
- 「揺れる」と感じたら、まず動いている処理(今回はズーム)を疑う
- 位置が整数に丸められる処理は、大きいサイズで動かしてから縮めると、ずれが小さくなる
- 大きくしすぎるとメモリが足りなくなるので、パソコンに合わせて倍率を決める