Askthewind’s diary

個人的なメモ

FFmpegで動画を中央から2分割して左右に表示する

FFmpeg Crop with side by side Split

 

left and right

f:id:Askthewind:20181210123610p:plain

 FFmpegで動画を中央から2分割して左右に表示する

FFmpegでプレビュー

ffmpeg -f lavfi -i "color=red:480*270" -filter_complex "split[a][b];[a]crop=iw/2:ih:0:0[c];[b]lutyuv=170:166:16,crop=iw/2:ih:ow:0[d];[c][d]hstack" -f matroska - | ffplay -i -
ffmpeg -i "input.mp4" -filter_complex "split[a][b];[a]crop=iw/2:ih:0:0[c];[b]boxblur=5,crop=iw/2:ih:ow:0[d];[c][d]hstack" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"

 split[a][b];で、入力された動画を2つの出力に分割して[a][b]という任意の名前をつけています。

[a]crop=iw/2:ih:0:0[c];で分割した[a]を横から半分に切り取り[c]という任意の名前をつけています。

[b]lutyuv=170:166:16,crop=iw/2:ih:ow:0[d];で色を反転さて横から半分に切り取り[d]という任意の名前をつけています。

[c][d]hstackで切り取った[a][b]を横に並べています。

逆に並べたい場合は[d][c]hstackになります。

 

top and bottom

f:id:Askthewind:20181210130156p:plain

FFmpegで動画を中央から2分割して上下に表示する

FFmpegでプレビュー

ffmpeg -f lavfi -i "color=red:480*270" -filter_complex "split[a][b];[a]crop=iw:ih/2:0:0[c];[b]hue=h=180:s=10:b=5,crop=iw:ih/2:0:oh[d];[c][d]vstack" -f matroska - | ffplay -i -
ffmpeg -i "input.mp4" -filter_complex "split[a][b];[a]crop=iw:ih/2:0:0[c];[b]boxblur=5,crop=iw:ih/2:0:oh[d];[c][d]vstack" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
 

split[a][b];で、入力された動画を2つの出力に分割して[a][b]という任意の名前をつけています。

[a]crop=iw:ih/2:0:0[c];で、分割した[a]を縦から半分に切り取り[c]という任意の名前をつけています。

[b]hue=h=180:s=10:b=5,crop=iw:ih/2:0:oh[d];で、色を反転さて縦から半分に切り取り[d]という任意の名前をつけています。

[c][d]vstackで切り取った[a][b]を縦に並べています。
逆に並べたい場合は[d][c]vstackになります。

 

diagonal

f:id:Askthewind:20181210131219p:plain

FFmpegで動画を中央から2分割して斜め半分に表示する

FFmpegでプレビュー

ffmpeg -f lavfi -i "color=red:480*270" -filter_complex "format=gbrp,split[a][b];[b]selectivecolor=reds=0.92 -1 -1 0[c];[a][c]blend=all_expr=if(gt(X\,Y*(W/H))\,A\,B),format=yuv420p" -f matroska - | ffplay -i -
ffmpeg -i "input.mp4" -filter_complex "format=gbrp,split[a][b];[b]boxblur=5[c];[a][c]blend=all_expr=if(gt(X\,Y*(W/H))\,A\,B),format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"
 

format=gbrp,split[a][b];で、入力された動画のフォーマット形式をgbrpに変換して2つの出力に分割して[a][b]という任意の名前をつけています。

[b]selectivecolor=reds=0.92 -1 -1 0[c];で、カラーフィルタselectivecolorで色を反転さています。

[a][c]blend=all_expr=if(gt(X\,Y*(W/H))\,A\,B),format=yuv420pで計算式が使えるblendオプションall_exprで斜めに分割合成して他のデバイスでも見れるように出力フォーマットをyuv420pで最適化しています。

 

up down left right

f:id:Askthewind:20181211175532p:plain

FFmpegで動画を中央から4分割して表示する

FFmpegでプレビュー

ffmpeg -f lavfi -i "color=red:480*270" -filter_complex "format=gbrp,split=4[a][b][c][d];[a]crop=iw/2:ih/2:0:0[e];[b]curves=negative,crop=iw/2:ih/2:ow:0[f];[c]lutrgb=negval:negval:negval,crop=iw/2:ih/2:0:oh[g];[d]crop=iw/2:ih/2:ow:oh[h];[e][f][g][h]xstack=4:0_0|w0_0|0_h0|w0_h0,format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "format=gbrp,split=4[a][b][c][d];[a]crop=iw/2:ih/2:0:0[e];[b]boxblur=5,crop=iw/2:ih/2:ow:0[f];[c]boxblur=5,crop=iw/2:ih/2:0:oh[g];[d]crop=iw/2:ih/2:ow:oh[h];[e][f][g][h]xstack=4:0_0|w0_0|0_h0|w0_h0,format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"
 

format=gbrp,split=4[a][b][c][d];でフォーマットをgbrp形式に変換して入力された動画を4つの出力に分割して[a][b][c][d]という任意の名前をつけています。

[a]crop=iw/2:ih/2:0:0[e];で半分に切り取り[e]という任意の名前をつけています。

[b]curves=negative,crop=iw/2:ih/2:ow:0[f];で色を反転さて半分に切り取り[f]という任意の名前をつけています。

[c]lutrgb=negval:negval:negval,crop=iw/2:ih/2:0:oh[g];で色を反転さて半分に切り取り[g]という任意の名前をつけています。

[d]crop=iw/2:ih/2:ow:oh[h];で半分に切り取り[h]という任意の名前をつけています。

[e][f][g][h]xstack=4:0_0|w0_0|0_h0|w0_h0,format=yuv420pで切り取った[e][f][g][h]をタイル状に並べて他のデバイスでも見れるように出力フォーマットをyuv420pで最適化しています。

 

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

stackoverflow.com

Also see

ffmpeg.org