ffmpegで動画を静止画の連番ファイルにするバッチファイルが意図した動作をしない。%のエスケープが必要だった。

middledot
3 min readMay 28, 2018
ffmpeg.exe -i 201603251638.mp4 -r 5 %06d.png

コマンドライン上で上のコマンドを入力すれば、フレームレート5枚/秒で 連番6桁埋めのPNGファイルが生成される。

しかし、以前利用したバッチファイルでドラッグアンドドロップで実行しようとすると、ファイル名がおかしくなる。

上のコマンドをそのままバッチファイルにすると

C:\bin\ffmpeg\bin>ffmpeg.exe -i 201603251638.mp4 -r 5 "C:\bin\ffmpeg\bin\output.bat"6d.png

となってしまう。%06dが意図しない動作の原因のようだ。(%0は、実行しているバッチ名に変換されてしまうらしい。)

特殊文字でバッチ処理内で解釈されてしまいffmpeg.exeに意図したとおりに渡っていないようだ。

を見るとバッチファイル内では%は特殊文字で%%06d.pngとしないといけない。

@ECHO OFF

:FILEDROP
ECHO ファイル受け取り
cd %~dp0
C:\bin\ffmpeg\bin\ffmpeg.exe -i %1 -r 5 %~dp1%%06d.png:EXIT
pause

意図した動作になった。

しかし、mp4ファイルと同じ階層にPNGファイルが多数生成されて面倒だ。事前に出力用のフォルダを作っておき、そのフォルダに出力するようにした。

を参考に日付と時間を取得しておく、システムの時間を変換する部分は当該サイトを参照のこと。%custDate%%custTime%をいきなり使っても動かない。

md %~d1%~p1%custDate%%custTime%

のようにしてフォルダを作る。

その後、

C:\bin\ffmpeg\bin\ffmpeg.exe -i %1 -r 1 %~d1%~p1\%custDate%%custTime%\%%06d.png

のようにして出力した。

--

--