N秒ごとにビデオの1フレームを画像に抽出する方法は?


71

N秒ごとに1フレームなど、ビデオファイルを一連の画像に変換するにはどうすればよいですか。mplayerまたはffmpegはこれを実行できますか?MPlayerを使用してスクリーンショットを手動で取得しましたが、これを長いビデオ用に自動化したいです。


画像の品質の選択について、この関連の質問を参照してください:stackoverflow.com/questions/10225403/...
Pierz

回答:


70

ffmpegを使用すると非常に簡単になり、追加のスクリプトを作成しなくても N秒ごとに1つのフレーム出力できます。イメージシーケンスとしてエクスポートするには、出力として使用するか、類似したものを使用します。ビットは、ゼロパディングされた整数に変換され、長い桁-私が与えた例では、その出力を取得しますmyimage_%04d.png%0xdx

  • myimage_0000.png
  • myimage_0001.png
  • myimage_0002.png

    等..

多数の静止画像形式、png、jpeg、tgaなどを使用できます(ffmpeg -formats完全なリストを参照)。

さて、これでムービーを一連の画像としてエクスポートする方法はわかりましたが、すべてのフレームをエクスポートしたくないと言うでしょうか?

トリックは、-r nオプションを使用して出力のフレームレートを任意の値に変更することですn。ここで、は1秒あたりのフレーム数です。1 -r 1秒あたり1フレーム、4秒ごと-r 0.25に1フレーム、10秒ごとに1フレーム-r 0.1などとなります。

だから、一緒にすべてを置くために、これは1つのフレーム保存するためにどのように見えるかであるinput.movに4秒ごとにoutput_0000.pngoutput_0001.png等:

ffmpeg -i input.mov -r 0.25 output_%04d.png

出力のフレームレートを制御しているため、この-r 0.25オプションはパーツの後に来ることに注意してください。入力の前に置くと、指定されたフレームレートがあるかのように入力ファイルを扱います。-i input.mov

%xdを必要な桁数に変更します。たとえば、コマンドで10,000を超えるフレームが作成される場合は、%04dを変更し%05dます。これは、イメージシーケンスである入力ファイルでも機能します。詳細はこちら

Windowsユーザー:コマンドラインで使用%

例: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png

CMDおよびBATスクリプトで使用 %%

例: ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png

したがって%%、スクリプトを2 つ%、対話型のコマンドラインを1つにします。どちらの状況でも間違えるとエラーが発生します。


すべてのフレーム-rをエクスポートする場合、何を入れる必要がありますか?ビデオのFPSを知っている場合、それを入力したと思いますが、もしもしなかったらどうでしょうか?
トマーシュザト

4
-rフラグをまったく使用しないでください。次に、FFMPEGは入力ファイルのフレームレートを使用します。
-stib

2
が必要なものであることが確実でない限り、本当にjpegsこれに使用したいことに注意してくださいpng。私の場合、jpegsはそれぞれ約50kbで、pngsは約2MBでした。
mlissner

5
pngの利点は可逆圧縮であるため、中間としてイメージシーケンスを使用していて、余分なサイズを気にしない場合は、pngを使用することができます。
-stib


27
mplayer -vo jpeg -sstep 5 file.avi

5秒ごとにフレームをjpegファイルとして保存します。

ただし、ファイルの最後で停止するのではなく、最後のフレームのコピーの作成を続けます。これを回避するには、別のプレーヤーを使用するか、mplayerを使用して、ビデオの長さを数秒で見つけます。

mplayer -vo null -ao null -frames 0 -identify file.avi

「ID_LENGTH = 147.00」のような行を探します。

長さから2を減算し、この値を-endposオプションに使用します。たとえば、147秒のビデオの場合:

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi

これはmplayerのバグのように聞こえます。いい回避策。
いんちきキホーテ

少なくとも、このコマンドを使用しているオペレーティングシステムについて言及できますか?
トマーシュザト

5年前ですが、おそらく当時の最新のUbuntuデスクトップであるUbuntu 10.4でした。
リアム

