ffmpegでlibsvtav1エンコードをする【AV1】

ffmpeg
ffmpegでAV1のエンコードをしてみます。
libaom-av1 はとてつもなく遅いので使ってみようなどと思いませんでした。libsvtav1が使えるようになったので試してみます。かなり速くなりました。


個人的にはh.265でエンコードしたビデオは増えています。ですがh.265は特許の関係で全く普及していません。一番の問題はChromeがh.265の再生をサポートしていない事です。
自分のファイルを他所のクラウドへ上げるのは嫌、でもネットでお手軽ファイル保存は魅力的、という事で自宅クラウドを使うことが多いです。WSL2のおかげで実用的になってきました。
Nextcloudを使うとビデオファイルも手軽に見れて便利です。
ですが、Chromeを使っているとh.265なビデオファイルは再生できません。Chromeで見るにはh.264にしておくか、AV1にしなくてはなりません。
h.264は一番普及していて扱いやすいです。しかし今となっては圧縮率が悪くて自宅サーバーのHDD増強にお金がかかります。そこでh.265となるわけですが・・・

ブラウザでh.265を見る場合はEdgeを使えば解決します。Edgeはh.265の再生をサポートしています。もうほとんどChromeとEdgeは同じなのでEdgeをメインにしようかとも思うのですが、androidスマートフォンを使っているとEdgeではアプリの拡張機能が無かったりするので移行しづらいです。また、スマホのEdgeとChromeでは再生できず音声だけ聴こえます。
Chromeでh.265に相当する圧縮率と画質のビデオを見るにはAV1という形式を使うことになります。

しかし、AV1のエンコードソフトウエアはまだ開発途上のようです。実用的な速度でエンコードできるものはまだありません。ハードウエアデコードもやっと最新のビデオカードとWindowsの環境でできるようになったところです。ハードウエアエンコードは次の世代くらいでしょうか。

ffmpegでAV1エンコードをする

ffmpegでもAV1のエンコードが行えます。
去年はlibaomあるいはlibrav1eというライブラリでエンコードが行えました。しかし、エンコード速度は数fpsも出ない程度でした。一回試すだけで普段使うものではありません。
今年になるとSVT-AV1というライブラリが公開されました
AOMediaCodec/SVT-AV1 |GitHub
The Scalable Video Technology for AV1 (SVT-AV1 Encoder and Decoder) is an AV1-compliant encoder/decoder library core.
単体のエンコードコマンドを使うのでビデオフォーマットの変換をしないと使えなくて面倒でしたが、ffmpegのビルド時に組み込めるようになりました。ffmpegでのエンコーダ名はlibsvtav1です。
エンコード速度はだいぶ改善されました。

自分でffmpegをビルドするのが大変でしたが、最近は組み込まれたバイナリも公開されています。ライセンスは利用者の責任で確認してください。
BtbN/FFmpeg-Builds |GitHub
FFmpeg Static Auto-Builds
Static Windows Builds of ffmpeg master and latest release branch.
リリースのAssetsにバイナリがあります。自動ビルドなので毎日バイナリができています。日によっては大きなバグを含んでいる場合もあるでしょう。
ライセンスやライブラリの組込み方法の違いでいくつかのファイルがあります。ナイトリービルドだけではなく最新安定バージョンもあります。
この記事公開時、安定版バージョンにlibsvtav1は含まれていません。

ここではwin64-lgpl版を例に説明します。
ダウンロードして解答するとbinフォルダにFFmpegのバイナリがあります。ffmpeg.exeをお好きなフォルダへコピーします。以後、そのフォルダでffmpegを実行します。

まずlibsvtav1エンコーダがある事を確認します。
.\ffmpeg.exe -encoders | find "av1"
 V..... libaom-av1           libaom AV1 (codec av1)
 V..... librav1e             librav1e AV1 (codec av1)
 V..... libsvtav1            SVT-AV1(Scalable Video Technology for AV1) encoder (codec av1)
 A..... wmav1                Windows Media Audio 1
libsvtav1がある事を確認します。無かったら違うバイナリを探す必要があります。

オプションを確認します。
.\ffmpeg.exe -h encoder=libsvtav1
libsvtav1 AVOptions:
  -hielevel          <int>        E..V...... Hierarchical prediction levels setting (from 3 to 4) (default 4level)
     3level          3            E..V......
     4level          4            E..V......
  -la_depth          <int>        E..V...... Look ahead distance [0, 120] (from -1 to 120) (default -1)
  -preset            <int>        E..V...... Encoding preset [0, 8] (from 0 to 8) (default 8)
  -tier              <int>        E..V...... Set operating point tier (from 0 to 1) (default main)
     main            0            E..V......
     high            1            E..V......
  -rc                <int>        E..V...... Bit rate control mode (from 0 to 3) (default cqp)
     cqp             0            E..V...... Constant quantizer
     vbr             1            E..V...... Variable Bit Rate, use a target bitrate for the entire stream
     cvbr            2            E..V...... Constrained Variable Bit Rate, use a target bitrate for each GOP
  -qp                <int>        E..V...... Quantizer to use with cqp rate control mode (from 0 to 63) (default 50)
  -sc_detection      <boolean>    E..V...... Scene change detection (default false)
  -tile_columns      <int>        E..V...... Log2 of number of tile columns to use (from 0 to 4) (default 0)
  -tile_rows         <int>        E..V...... Log2 of number of tile rows to use (from 0 to 6) (default 0)
開発途上のライブラリなのでオプションが大きく変わる可能性があります。バイナリー毎に確認しましょう。
公式のドキュメントはここ
9.5 libsvtav1 | FFmpeg Codecs Documentation
SVT-AV1 encoder wrapper.
簡単にオプションを説明すると、
-qp
これで画質とファイルサイズが決まります。デフォルトは50です。私は解像度に依り30~45あたりを使うでしょうか。

-sc_detection
シーンチェンジ検出のオプションですが、この記事公開時は実装されていません。

オプションをいじる必要は無いでしょう。qpでお好みの品質を探すくらいです。
固定品質ではないのが残念です。

ビット深度を10ビットにするには
-pix_fmt yuv420p10
とします。

コマンドの例としては
.\ffmpeg.exe -i test.mkv -c copy -c:v libsvtav1 -qp 45 -map 0 -pix_fmt yuv420p10 -y out.mkv
という感じ。
libx265が固定品質、libsvtav1が固定量子化なのでファイルサイズをlibx265と同じくらいにすると画質は悪くなります。
エンコード時間はlibx265に比べて3倍くらいかかるでしょうか。Ryzen 7 3700Xを4.25GHzで動かして、1440x1080 のビデオが17fpsくらいの速度です。かろうじて使える速度にはなっています。

まだファイルサイズの圧縮には向かないので常用は厳しいです。どうしてもChromeで再生したい場合に使おうか考えますが、そんな事なんてほぼ無いですし、そんなレアケースならlibx264で十分でしょう。
ffmpegでそこそこの速度かつお手軽に使えるようになったのはうれしいです。
【2020/12/20追記
"-preset 5" くらいでエンコ速度数fpsで使える画質になるかな。遅い。】



コメント

最近のコメント

Threaded Recent Comments will be here.