特定の時間にffmpegを使用してビデオの1つのスクリーンショットを抽出する方法


109

ffmpegを使用してビデオから複数のスクリーンショットを抽出する方法を示す多くのチュートリアルやものがあります。-rを設定すると、一定量を開始することもできます。

しかし、たとえば01:23:45インチで1つのスクリーンショットが欲しい、または86%インチで1つのスクリーンショットが欲しい。

これはffmpegthumbnailerですべて可能ですが、依存したくない別の依存関係です。私はffmpegでそれができるようになりたいです。

回答:


208

次の-ssオプションを使用します。

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
  • JPEG出力では-q:v、出力品質を制御するために使用します。フルレンジは、1-31のリニアスケールで、値が小さいほど品質が高くなります。2-5は試すのに適した範囲です。

  • 選択フィルタは、などの選択のみ、特定のフレームタイプ、または100当たり1、などのより複雑なニーズのための別の方法を提供します

  • -ss入力の前に配置すると、より高速になります。FFmpeg Wiki:Seekingffmpegcliツールのドキュメントからのこの抜粋参照してください。

-ss 位置(入力/出力)

入力オプションとして(の前に-i)使用すると、この入力ファイル内で検索して配置します。ほとんどのフォーマットでは正確にシークすることができないため、ffmpeg位置の前の最も近いシークポイントにシークします。トランスコーディング-accurate_seekが有効になっている場合(デフォルト)、シークポイントと位置の間のこの余分なセグメントはデコードされて破棄されます。ストリームコピーを行う場合-noaccurate_seek、またはを使用する場合 は、保持されます。

出力オプション(出力ファイル名の前)として使用される場合、タイムスタンプが所定の位置に到達するまで入力をデコードしますが破棄します。

位置は秒単位またはhh:mm:ss[.xxx]形式のいずれかです。


2
これははるかに高速です。どうもありがとうございます。-ssを最初に置くと、大きな違いが生じます。
Peter Bengtsson、2014

指定された時間の後にn番目のフレームを取得する方法はありますか?
dorien

@GuntherPiez考えられるアーティファクトについての言及はどこにもありません。
ステファンライヒ

2
これvframesは(少なくとも)バージョン4.2.2で廃止されていることに注意してください。マニュアルによると「[ vframes]は ' -frames:v'の古いエイリアスであり、代わりに使用する必要があります。」
Synexis

完璧で高速に動作します。
Smeterlink

37

FFMpegは、指定されたタイムスタンプにシークし、1つのフレームを画像として抽出することで、これを行うことができます。たとえば、次の例を参照してください。

ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg

オプションについて説明しましょう:

-i input file           the path to the input file
-ss 01:23:45            seek the position to the specified timestamp
-vframes 1              only handle one video frame
output.jpg              output filename, should have a well-known extension

-ssパラメータは、フォームに値を受け入れるHH:MM:SS[.xxx]か、秒数として。パーセンテージが必要な場合は、事前にビデオの長さを計算する必要があります。


期待どおりに動作するようです。これがffmpegthumbnailerを使用するのと同じ速度であるかどうかを現在ベンチマークしています。
Peter Bengtsson 2014

ええ、このアプローチは非常に遅いです。peterbe.com/plog/fastest-way-to-take-screencaps-out-of-videosを
Peter Bengtsson

7
パイプラインのデコード部分をスキップするため、-iの前に-ssオプションを使用してみてください。これはプロセスをスピードアップするかもしれません。
SirDarius 14

1
ファイルではなくストリームにPNGとして出力する方法はありますか?
Nicke Manarin

1
@NickeManarinはい... ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg。他の人が推奨しているように、コマンドラインで入力ファイルの前に-ss「seek」オプションも配置していることに注意してください。
Glenn Slayden
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.