ffmpegで連番画像から動画生成 / 動画から連番画像を生成 ~コマ落ちを防ぐには~

More than 1 year has passed since last update.

■ 動画や音声を扱うための非常に強力なツール ffmpeg

ffmpegは動画や音声を扱うための非常に強力なツールです。
LinuxやMac、Windowsでも使えます。扱えるフォーマットも多数あり、使いこなせばかなりのことができます。

① 連番画像から動画変換

連番画像から動画を生成できます。

png連番画像から動画生成

例えば次のような連番のpng画像から.mp4の動画を生成する場合。
  image_001.png
  image_002.png
  image_003.png ......

$ ffmpeg -r 30 -i image_%03d.png -vcodec libx264 -pix_fmt yuv420p -r 60 out.mp4

この場合は、連番画像からフレームレート60fpsの.mp4形式の動画を生成します。
-r が2回書いてありますが、最初の -r オプションで30fpsの連番画像ということを明示して、それを2回目の -r オプションで60fpsで動画化するように指定しています。つまり、この場合に出力される動画は、1秒間に違う画像が30枚あり、同じ画像を2度表示することで結果的に60枚表示していることなります。連番画像が image_001.png ~ image_120.png で120枚だった場合、4秒の動画が作られます。

png連番画像から動画生成 ~ スタートフレームとフレーム数を指定する ~

$ ffmpeg -r 30 -start_number 101 -i image_%03d.png -vframes 600 -vcodec libx264 -pix_fmt yuv420p -r 60 out.mp4

-start_number オプションで動画化の開始フレームを指定できます。また -vframes オプションでフレーム数を指定します。上の場合は image_101.png からimage_400.png までの連番画像を動画化することになります。-vframes オプションは出力されるフレームレートで換算されるようなので、少し注意が必要です。

png連番画像から動画生成 ~ コマ落ち回避 ~

webで調べると、上の -r オプションを2回にする書き方が良く見られるのですが、実はこの書き方だと場合によっては、意図しないコマ落ちが発生することがあります。コマ落ち(drop)を防ぐには、最初の -r オプションは -framerate とした方が良いようです。参考サイト : https://github.com/yihui/animation/issues/74

$ ffmpeg -framerate 30 -i image_%03d.png -vcodec libx264 -pix_fmt yuv420p -r 60 out.mp4

私の場合、αチャネルを持つpngの連番画像を使った場合、-r オプションを2回使う書き方だとコマ落ちしてしまって想定している動画の秒数になりませんでした。ですが、-framerate オプションを使う書き方に変更したらコマ落ちが発生しなくなりました。

png連番画像からリバース動画生成 ~ コマ落ち回避 ~

$ ffmpeg -framerate 30 -i image_%03d.png -vcodec libx264 -pix_fmt yuv420p -vf reverse -r 60 out.mp4

通常は連番画像を数値の小さいから読み込んで動画にしますが、数値の大きい方から読み込んで動画にすることもできます。それには -vf reverse オプションを追加します。逆転再生の動画を作成するときに便利です。

② 動画から連番画像を作成

動画を連番画像にすることもできます。

pngの連番画像を出力

$ ffmpeg -i input.mp4 -vcodec png image_%03d.png

この場合は、入力動画のfpsが保たれる形でpng画像が出力されます。例えば、30秒で10fpsの動画ならば300枚のpng画像が出力されます。

$ ffmpeg -i input.mp4 -vcodec png -r 30 image_%03d.png

-r オプションででフレームレートを指定することもできます。この場合( -r 30 の場合)、input.mp4が60fpsの動画だったら、1コマ置きの画像が出力されます。

jpgの連番画像を出力

$ ffmpeg -i input.mp4 -vcodec mjpeg image_%03d.jpg

jpgの連番画像を出力させたいときは "-vcodec mjpeg" にします。

"-f image2" を書く例も良くみられるのですが、無くても問題なく連番画像の出力はできました。また、-vcodec オプションを書かなくても大丈夫でした。推測ですが、拡張子から自動で画像フォーマットを判断しているようなので、これらのオプションは無くても問題ないのかもしれません。

③ 詳細オプション

詳細なオプションは以下のコマンドから。

$ ffmpeg -h full
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.