私はユーザーがビデオをアップロードできるプロジェクトを進めています。 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
どこ
videofile
mp4形式の動画です。他の形式も可能かもしれませんが、テストされていません。
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
コマンドが機能するには〜しなければならないフレームが抽出される時間フラグメントを指定します。