最近シャトレーゼが近所にできたのでちょっと嬉しい今日この頃ですが。
ここんとこ買い物、マッサージ、散髪以外どこにも出かけてないので書くネタがありません。ってことでまたPCネタ。
過去に撮影した動画などをffmpegでエンコードしてサイズを減らすなんてことがあるのですが、エンコード中にPCの動作が重くなるのが嫌なので自動的にffmpegの優先度を下げて動かせないかと考えました。ffmpegはコマンドラインオプションでスレッド数は指定できるのですが、PC触ってない時はCPUを使いきって欲しいのでスレッド数減らして動かすのは嫌なのです。優先度の指定はffmpegのコマンドラインオプションではできません。
起動するアプリを監視して優先度を変えてくれるツールも公開されてますけど、このためだけに入れたくはないのでバッチファイルだけでなんとかすることにしました。
ffmpegのエンコードはこういう中身のバッチファイルを使ってます。 (追記:最近はQSV使ってるのでこのコマンドオプションとはだいぶ違ってます)
このバッチファイルにエンコードしたいファイルをドラッグ・アンド・ドロップすればエンコードが開始されます。
cd /d %~dp1
ffmpeg.exe -i %1 -crf 25 -s 1280x720 -maxrate 2.5M -bufsize 3000k -codec:a copy "_%~n1.mp4"
実際はもうちょっと複雑で、複数のファイルを順番に処理できるバッチファイルにしてありますが。
本題から外れますけど、コマンドラインオプションの説明しときますと、 「-crf 25」は動画の品質レベルが25(個人的にはちょっと品質低めの25で十分なんですけど、標準の23にする人が多いかな)、「-s 1280×720」は出力を1280×720にリサイズ、 「-maxrate 2.5M -bufsize 3000k」は最大ビットレートを2.5Mbpsに制限(crfで画質指定してあるので無しでもいいかも)、「-codec:a copy」は音声はエンコード無しでそのまま、「_%~n1.mp4」は、入力ファイル名に頭にアンダーバー「_」を付けて出力。
本題に戻りまして、優先度を反映させるためのバッチファイルを作ります。名前はpriority.batとしました。中身はこんな感じ。
ping localhost -n 3
wmic process where name="ffmpeg.exe" call setpriority "idle"
exit
2行目のコマンドでffmpeg.exeの優先度が「低」に変わります。OS標準の機能なのでアプリなどを新たにインストールする必要はありません。
pingもOS標準のコマンドですが、これが最初の行に入っているのはffmpegが起動するのを待ってから優先度を反映させるための時間稼ぎです。 私の環境だと-n 1だと時間が足りないので余裕を見て-n 3にしてますが、-n 2でも大丈夫かも。
で、このバッチファイル、そのまま起動してもffmpegの優先度がうまく変えられません。管理者権限がないからなのですね。バッチファイルそのものには管理者権限が付けられないのでまずこのバッチファイルのショートカットを作ります。ショートカットだと管理者権限が付けられるのです。
作ったショートカットはprioritybat.lnkと言う名前に変えました。これを適当なフォルダ、今回の場合、C:\BAT\に置いておきます。で、このショートカットを管理者権限で動かすように設定を変えておきます。やり方はエクスプローラなどでこのショートカット上で右クリックしてから詳細設定を選ぶと「管理者として実行」にチェックが入れられます。
で、最初のバッチファイルは以下のように上のショートカットを先に起動するように書き換えます。
start C:\BAT\prioritybat.lnk
cd /d %~dp1
ffmpeg.exe -i %1 -crf 25 -s 1280x720 -maxrate 2.5M -bufsize 3000k -codec:a copy "_%~n1.mp4"
処理の手順としては、まず優先度変更バッチファイルを起動してffmpegが起動するのを待ち構えて、ffmpegが起動してから優先度変更コマンドが実行されることになります。これでffmpegが起動した直後に優先度を「低」にしてくれるようになりました。無事当初の目的を達成できました。当然ですけどffmpegに限らず他にも応用できますな。