その他

【暫定版】FFmpegとWindowsバッチを使って、複数の動画を一括エンコードするプログラミングを作成する

どうも、じゃぶじゃぶ(@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のみとなっているので、今後さらなる改良を加えていきたいです!!

[次の記事]

よく読まれている記事

1

どうも、じゃぶじゃぶ(@jbjbgame)です。 エルデンリング(ELDEN RING)では消費アイテムをクラフトすることが可能です。 今回はクラフトに必要な素材アイテムとレシピを一覧化してご紹介しま ...

2

どうも、じゃぶじゃぶ(@jbjbgame)です。 エルデンリング(ELDEN RING)では新たな回復手段として「霊薬の聖杯瓶」が存在します。緋色や青色聖杯瓶都とは別の第三の聖杯瓶です。 今回は霊薬の ...

3

どうも、じゃぶじゃぶ(@jbjbgame)です。 エルデンリング(ELDEN RING)には夜にしか姿を現さないボスがいます。「夜騎兵」もそのうちの一人です。 今回は「夜騎兵」の出現場所と攻略方法につ ...

4

どうも、じゃぶじゃぶ(@jbjbgame)です。 エルデンリング(ELDEN RING)ではステータスの振り直しが可能な「産まれ直し」ができます。 今回は、「産まれ直し」の解放方法をご紹介します。 こ ...

5

どうも、じゃぶじゃぶ(@jbjbgame)です。 エルデンリング(ELDEN RING)では特殊な装備を強化するのに喪色の鍛石を使用します。 喪色の鍛石【7】はなかなか見つけるのが難しいですが、中盤で ...

-その他

error: Content is protected !!