【ffmpeg】動画から特定フレームを画像で出力する方法

ffmpeg のフィルタの fps, trim, select, framestep, thumbnail などを使い分けながら、動画の I, P, B フレームだけを出力したり、指定秒や指定フレーム間を出力する。

コマンドサンプルには付いているが、コマンドの個別説明で書いてない -vsync 0 を付け忘れると2枚目以降のファイルが大量に複製されるので注意すること。


連番画像を出力する


出力ファイル名に %03d をつけることで3桁の連番で画像を出力できる。画像のフォーマットは.jpgに変えることでJPGで出力できる。

ffmpeg -i video -an -vsync 0 img%03d.png


出力例
img001.png
img002.png
img003.png

このままだと動画の全フレームを画像で出力することになりファイル数が膨大になるのでその他のオプションも指定する。ここでは一つ下で説明する tileフィルタを使う。

%03d の他に、%02d にすると最初から表示される値が2桁になる。

1枚画像ではなく1枚に複数の画像(タイル状)で出力する


1フレームに1画像ではなくて、1画像に複数のフレームの画像を書き込むことができるフィルタ tile について。

-vf tile=wxh


-vf tile=横x縦 で使い、指定した値の枚数で左上から順に画像が順番に出力される。規定値は 8x8

ffmpeg -i video -vf tile=8x8 -an -vsync 0 img%03d.png


tile=8x8 の出力例
ffmpeg_tile.jpg

指定フレーム毎に出力する


新しい方法


thumbnail フィルタは正確に指定フレーム毎に出力しない(Select the most representative frame)ので framestep フィルタを使う。

100フレーム毎に出力する例。規定値:1(全てのフレーム)

-vf framestep=100


連番画像出力する

ffmpeg -i video -vf framestep=100,tile=8x8 -an -vsync 0 img%03d.png


従来の方法


指定フレーム毎に出力できるフィルタ thumbnail について。
例では100フレーム毎に出力するので100,200,300...となる。

-vf thumbnail=100


指定した値のフレーム毎で出力する。規定値は 100
フィルタをつなげる場合は「,」でつなぐ。

ffmpeg -i video -vf thumbnail=100,tile=8x8 -an -vsync 0 img%03d.png


指定秒毎に出力する


新しい方法


fps フィルタを使って1秒ごとのフレームを切り取る方法を使う。切り取る時間の指定は分母に指定し、分子は 1 を指定する。つまり 1/1 = 1 なら1秒ごと、1/10 なら10秒ごとになる。最後のフレームが指定秒で割り切れなくても1番最後の画像で出力される。

round の設定で小数点以下を切り捨てる
-vf fps=fps=1:round=down

ffmpeg -i video -vf fps=fps=1:round=down,tile=8x8 -an -vsync 0 img%03d.png

従来の方法


select フィルタで指定した秒の間だけを出力する。

注:select フィルタを使うとCPU負荷が90%近くまで上がり長時間の動画ほど処理時間がかかるのに注意。よって、出力開始時点が後ろの動画時間の場合は予め -ss で読み込み開始時点を遅らせると処理が早くなる。

-vf select=isnan(prev_selected_t)+gte(t-prev_selected_t\,10)


上の例では最後の10が10秒おきに出力する設定になる。分数も可能で60fpsの動画に1/30とすると2フレームごとに出力する設定になる。

ffmpeg -i video -vf select=isnan(prev_selected_t)+gte(t-prev_selected_t\,10),tile=8x8 -an -vsync 0 img%03d.png


指定秒間を出力する


新しい方法


select フィルタは処理が重たいので trim フィルタを使う。

-vf trim=10:20,setpts=PTS-STARTPTS


上の例では10秒から20秒までのフレームを出力する。1ファイルだけならば trim を使わずに ーss、-t の併用の方が処理が早い。

ffmpeg -ss 10 -i input -t 10


従来の方法


select フィルタで指定した値のフレームの間だけを出力する。

-vf select=gte(t\,10)*lte(t\,20),setpts=PTS-STARTPTS


