タスクが見た目よりも面倒な理由は何ですか。

「このクリップから 1 秒あたり 1 フレームを教えてください」は、ビデオに関する最も一般的な雑用の 1 つです。 QA テスターはバグレポートに添付するために等間隔のスクリーンショットを必要とします。研究者は、注釈ツールに入力するためにサンプリングされた画像シーケンスを必要とします。ソーシャル編集者は、タイムラインを手作業でこすることなく、2 分間のカットから 20 枚の候補者の静止画を必要とします。

タスク自体は簡単です。ややこしいのは、よく見ると「1秒に1フレーム」というのが曖昧なことだ。再生時間の 1 秒ごとに 1 フレームということですか、それとも Nエンコードされたストリームのフレーム目?これらは異なるものです。24 fps クリップと 60 fps クリップは、最初の読み取り値では同じカウントを生成しますが、2 番目の読み取り値では大きく異なるカウントを生成します。間違ったものを選択すると、重複に近いフォルダーが作成されるか、シーケンスがまばらすぎて役に立たなくなるかのどちらかになります。

以下の両方の方法で同じ結果が得られます。それらは、望むものを表現する方法と、表現が間違っていたことにどれだけ早く気づくかが異なります。

方法 1: FFmpeg、パラメータごと

正規のコマンドは短く、

ffmpeg -i input.mp4 -vf fps=1 -q:v 2 frame_%04d.jpg

すべての部分が重要です。

  • -i input.mp4 — ソース ファイル。 FFmpeg は、最初から最後まで一度だけ読み取ります。各タイムスタンプを個別に検索することはありません。
  • -vf fps=1 — 実際の作業を行うビデオ フィルター。 fps=1 意味 再生時間の 1 秒あたり 1 つの出力フレーム、ソースのフレームレートに関係なく。使用する fps=1/5 5 秒ごとに 1 フレーム、または 1 秒あたり 2 フレームの場合 fps=2 です。これは再生時の読み取り値です。
  • -q:v 2 — 逆スケールの JPEG 品質。2 はほぼ無損失で、31 は高度に圧縮されています。これを省略すると、FFmpeg のデフォルトが取得されますが、これはほとんどの人が期待するよりも著しくソフトです。ロスレス出力が必要な場合は、次のように記述します。 frame_%04d.png 代わりに、このフラグを完全に削除してください。
  • frame_%04d.jpg — 出力パターン。 %04d カウンターを 4 桁にゼロ埋めします: frame_0001.jpg, frame_0002.jpg。パッドは表面的なものではありません。以下の番号付けの問題を参照してください。

別の解釈が必要な場合は、 Nすべてではなく、エンコードされたフレームごとに N 秒 — フィルターが変更されます。

ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" -vsync vfr frame_%04d.png

これにより、フレーム インデックスが指定された場所にフレームが保持されます。 n は 10 で割り切れます、そして -vsync vfr FFmpeg がフレームを複製して一定の出力レートをパディングするのを停止します。このフラグをオフのままにしておくと、要求したよりもはるかに多くのファイルが取得されることになります。これはよくある、混乱を招く最初の結果です。

作業をセグメントに制限するには、 -ss 前に -i したがって、FFmpeg は、デコードして破棄するのではなく、デコードする前にシークします。

ffmpeg -ss 00:01:30 -to 00:02:15 -i input.mp4 -vf fps=1 frame_%04d.png

方法 2: ブラウザで同じジョブを

このサイトのフレーム抽出ツール 同じ 2 つの読み取り値にマッピングされますが、あいまいさはフィルター文字列に隠されるのではなく、インターフェイスで明示されます。

  1. ファイルをドロップします。 ディスクからブラウザのメモリに直接読み込まれます。アップロードがないため、3 GB のソースは転送後ではなく、すぐに処理を開始します。
  2. 抽出方法を選択します。 「時間間隔」は以下と同等です。 fps=1/N — 数秒でギャップに入ることができます。 「フレーム レート (FPS)」は select/mod フィルタ - トーキング ヘッドまたは画面録画の場合に N すべてを維持する Nフレーム目。
  3. 抽出する前にフレーム数のヒントを読んでください。 これが最も時間を節約できる部分です。インターフェイスには、現在の設定で生成される画像の数が表示されます。 前に 何でも実行できるため、4,000 ファイルの間違いが目に見える数字になります。発見したフォルダーではなく、
  4. 形式と品質を設定します。 ロスレスの場合は PNG、JPG、またはサイズが重要な場合は、10 ~ 100% スライダーを使用した WebP。フレームが分析または編集にフィードされる場合、スライダーの位置は -q:v コントロールは、ほとんどの人がそれについて考える方法を表現しました。
  5. 必要に応じて範囲をトリミングします。 デュアルハンドルのスライダーは、 -ss/-to 同等の表示。
  6. エクスポート。 フレームはプレビュー グリッドに表示されます。 1 つをクリックして単独で保存するか、セット全体を 1 つの ZIP として取得します。

間隔を選択するための経験則: 入力すると、2 ~ 5 秒ごとに 1 フレームですべての意味のある状態変化がキャプチャされます。スポーツや動きの速いものでは、1 秒あたり 2 ~ 5 フレーム。本物のフレーム精度の分析のために「すべてのフレーム」を予約します。60 fps の 1 分間は 3,600 枚の画像と数ギガバイトの PNG に相当します。

