読者です 読者をやめる 読者になる 読者になる

ハクチョウノミズウミ

日記やプログラミングの備忘録などを書きます。雑多なごった煮。

備忘録: ffmpeg と -i オプションの位置の話

ffmpeg って便利

自分は声優のニコ生を見るのが好きで、その番組の面白かったところを GIF にして見返すという謎の趣味がある。

で、GIF を作るときには ffmpeg にこんなコマンドを投げてスナップショットを切り出す。

ffmpeg -i in.mp4 -ss 00:10:00 -t 10 -r 10 -f image2 snap/test-0/out_%%03d.jpg

参考: ffmpegで動画から画像を切り出す | mitc

このコマンドだと、入力ファイルの10分目から10秒間、10fpsでスナップショットを取得する。

ffmpeg って繊細

ところがこの ffmpeg 、かなり繊細で、-i オプションの位置(順番)によって処理速度が大きく変わる。 前述の例だと、 -i オプションが一番頭にくるか、 -t の前に来るかという違いになる。

ちょっと気になったので、それぞれの処理時間を計測してみた。

時間計測

今回は簡易な時間計測で問題ないので、 echo %time% を用いた。

参考: blog.dreamhive.co.jp

実行環境は DELL Inspiron R15 (N5110) [Intel Core i5-2450M 2.50GHz / RAM 4GB] / Windows 10。4年もの。 あと実行してから気付いたけど nul 効かねえ。

例1

入力:

echo %time%
ffmpeg -i in.mp4 -ss 00:10:00 -t 10 -r 10 -f image2 snap/test-0/out_%%03d.jpg > nul
echo %time%
pause

出力:

C:\Users\~~\ffmpeg>echo 22:02:51.60
22:02:51.60

C:\Users\~~\ffmpeg>ffmpeg -i in.mp4 -ss 00:10:00 -t 10 -r 10 -f image2 snap/test-0/out_%03d.jpg  1>nul

[中略]

C:\Users\~~\ffmpeg>echo 22:03:41.68
22:03:41.68

22:03:41.68 - 22:02:51.60 = 0:50.08

……遅っそ!!!!!!

例2

入力:

echo %time%
ffmpeg -ss 00:10:00 -i in.mp4 -t 10 -r 10 -f image2 snap/test-0/out_%%03d.jpg > nul
echo %time%
pause

出力:

C:\Users\~~\ffmpeg>echo 22:28:30.52
22:28:30.52

C:\Users\~~\ffmpeg>ffmpeg -ss 00:10:00 -i in.mp4 -t 10 -r 10 -f image2 snap/test-0/out_%03d.jpg  1>nul

[中略]

C:\Users\~~\ffmpeg>echo 22:28:32.33
22:28:32.33

22:28:32.33 - 22:28:30.52 = 0:01.81

まとめ

-i オプションはできるだけ後ろに置いた方がいい。

自分が ffmpeg の立場だったら、入力を与えられてから10分のところまでシークするより、先に10分から読めと言われてから入力をもらった方が楽だもん。でも正直こんなに差が出るとは思わなかった。

今度から気をつけよう。以上備忘録でした。