アプリケーションの 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_fps
は10*25
(PAL) または(NTSC)となり、は時間、は分、は秒、 はフレーム (最後の秒数後) を意味します。10*30
total_frames_of_vid=(hh*3600+mm*60+ss)*25+ff
hh
mm
ss
ff
計算例: 25 フレーム/秒でのタイムコード01:35:45:24
(または01:35:45.960
FFmpeg の用語では、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:v
。fps
また、出力画像の名前に 3 桁の数字が含まれるように変更しました。)
そしてそれを GIF に再コーディングします。
このソリューションでは、すべてのオプションの値 (特にfps
ビデオの長さに応じて変更する必要がある) が計算または手作業で必要になります。つまり、私は 35 分のビデオでスーパーユーザーの元のコードを試しましたが、5 フレームしか取得できませんでした。