FFMPEG: ビデオをアニメーション GIF に変換し、間隔後にフレームを取得するプレビュー

FFMPEG: ビデオをアニメーション GIF に変換し、間隔後にフレームを取得するプレビュー

アプリケーションの GIF プレビューを生成したいので、FFMPEG を使用してサーバー上で作成しました。

可能であれば、一時ディレクトリ (または各フレームに関連する一時ファイル) を使用せずに、各ビデオに対して 10 フレームを取得する GIF を生成する必要があります。

この回答に関してスーパーユーザー各フレームを使用して GIF を生成する必要がありますが、これは必要ではありません。

奇妙に思えるかもしれませんが、私が必要としている効果は、多くのポルノサイトで見られるものです(どれだったかは覚えていません)

答え1

もし私が正しく理解しているなら、FFmpeg の Wiki にある「ビデオの X 秒ごとにサムネイル画像を作成する」という記事FFmpeg では、(自動計算なしでは)必要な処理を実行できないことがわかります。

ウィキによれば、これが-vf "fps=fps=XYZ"ベストショットですXYZ。元のビデオのフレームごとに 1 つのサムネイル/フレームが作成されます。ビデオごとに 10 枚の画像が必要で、それぞれ長さが異なる場合は、まず合計フレーム数を読み取り、次にスクリプトを使用して必要な fps を計算できます。

XYZ=wanted_frames_times_actual_fps/total_frames_of_vid

この場合、wanted_frames_times_actual_fps10*25(PAL) または(NTSC)となり、は時間、は分、は秒、 はフレーム (最後の秒数後) を意味します。10*30total_frames_of_vid=(hh*3600+mm*60+ss)*25+ffhhmmssff計算例: 25 フレーム/秒でのタイムコード01:35:45:24(または01:35:45.960FFmpeg の用語では、FFmpeg はフレームではなくミリ秒を使用するため) は、合計 143,649 フレームに相当します。

この解決策はうまくいく可能性があります。ビデオの合計時間 (ffprobe 経由など) と fps (適切なタイムコードを取得できない場合) を取得する方法を見つけて、その情報を という名前の変数として保存するだけです$total_frames_of_vid


これに関する別のアプローチをWikiの「こちらも参照」セクションで見つけました。 「FFmpeg を使用したビデオの意味のあるサムネイル」というスーパーユーザーの質問これは以下を使用することを提案します:

ffmpeg -hide_banner -i <YOUR_VIDEO> -vf "select=gt(scene\,0.8)" -frames:v 10 -vsync vfr -vf "fps=fps=1/200" -y out%03d.png

(コードを少し変更しました。画像コーデックを PNG に変更し、およびの値を変更しました-frames:vfpsまた、出力画像の名前に 3 桁の数字が含まれるように変更しました。)

そしてそれを GIF に再コーディングします。

このソリューションでは、すべてのオプションの値 (特にfpsビデオの長さに応じて変更する必要がある) が計算または手作業で必要になります。つまり、私は 35 分のビデオでスーパーユーザーの元のコードを試しましたが、5 フレームしか取得できませんでした。

関連情報