みなさんこんにちは 日々やばい動画処理エンジンをつくっておりますがコマンドラインから動画処理ができるffmpegを使うことがかなりありまス
重い 処理させるので、CPU使用率100%でLoad Averageは常に1を超えてるとかそんな感じです
わたし:「lachesis (ホスト名) のLoad Average がぁっぁぁ」
lachesis:「マスター!」
そんな感じ にしても lachesis が馬名になってるなんて、そして、レディオスコーポレーションって・・・将来、馬主 になって、バッハトマコーポレーションとして、G Iで勝てる馬を買うんだ
「レディオスコーポレーションはボクが倒す」
この前はうっかり、連続処理をスケジュールした後、気づいたら Load Average が44とかになってました。4.4だったかもですが、いずれにせよ、ひどい。ラーメン屋 の行列に並ぶ感じでなかなかログインできなくなります
ひとりで来たのに
店員:「お次の4名でお待ちの方お先にテーブル席にどうぞー」
とか言われたときの、何とも言えない感じ で二度と来るかと思いつつ、翌日も並ぶわけです
本題
ffmpeg には使えるオプションがありすぎです。使いこなせば、AdobeのPremireとかいう動画処理ソフトも不要 なんだけど、オプションの使い方で、結果は同じなのに、処理速度 が全然違うことが良くあります
というわけで
高速になる事例をまとめます
役立つことがあるかわかりませんが、Load Averageと住まい は低い方がいいよねということで
動画を切り抜くときの -ss の場所
用途:例えば、動画の20分のところから、1分切り出したいときとか
ポイント:-i の前に -ss を書く
ffmpeg -ss 1200 -i input.mp4 -t 60 out.mp4
という感じがGood
-i より後に書くのは
ffmpeg -i input.mp4 -ss 1200 -t 60 out.mp4
-i より前に書くことで、ffmpegが該当箇所まで適当に読み込みをスキップします
再エンコード、再サンプリングが不要な場合のコーデック指定
用途:切り抜きとか、音はそのままとか、絵はそのままとか
ポイント:コーデック指定に copy で -c:v copy -c:a copy
ffmpeg は頑張り屋で、何でもやります でも、そのままでいい所は時間 の無駄
上の切り抜く場合だと
ffmpeg -ss 1200 -i input.mp4 -t 60 -c:v copy -c:a copy out.mp4
とすると速くなります(速くなるときがあります)
フレーム画像の抜き出し
↑にも書いたのですが、nフレーム毎に画像を抽出する処理をワンラインで書くと超遅いです
用途:30秒ごとに画像を抽出したいときとか
ポイント:ワンラインでできる(select)は使わず、1枚ごと別コマンドにする
遅い例:
ffmpeg -i input.mp4 -filter:v "select=not(mod(n\,1800)),setpts=N/(30*TB)" -qscale:v 2 -y thumbnail-%03d.png
速い例:
ffmpeg -ss 30 -i input.mp4 -r 1 -vframes 1 -f image2 thumbnail-001.png
ffmpeg -ss 90 -i input.mp4 -r 1 -vframes 1 -f image2 thumbnail-002.png
ffmpeg -ss 150 -i input.mp4 -r 1 -vframes 1 -f image2 thumbnail-003.png
随時更新予定
というわけで、 enjoy your ffmpeg life
おまけ
VPSでリセマラ
ソシャゲで初回ガチャで良い結果が出るまでリセットし続けるのがリセマラ
VPSで良いIPアドレスになるまで引き直すのもリセマラ