アプリの紹介動画を作るために、iPhoneシミュレーターで操作を録画し、ffmpegで場面ごとに切り出していました。ところが、ある場面だけ指定した長さにならず、ゆっくり動かすつもりのカメラも最初のコマで止まったままです。原因を探していくと、録画そのものが、名乗っているフレームレートどおりにコマを持っていなかったのです。シミュレーターの録画を動画編集に使う人は、同じところで時間を取られると思うので、見分け方と直し方を書いておきます。
切り出したはずの場面が、ほんの一瞬しかなかった
やっていたのは、録画の途中の時刻を指定して数秒ずつ切り出し、それをつなぐことです。ある場面では、数秒を指定したのに、出てきたのは一瞬だけのクリップです。さらに、時間に合わせて切り出す位置を少しずつ下へずらし、画面をゆっくり流すつもりの場面も、最初のコマで終点まで飛んでいました。
やっかいなのは、出力するときにフレームレートを指定していると、仕上がりの長さだけは合ってしまうことです。長さが合っているので切り出しは正しいものとして先へ進め、絵を一枚ずつ見てはじめて、中身がおかしいと気づきました。
60fpsと名乗る録画に、実際は3分の1ほどしかコマが無かった
そこで録画が実際に何コマ持っているかを数えてみると、動画の情報には60fpsと書いてあるのに、全部数えてもその3分の1ほどしかありません。名乗っているフレームレートと、中に入っているコマの数が合っていなかったのです。
ffprobe -v error -select_streams v:0 -count_frames \
-show_entries stream=nb_read_frames,r_frame_rate,avg_frame_rate \
-show_entries format=duration -of default=nw=1 rec.mp4
| 見る値 | この録画 | 意味 |
|---|---|---|
| r_frame_rate | 60 | 名乗っているフレームレート |
| nb_read_frames を長さで割った値 | およそ19 | 実際に入っていたコマから出したフレームレート |
数えるときは、名乗りの値ではなく、コマの数を長さで割った値を見ます。ここが60に近くなければ、その録画は場所によってコマの間隔がばらばらです。
画面が止まっている間は、コマが書かれていなかった
シミュレーターの録画は、画面に変化があったときだけコマを書いているようです。私の録画には、アプリが処理を待っていて画面がまったく動かない長い時間があり、その間はほとんどコマが無いのです。動いている場面では細かくコマが並び、止まっている場面ではまばらになる、という作りになっています。
この状態で途中の時刻を指定すると、ffmpegが考える時刻と、映っている中身の時刻がずれていきます。切り出しの式に時間を使っていると、その時間も録画の元の時刻のまま入ってくるので、ゆっくり動かすつもりの値が一瞬で上限に達してしまいました。録画の中にコマが無い場所は、編集の道具からは見えない穴になっていたわけです。
編集の前に、固定フレームレートへ一度だけ直す
直し方は単純で、編集を始める前に、録画をまるごと固定の30fpsに書き直すだけです。コマが無い場所には直前のコマが複製されて埋まり、時刻とコマの位置がきちんと揃います。切り出しもパンも、この書き直した録画を相手にすれば、指定したとおりに動きます。
ffmpeg -i rec.mp4 -vf fps=30 -fps_mode cfr -an \
-c:v libx264 -preset veryfast -crf 14 rec30.mp4
書き直したあとは、もう一度コマを数えて、長さに30を掛けた数と一致することを確かめます。私の録画でも、ちょうどその数のコマが入っています。画質を落としたくないので、ここではあとで編集する前提の、劣化の少ない設定にしています。
受け取った動画は、コマの数を数えてから使う
今回いちばん時間を失ったのは、仕上がりの長さが合っているのを見て、中身も合っていると思い込んでいたところです。長さは出力の設定で揃えられてしまうので、ずれの証拠にはなりません。見るべきなのは、元の録画に何コマ入っているかです。
シミュレーターに限らず、画面録画の動画は、画面が止まると書くのをやめる作りのものがあります。編集に使う前にコマの数を一度数えておけば、切り出しやパンが合わない原因を探す時間は、ほとんどかからなくなります。画面録画を編集に使っている人は、元の動画のコマの数を一度数えたことがありますか。


コメント