pixivのうごイラにアップするときに便利なffmpegコマンド
ブログへ動画を掲載する際、pixivのうごイラにアップすることも多いのですが、その際使っているffmpegコマンドを忘れないうちに記事に掲載しておこうと思います。
うごイラの条件
- ファイル形式はPNGまたはJPEGのみ
- 最大枚数150枚
- 1枚あたり8MB以下、合計30MB以下
- アニメーションGIFの場合は上限枚数150枚、16MB以下
GIFは画質がアレなので今まで使ったことありませんが、どうしても長尺にしたいならアリなのかも?
ffmpegで動画を連番画像へ変換
30fpsなら5秒までUP可能。下記はバッチファイル例。長辺1024pxまで小さくしているのでお好みで変更をどうぞ。pix_fmtを指定しているのは、これがないとアニメ絵の場合、モスキートノイズがひどいからです。
mkdir pixiv 2>nul & del /q pixiv\* ffmpeg -i "%~1" -vf "fps=30,scale='if(gt(iw,ih),min(1024,iw),-1)':'if(gt(iw,ih),-1,min(1024,ih))'" -q:v 3 -pix_fmt yuvj444p "pixiv\out_%%03d.jpg"
15fpsなら10秒動画までアップ可能。
mkdir pixiv 2>nul & del /q pixiv\* ffmpeg -i "%~1" -vf "fps=15,scale='if(gt(iw,ih),min(1024,iw),-1)':'if(gt(iw,ih),-1,min(1024,ih))'" -q:v 3 -pix_fmt yuvj444p "pixiv\out_%%03d.jpg"
10fpsなら15秒動画までアップ可能だけどかなりガクガク。
mkdir pixiv 2>nul & del /q pixiv\* ffmpeg -i "%~1" -vf "fps=10,scale='if(gt(iw,ih),min(1024,iw),-1)':'if(gt(iw,ih),-1,min(1024,ih))'" -q:v 3 -pix_fmt yuvj444p "pixiv\out_%%03d.jpg"
動画ファイルからワークフローの削除
最近はあまり使わないけど、EasyWan22などワークフローを丸ごとmp4に埋め込むケースではファイルサイズが巨大になる上、Shotcut等の動画編集ソフトがフリーズしそうになるため、このバッチファイルで一括してメタデータの削除をしていました。
@echo off
for %%f in (%*) do (
ffmpeg -i "%%f" -map_metadata -1 -c copy "%%~nf_clean.mp4"
)
ピンポンループの作り方
動画の最初の5秒と、それを逆再生した5秒を繋げた10秒動画を作る場合のコマンド。
ffmpeg -i "%~1" -filter_complex "[0:v]trim=0:5,setpts=PTS-STARTPTS,split[v1][v2]; [v2]reverse,setpts=PTS-STARTPTS[v_rev]; [v1][v_rev]concat=n=2:v=1:a=0[outv]" -map "[outv]" -c:v libx264 -crf 18 -pix_fmt yuv420p -movflags +faststart "pingpong_%~nx1"
なぜ5秒きっかりで切り取るかというと、WanVideo 2.2などで生成した場合、81フレーム=5.0625秒と端数が出るので、そのまま2つ繋げると160枚くらいになり、うごイラの制限を超えるためです。
ピンポンループ動画の具体例
5秒あたりで逆再生しているのがわかるかと思います。
videoタグの書き方
一部の端末ではplaysinlineがないと再生直後に全画面に移行するらしいので入れておいたほうが吉。
<video src="video.mp4" autoplay loop muted playsinline></video>
videoタグで置いた動画がぐるぐるで再生できない場合
対応フォーマットなのにブラウザで再生できない場合、moov atom(ムーブ・アトム)という管理データが、ファイルの最後尾に置かれていることが原因な場合が多く、このコマンドで目次データをファイルの先頭に移動させることで解決する。
ffmpeg -i "%~1" -c copy -movflags +faststart "web_%~nx1"
h.264でギリギリまでファイルサイズを減らしたい
個人サイトを運営しているとレンタルサーバーの容量との闘いなので、互換性を保ちつつ1バイトでも減らすためにこんなバッチファイルを使っています。
ffmpeg -i "%~1" -vf "scale='if(gt(ih,1080),-2,-2)':'if(gt(ih,1080),1080,ih)'" -c:v libx264 -preset slow -tune animation -profile:v high -level 4.0 -crf 28 -pix_fmt yuv420p -movflags +faststart -map_metadata -1 -map_chapters -1 -c:a aac -b:a 96k "%~n1-diet.mp4"
CRF28まで品質を落としつつも、tune animationでアニメ絵に特化した圧縮で劣化を抑え、メタデータを排除し、解像度も1080p以下、音声があれば96kまで落とす設定です。
AV1とopusが使えたらここまでしなくても良いのだけれど、iPhoneが対応してくれないので致し方なし。
複数の動画を結合して透かしも入れたい
下記の内容で作ったバッチファイルに、複数ファイルをドラッグ&ドロップすれば結合できます。
@echo off :: --- 設定エリア --- set "MY_TEXT=Sample" set "FONT_PATH=%LOCALAPPDATA%\Microsoft\Windows\Fonts\07LogoTypeGothic7.ttf" set "FONT_PATH=%FONT_PATH:\=/%" set "FONT_PATH=%FONT_PATH::=\:%" :: 出力ファイル名 set "OUT_FILE=combined_web_optimized.mp4" set "LIST_FILE=concat_list.txt" if exist "%LIST_FILE%" del "%LIST_FILE%" :: ------------------ :loop if "%~1" == "" goto process :: パスにスペースが含まれても大丈夫なように記述 echo file '%~1' >> "%LIST_FILE%" shift goto loop :process if not exist "%LIST_FILE%" goto end echo Web最適化設定で圧縮を開始します... echo 設定: CRF28 / SLOW / ANIMATION / Web-Optimized ffmpeg -f concat -safe 0 -i "%LIST_FILE%" ^ -vf "drawtext=text='%MY_TEXT%':x=W-tw-20:y=H-th-20:fontsize=H/20:[email protected]:fontfile='%FONT_PATH%'" ^ -c:v libx264 ^ -preset slow ^ -tune animation ^ -profile:v high ^ -level 4.0 ^ -crf 28 ^ -pix_fmt yuv420p ^ -movflags +faststart ^ -map_metadata -1 ^ -map_chapters -1 ^ -an -y "%OUT_FILE%" :: 一時ファイルの削除 if exist "%LIST_FILE%" del "%LIST_FILE%" if %errorlevel% equ 0 ( echo. echo 【成功】圧縮が完了しました: %OUT_FILE% ) else ( echo. echo 【エラー】処理中に問題が発生しました。 ) :end pause
WanVideoで5秒のシーンをいくつか作った後、動画繋げるだけのために編集ソフト使うの面倒だなぁと思ってバッチファイルにしました。
透かしがいらない場合はこの1行を削除すればOK。
-vf "drawtext=text='%MY_TEXT%':x=W-tw-20:y=H-th-20:fontsize=H/20:[email protected]:fontfile='%FONT_PATH%'" ^
逆に透かしを使う場合は FONT_PATH に有効なフォント名を指定すること。
set "FONT_PATH=%LOCALAPPDATA%\Microsoft\Windows\Fonts\07LogoTypeGothic7.ttf"
まとめ
備忘録を兼ねたffmpegコマンドのメモですが、どこかの誰かのお役に立てば幸いです。