上の例では10秒から20秒までのフレームを出力する。指定した値の丁度を含まない場合は gte,lte の「e」を消す。

-vf select=gt(t\,10)*lt(t\,20),setpts=PTS-STARTPTS


ffmpeg -i video -vf select=gte(t\,10)*lte(t\,20),setpts=PTS-STARTPTS,tile=8x8 -an -vsync 0 img%03d.png


指定フレーム間を出力する


新しい方法


select フィルタは処理が重たいので trim フィルタを使う。

-vf trim=start_frame=299:end_frame=600,setpts=PTS-STARTPTS


上の例では300フレームから600までの301フレームを出力する。trim フィルタの使い方は個別記事 trim フィルタの使い方 を参照。

従来の方法


select フィルタで指定した値のフレームだけを出力する

-vf select=gte(n\,300)*lte(n\,600),setpts=PTS-STARTPTS


上の例では300フレームから600までの301フレームを出力する。指定した値の丁度を含まない場合は gte,lte の「e」を消す。

-vf select=gt(n\,300)*lt(n\,600),setpts=PTS-STARTPTS


ffmpeg -i video -vf select=gte(n\,300)*lte(n\,600),setpts=PTS-STARTPTS,tile=8x8 -an -vsync 0 img%03d.png


特定フレームを出力する


select フィルタでB,P,Iフレームのどれかを出力する。

  • Bフレーム
    -vf select=eq(pict_type\,B)
  • Pフレーム
    -vf select=eq(pict_type\,P)
  • Iフレーム
    -vf select=eq(pict_type\,I) or
    -skip_frame nokey

動画のサムネイル一覧を取得するなら少ない画像で内容がわかるIフレームを使う。
tile フィルタと併用すると一覧性が増す。

-vf select=eq(pict_type\,I),tile=8x8


Iフレームの出力例
ffmpeg_iframe_tile.jpg

ffmpeg -i video -vf select=eq(pict_type\,I),tile=8x8 -an -vsync 0 img%03d.png
ffmpeg -skip_frame nokey -i video -vf tile=8x8 -an -vsync 0 img%03d.png


一定時間ごとに出力するのを高速化する


select フィルタを使うと長時間の動画ほど凄まじく時間がかかるので、少し誤差はあるがかなり高速化する方法。

キーフレームだけを出力する設定を用いて読み込みを高速化する。ただしライブストリームなどで正しくキーフレームを出力できずに ffmpeg が認識しなかった場合はすべてのフレームを出力するので、その場合は thumbnail フィルタで指定する。

-skip_frame nokey


参照フレーム以外を出力する場合はこちら。nokey でうまくサムネイルが出力しない場合はこちらを試す
-skip_frame noref


skip_frame の使い方:FFmpeg documentation : : Codec Options の下の方に説明がある。

キーフレームはおおよそ1秒に1枚程度あるのを利用して thumbnail フィルタを併用することで高速化できる。以下のコマンドは200キーフレーム毎に 8x8の画像を png で出力すコマンド。

ffmpeg -skip_frame nokey -i video -vf "thumbnail=200,tile=8x8" -an -vsync 0 img%03d.png


そのほかの設定方法:ニコ生のTSからサムネイルを出力する

リサイズとリサイズオプション


動画の解像度そのままを tileフィルタで出力すると解像度が大きくなるので scaleフィルタを使って小さくする。リサイズオプションも併用できる。デフォルトのリサイズオプションはbicubicになっている。

-vf scale=横:縦 にリサイズする

-vf scale=320:240


片方を実数にして、もう片方を-1にすると実数の値からアスペクト比固定で横幅を自動設定できる。

横幅240pxでアスペクト比固定でリサイズし、lanczosのリサイズオプションを取る

-vf scale=240:-1 -sws_flags lanczos
-vf scale=240:-1:flags=lanczos


accurate_rnd は ffdshow では「正確な丸め処理」と表記されている。

