2021年6月25日金曜日

フォルダー内の動画ファイルをすべて H.265 で再エンコードする

常時撮影型のドライブレコーダーで旅の記録を残している方もいらっしゃるかと思いますが、Google Photo の無料枠が廃止されたこともあって、保存に頭を悩ませている方もいらっしゃるかと思います。

最近のドラレコは、HD はもはや当たり前、WQHD や 4K のものもどんどん増えていて、録画された動画のクオリティが向上する一方で、当然ながらファイルサイズもどんどん大きくなっています。この動画を、クオリティをそれほど下げずにサイズを縮小しよう……というのがこの記事の狙いです。

必要なもの

ffmpeg(パスの通ったところに配置してください。コマンド プロンプトの初期ディレクトリである %USERPROFILE% にコピーする形でも良いかと思います)
Windows 10

手順

  1. ドライブレコーダーが作成したファイルを C:\Drive_Recorder_Work\Source\ にコピーする
  2. 以下のバッチファイルを実行する
バッチファイルの実行が終了すると、C:\Drive_Recorder_Work\Output\ に再エンコードした動画ファイルが作成されている……筈です。

バッチファイル

※ 表示環境によっては、予期しない位置で改行されてしまう場合があります。
c:
mkdir "C:\Drive_Recorder_Work\" > nul 2>&1
mkdir "C:\Drive_Recorder_Work\Source\" > nul 2>&1
mkdir "C:\Drive_Recorder_Work\Output\" > nul 2>&1

cd "C:\Drive_Recorder_Work\Source"
for %%i in (*) do (
        ffmpeg -copyts -i "C:\Drive_Recorder_Work\Source\%%i" -c:v libx265 -r 18 "C:\Drive_Recorder_Work\Output\%%i" -n
)

ただ、これだとファイルの「作成日時」と「更新日時」が ffmpeg で再エンコードした日付になってしまいます。実害はないのですが、なんとなく元の日時に合わせたい……という場合は、以下の PowerShell スクリプトを実行すると良いです(あ、たぶん動くと思いますが、ものすごく汚いスクリプトなので、その点はご容赦ください)。

PowerShell スクリプト(change_timestamp.ps1)

※ 表示環境によっては、予期しない位置で改行されてしまう場合があります。
$location = Get-Location

$SourcePath = 'C:\Drive_Recorder_Work\Source'
$TargetPath = 'C:\Drive_Recorder_Work\Output'

Set-Location $SourcePath
$filelist = Get-ChildItem -Recurse | Select FullName, CreationTime, LastWriteTime

foreach( $item in $filelist )
        $FileName = $Item.FullName
        $FileName = $FileName.Replace( $SourcePath, $TargetPath )

        $CreationTime = $Item.CreationTime
        $LastWriteTime = $Item.LastWriteTime

        Write-Output $FileName

        Set-ItemProperty "$FileName" -name CreationTime -value $CreationTime
        Set-ItemProperty "$FileName" -name LastWriteTime -value $LastWriteTime
}

Set-Location $location

先程のバッチファイルの最後に、以下の行を追加しても良いかもですね。
※ 表示環境によっては、予期しない位置で改行されてしまう場合があります。
powershell -NoProfile -ExecutionPolicy Unrestricted C:\Users\username\change_timestamp.ps1


Blogger の小枝