1秒より短いステップを選択するにはどうすればよいですか。整数のみを受け入れます。
fcpenha

最近では、Debianでmpv 0.27.0を使用してmpv --vo=image --sstep=5 movie.mkv、前述のバグ(mpvはmplayerのフォーク)がなくても問題なく動作します。
アダムカッツ

11

を使用ffmpegすると、次のことができます。

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg

このコマンドは、ビデオの4秒目に320×240サイズのJPGサムネイルを生成します。これをスクリプトに入れて、時間とファイル名を変更すれば完了です。

詳細:動画のX秒ごとにサムネイル画像を作成します


これは私が望むことをするようですが、1つの問題があります。各反復の最初からファイルを処理し、指数関数的に遅くなります。
リアム

@Liam-オフセット時間をそのままにして(1に設定して)、-ss positionフラグを使用してファイルをさらに探索するのに役立ちますか?-ss Seek to given time position in seconds. hh:mm:ss[.xxx] syntax is also supported
ライフル

1
@liam:置く-ss前に、-i入力された映像がデコードされる前に起こる求めるように。これにより速度が向上します。 ソース
クワックキホーテ

2
ffmpegを使用するより良い、はるかに速い方法があります。以下の私の答えをご覧ください。
stib 14年

stibのソリューションは最高のIMOです。
グリフィン14年

8

ある種のコンタクトシートを使用していて、UnixライクなOSを使用している場合は、Video Contact Sheet * NIX、short vcsというポイントに呼び出されるこの手の込んだスクリプトを使用できます。

バックグラウンドではffmpeg(デフォルトで)またはを使用するmplayerため、多くのビデオ形式を処理できます。ムービーから静止画像をキャプチャするプロセスを自動化し、ヘッダーとフッターを使用して画像に合成します。たとえば、必要なキャプチャの数や、それらの時間差を選択できます。

10分間の間隔では、呼び出しは次のようになります。

vcs -i 10m input.avi

その他の調整については、コマンドラインオプションの完全なリストを確認してください。

以下は、ホームページから取得したコンタクトシートの例です。

ここに画像の説明を入力してください


7

VLC 1.1.0以降では、シーンビデオフィルターを使用できます。

vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit

上記の例では、00:00:10から00:00:11までの24フレームごとに1つ(--scene-ratio = 24)が保存されます。

これは、Windows 8の新規インストールでVLC 2.0.3で動作することをテストおよび確認したところです(追加のビデオプラグインまたはソフトウェアはありません)。

完全なドキュメント:http : //wiki.videolan.org/How_to_create_thumbnails


2

VirtualDubはあなたのためにこれを行うことができます

File-> Export->Image sequence

ここに画像の説明を入力してください


これにより、すべてのフレームが画像として保存されますか?
リアム

はい、すべてのフレーム。
シェベック

ほとんどのフレームをスキップする必要があります。すべてのフレームを出力すると、ストレージ領域が大量に消費されます。数秒ごとに1つのフレームが必要です。
リアム

1

これも試してみてください

VLCコマンドラインから...

vlc "C:\ YOUR \ file \ path \ file.avi" -V image --image-out-prefix = capname --image-out-ratio = 60

file.aviはキャプチャしたいビデオ、capnameは保存した画像のプレフィックス、比率をいじってみたいかもしれません(60は60の画像のうち1つがキャプチャされていることを意味します) --image-out-format jpegは、キャップをpngではなくjpegとして保存します。--snapshot-pathを使用すると、キャップを保存する場所を選択できます。

上記のソース


このメッセージが表示されました。コマンドラインオプションを読み込めませんでした。有効であることを確認してください。
リアム

Ubuntuで、次のメッセージが表示されました。不明なオプションまたは必須引数の欠落 `--image-out-prefix = capname '
Liam

1

VirtualDubでフレームをスキップできます。Video-> Frame Rateメニューにある「Decimate By」オプションを使用してください。たとえば、「100でデシメート」を設定してから、ファイル->エクスポート->イメージシーケンスを使用すると、100フレームごとにのみ保存されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.