Deep Sky Memories

横浜の空で撮影した星たちの思い出

Lagarith Lossless で動画を圧縮・展開するスクリプト

先日のエントリ「動画圧縮のトラブル、解決しました」の続きです。

結局古い動画はほぼ全部 Lagarith Lossless で圧縮して元動画を消しました。一部の気に入ってる写真の元動画については圧縮せずそのまま残しています。その際に使ったスクリプト(Windows バッチファイル)を一部記録も兼ねて公開します。

概要

あらかじめ VirtualDub からファイルに保存したエンコード設定を使ってコマンドラインVirtualDub (vdub.exe または vdub64.exe)でエンコードを実行します。

エンコード設定ファイル(.vdscript)も掲載しますが、codec のバージョンにより差異があるかもしれないので、掲載された設定をコピーするよりも実際に VirtualDub 上で設定を行って [File - Save Processing Settings...] で保存した設定ファイルを使用した方が無難だと思います。

注意

  • 以下に掲載するスクリプトの動作は無保証です。実行の結果生じたいかなる損害についても筆者は一切の責任を負いません。
  • スクリプトを複数のコマンドプロンプトから同時に並行して実行しないでください。一時ファイルの名前が衝突して正常に動かない場合があります。

動作環境

以下の環境で動作を確認しています。

対象となる動画形式

圧縮の対象となる動画は SharpCap で MONO8 または RAW8 で保存した avi です。展開した動画の形式はモノクロ8bitの avi になりますが、元がカラーカメラで撮影した RAW8 なら AutoStakkert!3 で自動的にカラー動画として認識されるようです。

圧縮スクリプト

カレントディレクトリ内の全ての avi ファイルを Lagarith Lossless でエンコードしてサブティレクトリ LAGS-AVI の下に保存するスクリプトです。元の avi ファイルは削除しません。

変数 VDUB と SETTINGS は実行環境に合わせて修正してから使用します。

lagarith-enc.bat:

@echo off
set VDUB=C:\VirtualDub-1.10.4-AMD64\vdub64.exe
set SETTINGS=F:\LagarithCompression.vdscript
set DSTDIR=LAGS-AVI

set TMPVDS=%TMP%\lagsenc-%RANDOM%.vdscript

mkdir "%DSTDIR%"
copy /Y "%SETTINGS%" "%TMPVDS%"

for %%f in (*.avi) do (
echo VirtualDub.Open^("%%f"^);
echo VirtualDub.SaveAVI^("%DSTDIR%\\%%f"^);
)>>%TMPVDS%

"%VDUB%" /s "%TMPVDS%"

変数 SETTINGS の LagarithCompression.vdscript というのは VirtualDub で保存した設定ファイルです。メインメニューの [Video - Compression...] で開いたダイアログから「Lagarith Lossless Codec」を選んで保存しました。

LagarithCompression.vdscript (VirtualDub 設定ファイル):

VirtualDub.audio.SetSource(0);
VirtualDub.audio.SetMode(0);
VirtualDub.audio.SetInterleave(1,500,1,0,0);
VirtualDub.audio.SetClipMode(1,1);
VirtualDub.audio.SetEditMode(1);
VirtualDub.audio.SetConversion(0,0,0,0,0);
VirtualDub.audio.SetVolume();
VirtualDub.audio.SetCompression();
VirtualDub.audio.EnableFilterGraph(0);
VirtualDub.video.SetInputFormat(0);
VirtualDub.video.SetOutputFormat(7);
VirtualDub.video.SetMode(3);
VirtualDub.video.SetSmartRendering(0);
VirtualDub.video.SetPreserveEmptyFrames(0);
VirtualDub.video.SetFrameRate2(0,0,1);
VirtualDub.video.SetIVTC(0, 0, 0, 0);
VirtualDub.video.SetCompression(0x7367616c,0,10000,0);
VirtualDub.video.SetCompData(1,"AA==");
VirtualDub.video.filters.Clear();
VirtualDub.audio.filters.Clear();

展開スクリプト

コマンドライン引数で指定した avi ファイル(ワイルドカード指定可)をモノクロ8bit形式の avi にエンコードしてカレントディレクトリに「元のファイル名-raw.avi」という名前で保存します。

lagarith-decode-file.bat:

@echo off
set VDUB=C:\Users\nanba\Downloads\VirtualDub-1.10.4-AMD64\vdub64.exe
set SETTINGS=F:\Caps\DecompressionGray.vdscript

if "%1" == "" (
  echo Usage: lagarith-decode-file.bat src.avi
  exit
)

set TMPVDS=%TMP%\lagsdec-%RANDOM%.vdscript
copy /Y "%SETTINGS%" "%TMPVDS%"

for %%f in (%1) do call :echo_commands %%f >>%TMPVDS%

"%VDUB%" /s "%TMPVDS%"

goto :END

:echo_commands
  set SRC=%1
  echo VirtualDub.Open^("%SRC:\=\\%"^);
  echo VirtualDub.SaveAVI^("%~n1-raw.avi"^);
  exit /b

:END

変数 SETTINGS の DecompressionGray.vdscript というのは VirtualDub で保存した設定ファイルです。メインメニューの [Video - Color Depth...] で開いたダイアログの右側の Output format to compressor/display の一覧から「Grayscale (0-255)」を選択して保存しました。

DecompressionGray.vdscript (VirtualDub 設定ファイル):

VirtualDub.audio.SetSource(0);
VirtualDub.audio.SetMode(0);
VirtualDub.audio.SetInterleave(1,500,1,0,0);
VirtualDub.audio.SetClipMode(1,1);
VirtualDub.audio.SetEditMode(1);
VirtualDub.audio.SetConversion(0,0,0,0,0);
VirtualDub.audio.SetVolume();
VirtualDub.audio.SetCompression();
VirtualDub.audio.EnableFilterGraph(0);
VirtualDub.video.SetInputFormat(0);
VirtualDub.video.SetOutputFormat(24);
VirtualDub.video.SetMode(3);
VirtualDub.video.SetSmartRendering(0);
VirtualDub.video.SetPreserveEmptyFrames(0);
VirtualDub.video.SetFrameRate2(0,0,1);
VirtualDub.video.SetIVTC(0, 0, 0, 0);
VirtualDub.video.SetCompression();
VirtualDub.video.filters.Clear();
VirtualDub.audio.filters.Clear();

備考

繰り返しますがあくまで無保証です。万一圧縮したファイルが元に戻せなくなっていても泣かないでください。いや、泣いてもいいけど僕に文句は言わないでください… (バグレポ自体は歓迎です)。

スクリプトでは環境変数 TMP のフォルダに一時ファイルを作成しています。一時ファイル名には念の為乱数を付加してはいますが、ファイルの存在チェックをしていないので複数のコマンドプロンプトからスクリプトを同時に起動するとファイル名が衝突する可能性があります。というか、一時ファイル消してないからほっとくといずれは衝突しますね。後で内容確認するため消さずにいたのそのままにしてました…

一時ファイルを作成せず vdub64.exe のコマンドラインオプションでファイルをエンコードする方法もあるのですが、うちの環境ではなぜか vdub64.exe の終了に数十秒待たされるという現象が発生して、vdub64.exe をループ内で繰り返し実行するのは非効率なのでやめました。これは32bit版の vdub.exe でも一緒でした。

圧縮率については「動画の圧縮どうしてます?」を参照してください。Lagarith はフレーム間圧縮のない可逆圧縮なので圧縮率はそれほどではありません。リスクをとって圧縮保存するかどうかは微妙なところかも。