アップロードなし, 100%ローカル, アカウントなし

記事

サムネイルとコンタクトシート用にビデオフレームを抽出する

ビデオは静止画のシーケンスです。その画像の1つを取り出すと、サムネイル、カバー、またはコンタクトシートが得られます。ビデオコーデックがどのようにフレームを保存するか、どの瞬間を捉える価値があるかを理解すると、結果はよりシャープで予測可能になります。

フレームとフレームレート

ビデオファイルは、動きの錯覚を作り出すのに十分な速さで表示される静止画のシーケンスです。1秒あたりに表示される画像の数がフレームレートで、fpsで表されます。一般的な値は、映画で24 fps、PAL放送で25 fps、ウェブビデオで30 fps、ゲーム映像で60 fpsです。24 fpsでは、2時間の映画に約172,800個の個別フレームが含まれます。各フレームは時間内の単一の瞬間に対応し、1つを抽出するとその瞬間がスタンドアロンの画像として凍結されます。フレームレートはバッチで抽出するときに1秒の映像あたり何フレームを得られるかも決定します:30 fpsで、1分のビデオからすべてのフレームを引き出すと1,800枚の画像になりますが、多くの場合、必要以上です。より低いフレームレートで抽出する、あるいは対応しているツールでN番目のフレームごとに抽出することは、完全な時間をカバーしながらそのボリュームを減らす実用的な方法です。

1秒の映像の24個の個別フレームを示すタイムラインストリップで、各フレームの下にフレーム番号とタイムスタンプが表示されている。

キーフレームと補間フレーム

現代のビデオコーデックはすべてのフレームを完全な画像として保存しません。スペースを節約するために3種類のフレームタイプを使います。I-frame(キーフレームとも呼ばれる)は完全で自己完結した画像です。P-frameは最後のI-frameまたはP-frame以降に変わったピクセルだけを保存します。B-frameは前後のフレームの両方に対する変化を保存し、それを再構成するには両側のフレームが必要です。P-frameまたはB-frameはそれ自体では不完全なため、デコードには周囲の参照フレームが必要です。それらの参照フレームにモーションブラーやトランジションが含まれている場合、再構成された画像はそのブラーを引き継ぎます。I-frameはそれとは対照的に、独立してデコードされます。隣接フレームから何も借りないため、常にシャープです。サムネイルとして使うフレームを抽出するとき、I-frameに着地するともっともクリーンな結果が得られます。ほとんどのコーデックはシーンカット時にI-frameを配置しており、それらは自然にシャープな出発点です。

適切な瞬間を選ぶ

うまくデコードされたI-frameでも、捉えた瞬間が不適切であれば質の低いサムネイルになることがあります。サムネイルの品質を下げるいくつかの要因があります。モーションブラーは、フレームの露出中にカメラや被写体が素早く動くときに発生し、デコードがクリーンでも結果の映像はソフトに見えます。ディゾルブやフェードの途中でキャッチされたトランジションフレームには2つの重なった画像が含まれ、スタンドアロンの写真としてはほとんど機能しません。自動露出が落ち着く前のシーン冒頭でよくある露出オーバーまたはアンダーのフレームは、影やハイライトでディテールを失います。最良のサムネイルフレームは、明確なアクションや表情の瞬間、良い照明、安定したカメラから来ます。正確なタイムスタンプを表示するプレイヤーでビデオをスクラビングすると、抽出前にそれらの瞬間を特定できます。プレイヤーで一時停止したときに良く見えるフレームは、一般的に静止エクスポートとしても良く見えます。

アクション中の被写体の明るく安定したフレームで一時停止したビデオプレイヤーで、コーナーにタイムスタンプが表示されている。

エクスポート:解像度、フォーマット、N番目のフレームごと

フレームを抽出するとき、エクスポートされた画像はビデオのネイティブ解像度と一致するべきです。スケールアップすると補間アーティファクトが生じ、スケールダウンすると必要なピクセルが失われます。1080pビデオは1920x1080ピクセルの画像を生成し、4Kビデオは3840x2160を生成します。フォーマットについては、PNGはすべてのピクセルを正確に保存し、編集やさらなるスケーリングのために最大のシャープさが必要なときに適しています。JPEGはサイズが小さく、プレビューや共有に適していますが、シャープなエッジ周辺に圧縮アーティファクトが生じます。完全な時間をカバーする代表的なフレームの小さなグリッドであるコンタクトシートを作成する場合は、すべてのフレームを取り出すのではなく、固定のフレームレートで抽出するのが標準的なアプローチです。30 fpsのソースから1秒あたり1フレームを指定すると、映像の1秒につき1枚の画像が得られ、5 fpsや10 fpsのようなより高いレートを指定すれば、詳細な確認向けの密なセットが得られます。正確なレートは、必要なディテールの量と処理したい画像の数によります。

video-extract-framesでローカル処理する

Sunastyのvideo-extract-framesツールは、WebAssemblyにコンパイルされたFFmpegを使って、ビデオをすべてブラウザ内でデコードします。ファイルをドロップし、1〜30フレーム毎秒の範囲でフレームレートを選択し、PNGまたはJPEGを選ぶと、ツールがそのレートでブラウザのメモリ内にフレームをデコードし、結果を個別のダウンロードとして提供します(1回の実行につき最大300フレーム)。ビデオファイルはデバイスを離れません。処理中にサーバーにバイトは送信されません。これは個人的または機密性の高いコンテンツを含む映像にとって重要です:家族の録画、インタビュー、編集前の生映像など。ブラウザはビデオをRAMの仮想ファイルシステムに読み込み、FFmpegデコードを実行し、画像を返します。トレードオフは、デコードが専用ハードウェアではなくCPU上でソフトウェアで行われるため、長い高解像度ビデオはネイティブアプリケーションより時間がかかることです。少数のフレームを抽出したり、短いクリップからコンタクトシートを生成したりするには、速度は実用的です。

この記事で紹介するツール

よくある質問

抽出したフレームがぼけているのはなぜですか?

最も一般的な原因は、動きのある瞬間のP-frameまたはB-frameに着地することです。これらのフレームは完全な画像ではなく差分を保存しており、ソース映像のモーションブラーがデコードに持ち込まれます。シーンカットまたは定期的なキーフレームに対応する、最も近いI-frameを抽出してみると、よりシャープな結果が得られます。

フレームをPNGとJPEGのどちらでエクスポートすべきですか?

フレームを編集したり、スケールアップしたり、圧縮アーティファクトが見える状況で使う予定があるならPNG。共有やプレビューのために小さいファイルが必要で、わずかな品質低下が許容できるならJPEG。固定された小さいサイズで表示されるサムネイルには、適切な品質設定のJPEGで通常十分です。

ビデオからコンタクトシートを作るにはどうすればいいですか?

単一のタイムスタンプではなく、扱いやすい枚数に収まるくらい低いフレームレートを選んでください。2分のクリップなら1フレーム毎秒でおよそ120フレームが得られ、良いグリッドを選ぶには十分な密度です。出力はいずれにせよ1回の実行につき最大300フレームに制限されます。現時点では1 fpsより粗いレートはないため、もっと疎なシートが欲しい場合は1 fpsで抽出し、最終的なグリッドに使いたいフレームだけを残してください。