Askthewind’s diary

個人的なメモ

ffmpegで動画から綺麗なgif画像(アニメーション)を作成する

f:id:Askthewind:20190314200518j:plain

 

Create a crisp gif image from a video

f:id:Askthewind:20190314200707g:plain

 ffmpegで動画から綺麗なgif画像(アニメーション)を作成する 

ffmpegでプレビュー

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,split[a],palettegen,[a]paletteuse" -an -f matroska - | ffplay -i -

ffmpegでコンバート

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,split[a],palettegen,[a]paletteuse" -an "output.gif"

 

-ss 5と-t 3で入力した動画input.mp4の開始5秒目から3秒間切り出す指定をしています。
-ss 5の部分は-ss 00:05とmm:ss方式でも記述できます。切り出す部分が60分目以降の場合はhh:mm:ss方式で-ss 01:02:05(1時間2分5秒)のように記述出来ます。

fps=10で出力フレームレートを10fps(1秒間に10フレーム)で指定をしています。

split[a],palettegen,[a]paletteuseでパレットを最適化しています。パレットを最適化することによって綺麗なgif画像(アニメーション)を作成できます。

-anで出力音声を無効にしています。

出力gif画像のパレットを最適化するコマンド

split[a],palettegen,[a]paletteuse
フィルタチェインsplit[a],palettegen,[a]paletteuseはフィルタグラフsplit[a][b];[b]palettegen[c];[a][c]paletteuseと同じになります。当てるフィルタが一つなのでここではフィルタチェインを使用しています。
 
 
By specifying scaling

f:id:Askthewind:20190314201215g:plain

ffmpegで動画からサイズを指定して綺麗なgif画像(アニメーション)を作成する

ffmpegでプレビュー

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,scale=480:-1:flags=lanczos,split[a],palettegen,[a]paletteuse" -an -f matroska - | ffplay -i -

ffmpegでコンバート

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,scale=480:-1:flags=lanczos,split[a],palettegen,[a]paletteuse" -an "output.gif"

 

-ss 5と-t 3で入力した動画input.mp4の開始5秒目から3秒間切り出す指定をしています。
-ss 5の部分は-ss 00:05とmm:ss方式でも記述できます。切り出す部分が60分目以降の場合はhh:mm:ss方式で-ss 01:02:05(1時間2分5秒)のように記述出来ます。

fps=10で出力フレームレートを10fps(1秒間に10フレーム)で指定をしています。

scale=480:-1:flags=lanczosでアスペクト比を保ったままスケーリングアルゴリズムにlanczos(ランチョス)を指定して出力サイズを横幅480px、縦幅を自動計算でリサイズしています。スケールダウン(入力動画よりも出力幅を小さく)するとファイルサイズの容量が小さくなり、スケールアップ(入力動画よりも出力幅を大きく)するとファイルサイズの容量が大きくなります。

split[a],palettegen,[a]paletteuseでパレットを最適化しています。パレットを最適化することによって綺麗なgif画像(アニメーション)を作成できます。

-anで出力音声を無効にしています。

 

By inserting text

f:id:Askthewind:20190314202708g:plain

ffmpegでテキストを挿入して動画から綺麗なgif画像(アニメーション)を作成する

ffmpegでプレビュー

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,scale=480:-1:flags=lanczos,drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Askthewind s diary':fontsize=24:fontcolor=white:x=(w-tw)/2:y=(h/PHI)+th,split[a],palettegen,[a]paletteuse" -an -f matroska - | ffplay -i -

ffmpegでコンバート

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,scale=480:-1:flags=lanczos,drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Askthewind s diary':fontsize=24:fontcolor=white:x=(w-tw)/2:y=(h/PHI)+th,split[a],palettegen,[a]paletteuse" -an "output.gif"

-ss 5と-t 3で入力した動画input.mp4の開始5秒目から3秒間切り出す指定をしています。
-ss 5の部分は-ss 00:05とmm:ss方式でも記述できます。切り出す部分が60分目以降の場合はhh:mm:ss方式で-ss 01:02:05(1時間2分5秒)のように記述出来ます。

fps=10で出力フレームレートを10fps(1秒間に10フレーム)で指定をしています。

scale=480:-1:flags=lanczosでアスペクト比を保ったままスケーリングアルゴリズムにlanczos(ランチョス)を指定して出力サイズを横幅480px、縦幅を自動計算でリサイズしています。スケールダウン(入力動画よりも出力幅を小さく)するとファイルサイズの容量が小さくなり、スケールアップ(入力動画よりも出力幅を大きく)するとファイルサイズの容量が大きくなります。

drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf'でフォントファミリーを指定しています。

:text='Askthewind s diary'で表示させたいテキストの指定をしています。
:text=' 'の中に表示させたいテキストを入力します。

:fontsize=24:fontcolor=whiteでフォントサイズとフォントカラーの指定をしています。

:x=(w-tw)/2:y=(h/PHI)+thでテキストの表示位置を指定しています。

split[a],palettegen,[a]paletteuseでパレットを最適化しています。パレットを最適化することによって綺麗なgif画像(アニメーション)を作成できます。

-anで出力音声を無効にしています。

 

By inserting text and background color

f:id:Askthewind:20190314203130g:plain

ffmpegで背景色付きのテキストを挿入して動画から綺麗なgif画像(アニメーション)を作成する

ffmpegでプレビュー

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,scale=480:-1:flags=lanczos,drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Askthewind s diary':box=1:boxcolor=black@0.4:boxborderw=5:fontsize=24:fontcolor=white:x=(w-tw)/2:y=(h/PHI)+th,split[a],palettegen,[a]paletteuse" -an -f matroska - | ffplay -i -