オプション名メモ
accurate_rnd+bilinearぼんやり
bilinearぼんやり
experimentalややぼんやり
bicubicややシャープ
splineややシャープ
accurate_rnd+lanczosシャープ
lanczosシャープ
neighborかなりシャープ


ffmpeg -i video -vf scale=240:-1,select=eq(pict_type\,I),tile=8x8 -sws_flags lanczos -an -vsync 0 img%03d.png

取得するの画像の座標を指定する


cropフィルタを使って特定の位置、例えば右上の局ロゴや、左下のワイプなどの一部の場所を指定して出力する。

crop=x:y:w:h:t


x:y は出力解像度。横:縦
w:h は出力解像度の左上隅の座標。横:縦
左上隅の座標が 0:0

NHK総合の局ロゴの位置

ffmpeg -i video -vf crop=109:28:1274:63 -an -vsync 0 img%03d.png


画像から動画を作る


連番で出力された画像をまとめて動画にする。特定の番号の画像から動画を作ることもできる。

30フレームレートの動画を連番画像の150番からつなげた out.mp4 の動画にする

ffmpeg -framerate 30 -start_number 150 -i img%03d.png out.mp4


末尾のフレーム指定ができないので不要ならば別フォルダに移動する。
-vframes を指定することで出力するフレーム数を指定できる。訂正:2013年6月14日

90フレームから90フレーム分(179フレームまで)を出力する

ffmpeg -framerate 30 -start_number 90 -i img%03d.png -vframes 90 out.mp4


一般的にはmp4で出力する場合はコーデックがH.264になるが、可逆圧縮コーデックを使うこともできる。

  • UtVideo
    ffmpeg -framerate 30 -start_number 150 -i img%03d.png -vcodec utvideo out.mkv
  • Huffyuv
    ffmpeg -framerate 30 -start_number 150 -i img%03d.png -vcodec huffyuv out.mkv
  • Huffyuv FFmpeg
    ffmpeg -framerate 30 -start_number 150 -i img%03d.png -vcodec ffvhuff out.mkv
  • animeted png
    ffmpeg -framerate 30 -start_number 150 -i img%03d.png -vcodec apng out.png
  • mjpg(不可逆)
    ffmpeg -framerate 30 -start_number 150 -i img%03d.jpg -vcodec copy out.mkv

画像からアニメGIFを作る


ffmpeg 2.6 でパレットに対応したので ImageMagick で遜色のないレベルで高画質、低容量でアニメGIFが作れるようになった。

ffmpeg で 256 色を最適化する

ffmpegの出力先をgifにすればアニメGIFを作ることができるが、ffmpegはアニメGIFを作るのが苦手なので ImageMagick を使う。

pngの連番を全て取り込んでout.gifとして出力する

convert -delay 4.1708375 -loop 0 -layers optimize *.png out.gif


GraphicsMagick を使う例もあるようです。
GIFアニメ生成にImageMagickはオワコン、情強は高速なGraphicsMagickを使う - 海峡

  • -delay は1秒当たり 100/n で表示されるフレーム数の指定。アニメなら 100/23.976
  • -loop は何回繰り返すか。0は無限
  • -layers optimize は最適化コマンド。容量が小さくなる。

アニメWebpを作る


動画からアニメWebpを作るコマンド例

ffmpeg -i input -vcodec libwebp -lossless 0 -qscale 75 -preset default -loop 0 -an -vsync 0 output.webp


詳しい設定は ffmpeg で アニメーションWebP(Animated WebP)を作る を参照。

関連記事



後記


ニコニコ動画はYoutubeにあるようなシークバーを操作したらそのシーンのサムネイルが表示されるのはいつになったら実装するのか、というのを聞いたことがあるが、これはthumbnailフィルタで画像を取得するときにその時間も取得できるので、それを利用して動画のシークバーにオーバーレイの画像として利用することができる。

