PowerShell複数のAVIファイルをAviUtilで一度に読み込む為のスクリプト【AviSynth用】

PoweShell コンピュータ
PowerShell
ドライブレコーダで保存された複数の動画ファイル(AVI形式)を連結して編集する案件がありました。
無料の動画編集ソフトのAviUtilを使って簡単に済まそうかと思いますが、多量の動画ファイルを追加読み込みするのは骨が折れます。
AviUtlのお部屋

方法は色々ありそうですが、そのまた昔AviSynthというソフトで動画を連結して読み込むスクリプトを作成した記憶を思い出し、今でも使えるか調べてみました。
Avisynth rev. 2
Download Avisynth rev. 2 for free. Avisynth is a scripting language and a collection of filters for simple (and not so simple!) non-linear video editing tasks....

今でも使えそうです。
AviSynthは設定ファイル(拡張子AVS)を記述する必要がありますが、設定ファイルはテキストファイルですのでPowerShellで指定のディレクトリ内のAVIファイルを連結して読み込む設定ファイルを生成するスクリプトを作ってみました。

# 
# AviSynthで指定のフォルダ内のAVIファイルを連結して読み込むスクリプトを作成
# 
# $TargetDir...AVIファイルがあるディレクトリを指定
# 

param(
    [string]
    $TargetDir =  $env:USERPROFILE + "\Videos"
)

$ErrorActionPreference = "stop"

# avsの出力先のパスを生成
$basename = (Get-Item -LiteralPath $TargetDir).Name
$avspath = Join-Path $TargetDir ($basename + ".avs")

# ディレクトリ検索ループ
$text = ""
Get-ChildItem -LiteralPath $TargetDir -Filter "*.avi" | % {
    if ($text -ne "") {
        $text = $text + ","
    }
    $text = $text + '"' + $_.FullName + '"'
}
$text = "AVISource(" + $text + ")`r`nreturn last"
$text | Out-File $avspath -Encoding default

 

今回知ったこと

私の実行環境での話なのですが、Out-Fileのエンコーディングで文字コードを指定しないとUnicodeで出力されます。
AviSynthはUnicodeを受け付けてくれないので今回はShiftJISで出力するようにしています。
その指定方法はOut-Fileのオプションで-Encoding defaultと記述しています。

ふと思ったのですが何故defaultを指定する?defaultってなんだ?何故オプションを省略したエンコーディングとdefaultが異なる?と疑問はつきません。とはいえ個人的にスクリプトは動けば良いので詳しくは調べてはいません。

PowerShellは他言語の経験則が通用しない、なかなか手ごわいスクリプト言語だと感じました。

コメント