ffmpegでコンバート

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,scale=480:-1:flags=lanczos,drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Askthewind s diary':box=1:boxcolor=black@0.4:boxborderw=5:fontsize=24:fontcolor=white:x=(w-tw)/2:y=(h/PHI)+th,split[a],palettegen,[a]paletteuse"  -an "output.gif"

-ss 5と-t 3で入力した動画input.mp4の開始5秒目から3秒間切り出す指定をしています。
-ss 5の部分は-ss 00:05とmm:ss方式でも記述できます。切り出す部分が60分目以降の場合はhh:mm:ss方式で-ss 01:02:05(1時間2分5秒)のように記述出来ます。

fps=10で出力フレームレートを10fps(1秒間に10フレーム)で指定をしています。

scale=480:-1:flags=lanczosでアスペクト比を保ったままスケーリングアルゴリズムにlanczos(ランチョス)を指定して出力サイズを横幅480px、縦幅を自動計算でリサイズしています。スケールダウン(入力動画よりも出力幅を小さく)するとファイルサイズの容量が小さくなり、スケールアップ(入力動画よりも出力幅を大きく)するとファイルサイズの容量が大きくなります。

drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf'でフォントファミリーを指定しています。

:text='Askthewind s diary'で表示させたいテキストの指定をしています。
:text=' 'の中に表示させたいテキストを入力します。

:box=1:boxcolor=black@0.4:boxborderw=5でテキストの背景(box)と背景色、背景(box)のサイズ指定をしています。

:fontsize=24:fontcolor=whiteでフォントサイズとフォントカラーの指定をしています。

:x=(w-tw)/2:y=(h/PHI)+thでテキストの表示位置を指定しています。

split[a],palettegen,[a]paletteuseでパレットを最適化しています。パレットを最適化することによって綺麗なgif画像(アニメーション)を作成できます。

-anで出力音声を無効にしています。

 

Cropped to the square from the center

f:id:Askthewind:20190314203616g:plain

ffmpegで動画の中央から正方形にトリミングして綺麗なgif画像(アニメーション)を作成する

ffmpegでプレビュー

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,scale=-1:360:flags=lanczos,crop=ih:ih,setsar=1,split[a],palettegen,[a]paletteuse" -an -f matroska - | ffplay -i -

ffmpegでコンバート

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,scale=-1:360:flags=lanczos,crop=ih:ih,setsar=1,split[a],palettegen,[a]paletteuse" -an "output.gif"

-ss 5と-t 3で入力した動画input.mp4の開始5秒目から3秒間切り出す指定をしています。

-ss 5の部分は-ss 00:05とmm:ss方式でも記述できます。切り出す部分が60分目以降の場合は:ss方式で-ss 01:02:05(1時間2分5秒)のように記述出来ます。

fps=10で出力フレームレートを10fps(1秒間に10フレーム)で指定をしています。

scale=-1:360:flags=lanczosでアスペクト比を保ったままスケーリングアルゴリズムにlanczos(ランチョス)を指定して縦幅360px、横幅を自動計算でリサイズしています。

crop=ih:ihで縦幅に合わせて中央から横幅と縦幅を正方形に切り出す指定をしています。出力サイズは360px*360pxの正方形になります。

setsar=1で出力ピクセルアスペクト比を入力ピクセルアスペクト比と同じになるように設定しています。

split[a],palettegen,[a]paletteuseでパレットを最適化しています。パレットを最適化することによって綺麗なgif画像(アニメーション)を作成できます。

-anで出力音声を無効にしています。

 

Cropped to the square from an arbitrary position

f:id:Askthewind:20190314204733g:plain

ffmpegで動画の任意の位置から正方形にトリミングして綺麗なgif画像(アニメーション)を作成する

ffmpegでプレビュー

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,scale=-1:360:flags=lanczos,crop=360:360:200:0,setsar=1,split[a],palettegen,[a]paletteuse" -an -f matroska - | ffplay -i -

ffmpegでコンバート

ffmpeg -ss 5 -i "input.mp4" -t 3 -filter_complex "fps=10,scale=-1:360:flags=lanczos,crop=360:360:200:0,setsar=1,split[a],palettegen,[a]paletteuse" -an "output.gif"

-ss 5と-t 3で入力した動画input.mp4の開始5秒目から3秒間切り出す指定をしています。

-ss 5の部分は-ss 00:05とmm:ss方式でも記述できます。切り出す部分が60分目以降の場合はhh:mm:ss方式で-ss 01:02:05(1時間2分5秒)のように記述出来ます。

fps=10で出力フレームレートを10fps(1秒間に10フレーム)で指定をしています。

scale=-1:360:flags=lanczosでアスペクト比を保ったままスケーリングアルゴリズムにlanczos(ランチョス)を指定して縦幅360px、横幅を自動計算でリサイズしています。

crop=360:360:200:0で出力サイズの横幅が360px、縦幅が360px、縦幅に合わせて左から200pxの位置で正方形に切り出す指定をしています。出力サイズは360px*360pxの正方形になります。

setsar=1で出力ピクセルアスペクト比を入力ピクセルアスペクト比と同じになるように設定しています。

split[a],palettegen,[a]paletteuseでパレットを最適化しています。パレットを最適化することによって綺麗なgif画像(アニメーション)を作成できます。

-anで出力音声を無効にしています。

 

参考にさせていただきました。 Special Thanks

superuser.com

superuser.com

superuser.com

Also see

ffmpeg.org