AV1という動画圧縮フォーマットは、特許の問題があるせいでびっくりするほど普及しなかったh.265/HEVCに代わって、Web上で配信される動画を主として広まりつつあります。懸念点とされていたハードウェアデコーダーの欠如も、(HEVCを推進していたAppleの製品である)iPhone 15 Proに搭載されているA17 Proにデコーダーが搭載されるに至り、ほとんど気にしなくても良い段階にあるかと思います。
しかしながらそのAV1を用いた動画を作るためにはまだまだ難点が存在しています。この記事ではFFmpegというフリーソフトウェアを用いてAV1コーデックを用いた動画の作り方についてまとめていこうかと思います。
結論
- そこらのパソコンでもエンコードは全く不可能ではなくなってきている
- x64が使える環境でRAMに余裕があるならSVT-AV1がおすすめ
- SVT-AV1独特のパラメータは存在するのでドキュメントを読もう
FFmpegでAV1をエンコード
FFmpegを用いてAV1をエンコードするために搭載されているAV1エンコーダーは複数種類存在します。FFmpegのWikiには幸いなことに「AV1 Video Encoding Guide」というページがあり、どのようなエンコーダーを用いればいいのかについて有用な情報が掲載されています。
これを見るとFFmpegには以下のエンコーダーが含まれていることが分かります。
- libaom(
libaom-av1
) - rav1e(
librav1e
) - AMD AMF AV1(
av1_amf
) - SVT-AV1(
libsvtav1
)
このうち一番上のlibaomはAV1コーデックを開発しているAOMediaによるレファレンス実装です。レファレンス実装ならば安心かと思うかもしれませんが、エンコード速度に対する工夫が行われておらず、実用的とは言い難いものとなっています。
次のrav1eはOggやFLACの開発で知られているXiph.orgによるRust製のエンコーダーです。自称最速なエンコーダーで、確かにそれなりのスピードは出るのですが、未だにVersion 1に至っていないこと及び後ろの2つと比べると「控えめ」なことから一番に勧められるものではないかと思います。とはいえ限られた環境でAV1エンコードをするには最適な選択肢であるとは思います。
AMD AMF AV1は名前の通り、AMDが開発する「Advanced Media Framework」に搭載されているAV1エンコーダーをFFmpegから用いるために存在しています。AMD製のGPUをお持ちの方はこちらを検討されても良いかもしれません。
さてSVT-AV1についてです。これはIntelが開発しているScalable Video Technologyを活用したエンコーダーで、CPUを最適に用いることで高速化を図っているエンコーダーです。AV1のハードウェアエンコーダーが広まっていない現状を鑑みるとこれを活用するのが良いのではないかと思います。
SVT-AV1
SVT-AV1は先述の通りFFmpegで使用することが出来ます。libsvtav1のドキュメントを見ると、いくつかのパラメータに加えsvtav1-params
という変数が設定されており、これを通じてFFmpegからSVT-AV1に設定されているパラメータを設定することが出来ます。
意外かもしれませんが、FFmpegに直接設定されていない変数が意外と存在しており、これを用いることでより細かい設定を行うことが出来ます。SVT-AV1側にもFFmpeg側で用いる際の設定ガイドがありますので見てみるといい感じな設定を見ることが出来ます。
またこれに加えて個人的にはPSNRではなくVQを用いるマージが行われているのでtune=0
を、エンコード負荷の調整のためにtile_columns
及びtile_rows
をコア数に合わせて適度に設定するのが良いかと思います。例えば私は以下のようなコマンドをよく用いています。
ffmpeg -i input.mp4 -c:v libsvtav1 -preset 5 -svtav1-params tune=0:tile_columns=2:tile_rows=2 -c:a libopus -vbr on output.webm
あまりきちんとしていない説明ですが参考になれば嬉しいです。
最後に
前回のFFmpeg関係の記事: FFmpegで動画をアップコンバートしてちょっと綺麗にする
日本語で読める有用な情報が2020年~2021年頃の情報が多く、その後のアップデートが反映されていないものが多かったのでまとめてみました。必ずしも全ての状況に対応するものではありませんが、何かの役に立てば幸いです。