動画のアーカイブメモ(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 30 | 276,078,780 |
-crf 35 | 176,971,211 |
-preset
-preset
を指定することで圧縮効率を設定できます。値が小さいほどファイルサイズが小さくなる代わりにエンコード時間が長くなります。アーカイブ目的ではできるだけ小さい値を指定したいところですが、あまり小さい値を設定すると時間がかかって面倒になってきます・・・。
サイズ | 速度 | |
---|---|---|
変換前 | 685,975,528 | - |
指定なし | 276,078,780 | - |
-preset 12 | 295,344,068 | 2.260 |
-preset 8 | 254,914,171 | 0.856 |
-preset 4 | 226,484,458 | 0.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
カテゴリ: 雑記