夜の間にエンコード完了…のはずが?
「寝ている間に動画のエンコードをさせておこう」
そう思って仕込んだコマンド、朝起きたら気持ちよく全部終わってる・・・はずが
1ファイルしか終わってない!
しかも今まさに2つ目が始まったところ!
なんで?なにしてたの?
今回はそんなやらかし話と備忘録。
前提:ffmpegはcaffeinate付きで実行していた
普段からスリープ対策として、以下のように .zshrc にエイリアス設定していました。
alias ffmpeg="caffeinate -i ffmpeg"
これで「ffmpeg実行中はスリープしないはず」だし、
実際、普段は問題なく動いていました。
寝てる間にフォルダ内の動画を一括エンコード
複数の動画ファイルがあって、ファイルサイズを抑えるためにそれらをエンコードしたかったのです。
でも裏でエンコードさせてると動作が重くなる。
かといってバックグラウンド処理だと遅々として進まない。それもストレス。
で、寝てる間に一括してエンコードさせておこうかと。
対象フォルダで新規にターミナルを開いて、以下を実行。
for f in *.mp4; do ffmpeg -i "$f" -c:v libsvtav1 -preset 6 -crf 26 -pix_fmt yuv420p10le -svtav1-params "tune=0" -c:a copy "${f%-*}.${f:e}"; done
やっていることはシンプルで
- フォルダ内の
.mp4を順番に処理 - AV1(libsvtav1)でエンコード
- 音声はコピー
そして「caffeinateがあるからスリープしないだろう」と、そのまま就寝。
起きて発覚:なぜか1本しか終わっていない
朝チェックすると…
- 1ファイルだけ完了
- Macはスリープから復帰した直後
- ちょうど次のエンコードが始まったところ
つまり、
途中でスリープして処理が止まっていた
なんで!?
原因:caffeinateが“途切れる瞬間”があった
ログなどを確認して分かったことは、
- 1つ目のエンコード終了後にスリープ条件が成立
ffmpegプロセス終了と同時にcaffeinateも終了- 次のループが始まるまでの“わずかな間”にスリープ突入
つまり、
「連続処理なのに、caffeinateは連続していなかった」
で、スリープから復帰後にジョブを再開、という感じ。
修正:ループ全体にcaffeinateをかける
対策として、コマンドを以下のように変更。
caffeinate -ims zsh -c 'for f in *.mp4; do ffmpeg -i "$f" -c:v libsvtav1 -preset 6 -crf 26 -pix_fmt yuv420p10le -svtav1-params "tune=0" -c:a copy "_${f%.*}.${f##*.}"; done'
caffeinateをループ全体に適用-imsでスリープ抑制を強化zsh -cでまとめて実行
これで「処理の隙間」がなくなり、for文全体にcaffeinateがかかっているため、無事に最後まで完走しました。
考えてみれば、まぁそうだよね。という話なのですが。
もう一つの対策法
システム設定 > 省エネルギー > ディスプレイがオフの時に自動でスリープさせない
を オン にする。
うん、シンプル(笑
まとめ
今回のポイントを一言でまとめると:
「caffeinateはコマンド単体には効くが、処理の流れ全体は守ってくれない」
“プロセスの切れ目”を意識していなかった、のが結果として盲点になっていました。
「朝起きたら全部終わってるはず」という期待が裏切られると地味にダメージ喰らうというか、脱力感。
特にエンコードみたいな時間かかる処理だと尚更ですね(苦笑
まぁ上にも書きましたが、スリープしないように設定しておけばなんという話でもないのですが、意外とこういう落とし穴あるよ〜という自戒も込めて。
てことで今回は以上!


コメント