実際に時間を費やす 3 つの問題

1. 出力は何千ものほぼ同一のフレームです

ほとんどの場合、単位の取り違えが発生します。「10 フレームごと」を意味し、次のように書きました。 fps=10、これは 10 フレームを意味します 毎秒 — 単純な予想よりも 3 倍少ない画像である 30 fps ソース上に作成されます。

何かを実行する前に、再生時間モードを実行します。 duration ÷ interval。フレームインデックスモード: duration × source_fps ÷ N。 「10 フレームごと」の 10 分間の 30 fps クリップは、600 × 30 ÷ 10 = 1,800 画像になります。この数字に驚かれる場合は、開始後ではなく開始前に調整してください。ブラウザ ツールでは、同じ図が間隔フィールドの下に自動的に表示されます。

2. 長いビデオの途中で抽出が停止する

それぞれの側で原因が異なるため、修正方法も異なります。

FFmpeg では、ストールは通常ディスク関連です。数千の PNG が 1 つのディレクトリとファイル システムに配置され、デコーダではなく、ボトルネックになります。新しい空のディレクトリに書き込み、ロスレスが必要ない場合は JPG を優先し、非常に長いソースをセグメントに分割します。 -ss/-to.

ブラウザでは、制限は RAM です。抽出されたすべてのフレームは、ZIP をダウンロードするまでメモリに保持されます。数百の 4K PNG は数ギガバイトに相当し、タブが 1 つ削除される可能性があります。信頼できるパターンは、チャンクで作業することです。時間範囲スライダーを使用して 0:00 ~ 2:00 を取得し、その ZIP をダウンロードして、範囲を 2:00 ~ 4:00 に移動します。大規模なジョブを実行する前に他のタブを閉じると、本当に効果があり、85 ~ 90% の品質の JPG は、ほとんどの用途で目に見える違いがなく、メモリ負荷を数倍削減します。

3. フレーム番号付けによりインポート順序が崩れる

これは、エクスポート後に問題なく表示されます。ファイル名をテキストとして並べ替えるツール (ほとんどのツールはそうです) を並べ替えます。 frame_10.png 前に frame_2.png, 「1」は「2」よりも前に文字ごとにソートされるためです。シーケンスがスクランブル再生されますが、その理由は明らかではありません。

修正はゼロパディングで、これまでに生成される最大数に十分な幅をとります。つまり、 %04d のためのものです。使う %05d 9,999 フレームを超える可能性がある場合。ブラウザ ツールは自動的にパディングします。これが、その出力が名前を変更せずにイメージ シーケンス インポーターに直接ドロップされる傾向がある主な理由です。

FFmpeg が依然として適切なコールである場合

十分な時間です。これは、ブラウザが全面的に勝利するケースではありません。

  • スクリプトまたはスケジュールされたもの。 cron ジョブ、CI ステップ、サーバー側パイプライン - ブラウザーはこれらにまったく参加できません。
  • 多くのファイルにまたがるバッチ。 200 個のクリップを超えるシェル ループは、FFmpeg では簡単ですが、他の場所では退屈です。
  • ブラウザがデコードしないコーデック。 ProRes、DNxHD、raw カメラ形式、珍しいコンテナ。ブラウザが再生できない場合は、ブラウザから抽出できません。 FFmpeg は、ほぼすべてを処理します。
  • 抽出中のフィルタリング。 インターレース解除、スケーリング、色空間変換、トリミング、シーンチェンジ検出はすべて同じパス内のフィルターとして利用可能です。
  • 再現性。 README のコマンドは正確です。 「スライダーをここくらいに設定」ではありません。

ブラウザ ツールは、1 回限りのジョブ、時折のタスクのためにツールチェーンをインストールして維持したくない人、ソースの機密性が高くローカルのみの処理が重要な場合、およびエクスポートをコミットする前にフレームを確認したい場合に適しています。これらはランキングではなく、真に異なる状況です。

クイック リファレンス

何を FFmpeg ブラウザ ツール
1 秒あたり 1 フレーム -vf fps=1 時間間隔 = 1
5 秒ごとに 1 フレーム -vf fps=1/5 時間間隔 = 5
エンコードされた 10 フレームごと -vf "select=not(mod(n\,10))" -vsync vfr フレーム レート モード、N = 10
わずか 1:30 ~ 2:15 -ss 00:01:30 -to 00:02:15 時間範囲スライダー
ロスレス出力 .png 出力パターン 形式 = PNG
小さいファイル -q:v 5.jpg JPG + 品質スライダー
実行前にカウントを確認 手動で計算 間隔フィールドの下に表示されます
プレビューを押してください 出力フォルダーを開きます 組み込みのプレビュー グリッド
自動化 / バッチ シェル ループ、cron、CI 不可能
ProRes、DNxHD、raw サポートされています ブラウザがデコードしたもののみ

どちらのルートを選択する場合でも、間隔の決定が最初に行われ、ツールは二番目に行われます。実際に必要なフレーム数を計算し、開始する前にカウントを確認します。残りは機械的なものです。