どうも、じゃぶじゃぶ(@jbjbgame)です。
前回、FFmpegの豊富な出力オプションを試して、動画の圧縮率を調べてみました。
今回は、本来やりたかった複数動画の一括エンコードをするために、Windowsバッチでプログラムを組みたいと思います。( ◜ᴗ◝)و
一括エンコードバッチ
サンプルソース
バッチはWindows10で動かすのでWindowsバッチ(*.bat)で作成します。
バッチのコンセプトとしては以下の通りです。
- コマンドを打たなくてもFFmpegが使用できる
- batファイルをクリックして使用
- バッチ処理の中でFFmpegを実行
- 複数の動画をバッチ一回の起動でエンコードする
- 特定のフォルダを指定してフォルダに含まれる動画を一括圧縮
Windowsバッチを今まで使ったことが無いため、粛々と勉強しながら試行錯誤です。
( ..)φメモメモ
取り合えず暫定版として、上記の必要最小限の機能を備えたバッチを作成しました!!
( ・` ◡・´)
ffmpeg-batch-encoding1.bat
@echo off rem *************************************** rem 処理名:[暫定版]動画一括圧縮処理 (FFmpeg) rem 作成日:2020/07/29 rem 更新日:2020/07/29 rem 作成者: じゃぶじゃぶ rem rem *************************************** rem 圧縮する対象があるフォルダを指定(デフォルト:C:\sample\) set INPUT_FOLDER= rem ---- 出力オプションの作成 ---- rem チェックフラグ set CHEK_FLAG=T set CURRENT_DIRECTORY=%CD% if ""%INPUT_FOLDER%"" == """" ( rem カレントディレクトリを設定 set INPUT_FOLDER=%CD% ) else ( rem ディレクトリの有無確認 IF NOT EXIST "%INPUT_FOLDER%" ( set CHEK_FLAG=F echo 圧縮対象のフォルダが存在しませんでした。(%INPUT_FOLDER%) ) ) rem ----圧縮対象のフォルダから動画ファイルを抽出 ---- rem 出力先のフォルダの存在チェック set OUTPUT_FOLDER=%INPUT_FOLDER%\comp\ set OUTPUT_FILE=%INPUT_FOLDER%\*.mp4 if %CHEK_FLAG%==T ( if not exist "%OUTPUT_FOLDER%" ( echo 出力先フォルダが存在しなかったため作成(%OUTPUT_FOLDER%) rem 出力先フォルダが存在しない場合は作成する mkdir %OUTPUT_FOLDER% ) setlocal enabledelayedexpansion rem 出力先のファイル一覧を取得 for /f "usebackq" %%i in (`dir %OUTPUT_FILE% /B`) do ( for /f "usebackq tokens=1 delims=." %%x in (`echo %%i`) do ( rem ffmpegによる圧縮処理を実行 rem 実行するコマンドをコンソールに出力 rem 時間のスペースを0に置換 set tmptime=!time: =0! echo ffmpeg -i %INPUT_FOLDER%\%%i %OUTPUT_FOLDER%%%x_mini_!date:~0,4!!date:~5,2!!date:~8,2!!tmptime:~0,2!!tmptime:~3,2!!tmptime:~6,2!.mp4 echo .... ffmpeg -i %INPUT_FOLDER%\%%i %OUTPUT_FOLDER%%%x_mini_!date:~0,4!!date:~5,2!!date:~8,2!!tmptime:~0,2!!tmptime:~3,2!!tmptime:~6,2!.mp4 echo %%iの動画圧縮処理が完了しました。(時刻:!date! !time!) echo ---------- ) ) endlocal echo 圧縮処理が全て正常に完了しました。 ) else ( echo オプションの指定に不備があったため、処理を中断しました。 ) rem ---- 初期化 ---- call :setting pause >nul rem ----------------------------- rem 環境変数の初期化処理 rem ----------------------------- :setting rem 初期化処理 set INPUT_FOLDER= set OUTPUT_FOLDER= set OUTPUT_FILE= set CHEK_FLAG= set CURRENT_DIRECTORY= exit /b 1
使い方 & 検証
どれだけ需要があるか分からないが、作成したバッチの使用手順をまとめておきます。
ある程度の動作検証をしていますが、すべてのバグをつぶしているわけでないので、使用する場合は自己責任でお願いします。m(_ _)m
0.準備
まずは使用する前の準備をします。
今回のバッチはFFmpegで動画の圧縮をすることを前提に作成しているので、まずはFFmpegをインストールしてください。
FFmpegのインストローラーをダウンロード後、インストールをしてから環境変数の設定を行ってください。
1.バッチファイルの作成
上記のサンプルソースからバッチファイルを作成してください。
Windowsバッチの作成にはメモなどのテキストエディアを起ち上げて、サンプルソースをコピー&ペーストして保存すれば完了です。
ただし以下の点に注意してください。
・サンプルソースのコピーの方法
上記ソースをコピーする際は、右上の「<>」マークをクリックしてからコピーしてください。
ソースコードのハイライトが消えて黒文字になるので、そうなったコードをコピーするようにしてください。これをしないとコードのスペースが消えてしまうので注意してください。
・拡張子は.bat
ファイルの拡張子は「.bat」で作成してください。ファイル名はなんでも構いません。
今回自分は「ffmpeg-batch-encoding1.bat」という名前を付けました。
2.作業用のフォルダを作成してバッチファイル配置
エンコードする作業フォルダを決めます。今回は「D:\ffmpeg\work」というフォルダを作成して、そのフォルダ上でエンコードすることにしました。
[補足]
バッチファイルをメモ帳で開いて10行目をみてください。
「set INPUT_FOLDER=」の後にフォルダのパスを指定するとそのフォルダが作業フォルダとなり、そのフォルダに含まれる動画ファイルがエンコード対象となります。
例えば「set INPUT_FOLDER=C:\ffmpeg\」と記載して保存すると「C:\ffmpeg\」の中にある動画ファイルをエンコードする感じです。何も指定しないと、バッチファイルを置いているフォルダが作業フォルダになります。
3.圧縮したい動画を作業フォルダに配置する
圧縮したい動画ファイルをまとめて「D:\ffmpeg\work」に移動してください。
※万が一、バッチが異常終了して動画が壊れる可能性もあります。必ず圧縮する動画ファイルはバックアップを取るようにしてください。
今回はディアブロ3のシーズン19で撮り貯めた動画、10ファイルを対象に圧縮をかけていきます。合計して296GBほど容量があります。
4.バッチを実行する
バッチの実行は簡単です。「ffmpeg-batch-encoding1.bat」をダブルクリックするだけです。
実行後は上図のような画面が表示され圧縮処理が開始されます。さらにcompフォルダが自動作成され、そこにエンコードされたファイルが置かれていきます。
無事バッチが正常に終了しました。╰(*´︶`*)╯
処理時間は9時間!?実行開始時間が深夜2時と遅めだったこともあり、終了は午前11時でした。
検証時のソースにバグがあり、作成されたファイル名の日付がすべて同じになってしまっていますが、概ね想定通りの動きをしてくれています。(※バグは修正済みです。)
エンコードによって296GBだった動画が32.6GBまで圧縮することに成功!!動画の劣化もそれほど気にならないのでこれは良いものができました。( ^^)/
※注意!
今回制作したバッチは入力値をもとに、最終的にFFmpegのコマンドを作成して実行しているだけなので、予期せぬところでスペースが入るとエラーになります。
例えばファイル名にスペースが入るパターンです。
・動画ファイル␣01.mp4 (動画ファイルと01の間にスペースがある)
このファイル名でバッチを実行すると、
・ffmpeg -i D:\sample\ffmpeg動画ファイル␣01.mp4 動画ファイル␣01-mini-yyyymmdd.mp4
上記のようなコマンドになり「D:\sample\ffmpeg動画ファイル」というファイル名で動画を探しに行ってしまい、結果対象ファイルが存在しないためエラーで終了します。
まとめ
今回FFmpegとWindowsバッチを使って動画の一括エンコードバッチを作成しました。
動作検証の結果、問題なく複数の動画を一括エンコードすることが出来、日常的に使うことができそうです。
寝る前に作業フォルダに動画を放り込んでおいて、朝起きたらエンコードが終わっている、という生活が可能になります。
( *´ސު`*)
しかし、まだ作成したバッチは暫定版です。FFmpegのオプションを指定することもできなければ、圧縮対象がmp4のみとなっているので、今後さらなる改良を加えていきたいです!!
[次の記事]