ログイン中のQiita Team
ログイン中のチームがありません

Qiita Team にログイン
コミュニティ
OrganizationイベントアドベントカレンダーQiitadon (β)
サービス
Qiita JobsQiita ZineQiita Blog
ffmpeg
画像処理ツール
動画
音声処理
203
どのような問題がありますか?

この記事は最終更新日から5年以上が経過しています。

投稿日

更新日

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

■ 動画や音声を扱うための非常に強力なツール 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
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
livlea
https://github.com/livlea

コメント

リンクをコピー
このコメントを報告


Option framerate not found.
:frowning2:

0
どのような問題がありますか?
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
マイクロソフト認定資格を取得する際の学習方法や経験談、おすすめ学習リソースなどを紹介しよう!
~
203
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー