FFMpeg:ビデオファイルをビデオの複数の画像を含むgifに変換

FFMpeg:ビデオファイルをビデオの複数の画像を含むgifに変換

私はユーザーがビデオをアップロードできるプロジェクトを進めています。 FFmpegを使用してビデオからいくつかの画像を取得してGIFを作成する方法はありますか?

プロジェクトがJavaで書かれているため、ビデオから画像を取得する方法がありますが、GIFを生成するには複数の画像が必要で費用がかかります。

サーバーはDebian X64システムを実行しているため、FFMpegが適切でない場合は、Linux上の他のツールを使用してこれを効率的に実行することになります。

答え1

私はビデオからシーンを抽出するためにLinuxを使用していますvlc。そうでない場合

apt-get install vlc

インストールしてください。インストールしたら、次のコマンドラインのバリエーションを使用してビデオからフレームを抽出できます。デフォルトの画像形式はpng私の目的にぴったりです。画像の使用に固執する場合は、画像形式変換のインストールgifをお勧めします。imagemagickフレームを抽出するコマンドは次のとおりです。

cvlc ${videofile} \
         --video-filter=scene \
         --vout=dummy \
         --start-time=${start-sec} --stop-time=${end-sec} \
         --scene-ratio=1 --scene-prefix=${prefix} \
         --scene-path=${MyStorePath} \
         vlc://quit

どこ

videofilemp4形式の動画です。他の形式も可能かもしれませんが、テストされていません。

start-secフレームキャプチャを開始したい位置(秒単位)。

end-sec開始後数秒以内にフレームキャプチャを終了する場所です。より大きくなければならないstart-sec

prefixはキャプチャされたイメージファイル名のプレフィックスです。

MyStorePathキャプチャした画像を保存したいパス。

このコマンドは、ビデオの長さを計算するのに役立ちます。

ffmpeg -i ${vidfile} 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//

出力がHH:MM:SS.xxフォーマットされました。秒単位のビデオ長に変換するには、次のようにします。

l=$(ffmpeg -i ${vidfile} 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//)
h=$(echo $l|cut -d: -f1)
m=$(echo $l|cut -d: -f2)
s=$(echo $l|cut -d: -f3|cut -d"." -f1)
(( hh=$h*3600 ))
(( mm=$m*60 ))
(( LengthSeconds=$hh+$mm+$s ))

この時点でLengthSeconds変数を操作して、開始時刻と終了時刻を自動的に判別できます。残念ながら、私のvlcコマンドが機能するには〜しなければならないフレームが抽出される時間フラグメントを指定します。

関連情報