雑記帳

整理しない情報集

更新情報

動画のアーカイブメモ(2025)

公開日:

カテゴリ: 雑記

ストレージの容量不足対策で、容量の大半を占める動画を減らすために再エンコードをしたので、設定値を残しておきます。

方針

  • 対象はH.264形式でエンコードされた動画
  • なるべく画質を維持
    • 不可逆圧縮でエンコードされた動画なので、劣化なしでの再エンコードは意味ないため諦める
  • 音声は再エンコードせずにそのまま

今回はそこそこ圧縮率の高いH.264形式の動画をさらに小さくするため、av1形式で再エンコードします。公式実装のlibaom-av1エンコーダでは時間がかかるのでlibsvtav1エンコーダを使います。 ffmpegのビルドオプションによっては含まれていない可能性があるので、ない場合は再ビルドが必要です。

なお多くの動画ファイルは2/3~1/10程度のサイズに再エンコードされますが、動画によっては必ずしもファイルサイズが小さくなるとは限りません。筆者の手持ちでは1.5倍に増えた動画もありました。小さくならないものは、わざわざ劣化させて大きいファイルを保管する意味は無いので元ファイルのまま保管します。

パラメータ

以下のコマンドでエンコーダのオプションを調べます。

ffmpeg -h encoder=libsvtav1 -hide_banner
Encoder libsvtav1 [SVT-AV1(Scalable Video Technology for AV1) encoder]:
    General capabilities: delay threads
    Threading capabilities: other
    Supported pixel formats: yuv420p yuv420p10le
libsvtav1 AVOptions:
  -preset            <int>        E..V....... Encoding preset (from -2 to 13) (default -2)
  -crf               <int>        E..V....... Constant Rate Factor value (from 0 to 63) (default 0)
  -qp                <int>        E..V....... Initial Quantizer level value (from 0 to 63) (default 0)
  -svtav1-params     <dictionary> E..V....... Set the SVT-AV1 configuration using a :-separated list of key=value parameters
  -dolbyvision       <boolean>    E..V....... Enable Dolby Vision RPU coding (default auto)
     auto                         E..V.......

-crf

画質は-crfで決めるようです。数値が大きいほど圧縮率が上がり、画質が下がります。とりあえず短めの動画をエンコードしてみて、特定のフレームを切り出してみます。切り出した画像はロスレス圧縮の画像のためファイルサイズが大きいので、画像へのリンクにしています。

30と35で試してみました。35にすると大幅にサイズが減りますが、強めの劣化が発生しています。30でも劣化が目に見えるレベルで発生していますが、これくらいは許容範囲とします。

サイズ
変換前685,975,528
-crf 30276,078,780
-crf 35176,971,211

-preset

-presetを指定することで圧縮効率を設定できます。値が小さいほどファイルサイズが小さくなる代わりにエンコード時間が長くなります。アーカイブ目的ではできるだけ小さい値を指定したいところですが、あまり小さい値を設定すると時間がかかって面倒になってきます・・・。

サイズ速度
変換前685,975,528-
指定なし276,078,780-
-preset 12295,344,0682.260
-preset 8254,914,1710.856
-preset 4226,484,4580.121

速度は動画のフレームレートに対する処理速度です。60FPSの動画で1秒あたり60フレームがエンコードされている場合は1.0になります。例えば60FPS・1分の動画で速度が2.0の場合のエンコード時間は30秒、速度が0.1の場合のエンコード時間は10分です。

プリセットの詳しい内容は公式ドキュメントに載っています。

再エンコード実行

ということで、以下のコマンドで再エンコードを実行します。

ffmpeg -i input.mp4 -c:v libsvtav1 -crf 30 -c:a copy -sn output.mkv

Windows環境でD&Dでエンコードする場合は以下のようなバッチファイルを用意します。

@echo off
ffmpeg -i %1 -c:v libsvtav1 -crf 30 -c:a copy -sn %~dpn1.mkv
pause >nul

Windows環境でフォルダ内の全ファイルをまとめて順番にエンコードする場合は以下のコマンドを実行します。

for %i in (*.MP4) do ffmpeg -i %i -c:v libsvtav1 -crf 30 -c:a copy -sn %~dpni.mkv

その他メモ

  • 字幕データが不要であれば-snオプションを付けることで削除できます
  • mkv形式のコンテナではExif情報を維持できないため、メディアの作成日時(creation time)等のデータを残したい場合は、テキストファイルに残すことになります
    ffmpeg -i input.mp4 -map_metadata 0 -map_metadata:s:v 0:s:v -map_metadata:s:a 0:s:a -f ffmetadata metadata.txt

カテゴリ: 雑記