selectフィルタで出力フレームを色々変更できるが、リアルタイムキャプチャして配信するときにselectフィルタを使って出力フレームを操作する場合はいくつか制限がある。B,P,Iフレームだけで配信できない。フレーム数を間引く設定にするとオリジナルのfpsから間引かれて入力fpsで配信できない。

追記 2013/12/16
高速化の部分と一部注意書きを加えた。
追記 2013/12/20
-skip_frame noref を加えた。
追記 2015/01/07
select よりも trim 推奨。framestep と mjpg, webp について追記。
訂正 2015/02/17
-delay の説明を直した。
修正 2015/05/08
細部の修正。
追記 2016/06/26
-f image2 不要の部分と、連番画像では -r を使わない部分を追記。
修正 2016/07/15
fps フィルタを使う方法を追記。それに伴って一部記事を直した。
関連記事

この記事へのコメント

管理人のみ通知 :

トラックバック


ニコニコチャンネル始めました
ニコラボチャンネル
スポンサード リンク
THE IDOLM@STER THE@TER ACTIVITIES 03
THE IDOLM@STER THE@TER ACTIVITIES 03

Fate/EXTELLA REGALIA BOX for PlayStation (R) 4 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4
Fate/EXTELLA REGALIA BOX for PlayStation (R) 4 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4

妖怪ウォッチ くったりぬいぐるみだニャン ジバニャン
妖怪ウォッチ くったりぬいぐるみだニャン ジバニャン

Fate/EXTELLA VELBER BOX 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4
Fate/EXTELLA VELBER BOX 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS4

Fate/EXTELLA REGALIA BOX for PlayStation (R) Vita 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS Vita
Fate/EXTELLA REGALIA BOX for PlayStation (R) Vita 【初回限定特典】ネロ・クラウディウス、アルトリア・ペンドラゴン衣装「純真のナイトドレス」プロダクトコード付+【Amazon.co.jp限定特典】アルテラ衣装「スイートデビル」プロダクトコード配信 - PS Vita

【早期購入特典あり】初音ミクシンフォニー~Miku Symphony 2016~オーケストラ ライブ CD(初音ミクシンフォニー描き下ろしクリアファイル付き(ランダム配布))
【早期購入特典あり】初音ミクシンフォニー~Miku Symphony 2016~オーケストラ ライブ CD(初音ミクシンフォニー描き下ろしクリアファイル付き(ランダム配布))

「うたわれるもの 偽りの仮面&二人の白皇」歌集(初回限定盤)
「うたわれるもの 偽りの仮面&二人の白皇」歌集(初回限定盤)

TVアニメ『ラブライブ!サンシャイン!!』挿入歌シングル「想いよひとつになれ/MIRAI TICKET」
TVアニメ『ラブライブ!サンシャイン!!』挿入歌シングル「想いよひとつになれ/MIRAI TICKET」

『刀剣乱舞-花丸-』 歌詠集 其の三 特装盤
『刀剣乱舞-花丸-』 歌詠集 其の三 特装盤

本好きの下剋上~司書になるためには手段を選んでいられません~第一部 「本がないなら作ればいい3」
本好きの下剋上~司書になるためには手段を選んでいられません~第一部 「本がないなら作ればいい3」

新着記事と追記・編集記事
スポンサード リンク
ブログ内検索
プロフィール

Author:ロベルト
お問い合わせはこちらまで
robelt2525[at]gmail.com

中の人 @nico_lab
ブログ更新用 @blo_nico_lab

詳しいプロフィールはこちら

カテゴリ
アクセスの多い記事
記事アーカイブ

最新コメント
リンク
ニコニコ静画
アニメカテゴリ毎時ランキング
免責事項
当ブログはリンクフリーです。記事によりトラブルが生じた場合でも、当ブログ管理人は一切の責任を負いません。 当ブログに記載されている情報の正誤や利用は、ご自身の判断でお願いします。 紹介したアプリケーションに関する問い合わせは作者に問い合わせてください。ニコニコ動画に関する質問はまずは公式掲示板、2ch、各Q&Aサイトを参照ください。
ブログの読者になる(RSS)
アクセス数