ffmpegから使えるAV1ソフトウェアエンコーダにはAOM-AV1、SVT-AV1、rav1eがあり、このSVT-AV1は処理速度に特化していて保存用からライブ配信用までプリセットによる調整が可能。BlueSwordM氏の細部がぼやけるのを修正した派生版や、開発が現在盛んなgianni-rosato氏の派生版もある。こちらはハードコードされたパラメータを少し変えたり、実験的なオプションを追加したりしていて、公式の最新版にも追従している。

gitlabでは該当コミットのパイプラインのリンクに飛ぶとバイナリがダウンロードできる。

AV1ハードウェアエンコーダにはRTX 40シリーズのNVIDIA NVENC、RX 7000シリーズのAMD AMF、Intel Arc GraphicsのQuick Sync Videoなどがある。

基本コマンド

ffmpegのラッパーから使うコマンド。
Docs/Ffmpeg.md · master · Alliance for Open Media / SVT-AV1 · GitLab

出力コンテナには一般的な.mp4。字幕を入れた.mkv。画像形式の.avif、.ivf。.obuやなどが対応している。

品質指定。小数は使えない。既定値付近から-crfを1下げるごとに7%程度サイズが増える。アニメと実写では実写のほうがサイズが増えやすい。音声コーデックは適宜copyやビットレート(-b:a 128k)を指定する。
ffmpeg -i input -c:v libsvtav1 -crf 35 -preset 6 -c:a aac output.mp4

明るいシーンに-crfを上げて、暗いシーンに下げるとサイズと見た目をうまく両立できる。
Unexpectedly low result bit rate with SVT-AV1 : AV1

rc=1でVBRのビットレート指定。
ffmpeg -i input -c:v libsvtav1 -b:v 2000k -preset 6 -svtav1-params rc=1 -c:a aac output.mp4

rc=2でCBRのビットレート指定。
ffmpeg -i input -c:v libsvtav1 -b:v 2000k -preset 6 -svtav1-params rc=2 -c:a aac output.mp4

ビットレート指定するときにmbrから上限も指定できる。下限は指定できない。
ffmpeg -i input -c:v libsvtav1 -b:v 2000k -preset 6 -svtav1-params rc=1:mbr=3000 -c:a aac output.mp4

品質指定の上限ビットレート指定。いわゆるcapped CRF。
ffmpeg -i input -c:v libsvtav1 -crf 35 -preset 6 -svtav1-params rc=0:mbr=3000 -c:a aac output.mp4

keyintのキーフレーム指定は秒指定にsをつける。従来のフレーム単位-gでも指定できる。
ffmpeg -i input -c:v libsvtav1 -crf 35 -preset 6 -svtav1-params keyint=10s -c:a aac output.mp4
ffmpeg -i input -c:v libsvtav1 -crf 35 -preset 6 -g 240 -c:a aac output.mp4

品質を重視するなら8ビット深度の映像でも10ビット深度で出力する。適宜細部保持のパラメータを指定する。
ffmpeg -i input -c:v libsvtav1 -crf 28 -preset 4 -svtav1-params keyint=10s:enable-tf=0:enable-overlays=1:tune=0:film-grain=4:film-grain-denoise=0 -pix_fmt yuv420p10le -c:a aac output.mp4

画像からavifに変換する。色情報を正しく指定しないと色が変わるかもしれない。
ffmpeg -hide_banner -i input.gif -c:v libsvtav1 -crf 30 -preset 4 -pix_fmt yuv420p10le -svtav1-params tune=0 output.avif

Animated gif to visually lossless avif/av1 command line? : AV1
【ffmpeg】動画から特定フレームを画像で出力する方法 – 画像から動画を作る

2.3.0以降からlosslessが追加されたので、動画向けのmp4のほかにアニメーション画像のavifにも使える。ピクセルフォーマットは4:2:0の8、10ビット深度のみで4:4:4やRGBには対応していない。アニメーション画像のavifには動画から切り取ってフレームレートを減らした運用が考えられる。適宜tilefast-decodepresetを設定する。crfは指定しても影響がない。-g 1を指定するとオールイントラになる。

開始10秒から15秒までに、フレームレートを1/10に間引いた例。
ffmpeg -ss 10 -to 15 -i input -vf fps=source_fps/10 -c:v libsvtav1 -svtav1-params tile-columns=0:tile-rows=0:fast-decode=1:preset=6:lossless=1 -an output.avif

オプション

Docs/Parameters.md · master · Alliance for Open Media / SVT-AV1 · GitLab

libsvtav1

これらのオプションの他に-svtav1-params foo0=bar0:foo1=bar1形式で指定できる。

指定できる主なオプション
film-grainをつけたファイルをデコードするにはdav1dデコーダを使い入力オプションに-export_side_data film_grainをつけなければならない。
film-grainをつけたファイルをデコードするにはオプションは特につけなくてもよいが、film-grainを外してデコードするにはdav1dデコーダを使い入力オプションに-export_side_data film_grainをつけなければならない。

  • mbr
    最大ビットレート指定でCRFエンコードではcapped CRF(上限付きCRF)になる(単位はkbps)
  • mbr-overshoot-pct[int]
    capped CRFにのみ適用される。許容されるデータレートのオーバーシュート(最大)ターゲット(パーセンテージ)。レート制御によって変更される場合がある
    既定値:50
    範囲:0から100
  • aq-mode[int]
    適応的QPレベルの設定
    • 0:無効
    • 1:分散
    • 2:デルタ。既定値
  • tile-rows[int]
    使用するタイルの行数
    既定値:0
    範囲:0から6
  • tile-columns[int]
    使用するタイルの列数
    既定値:0
    範囲:0から4
  • fast-decode[boolean]
    品質を多少犠牲にしてデコード負荷を軽くする
    既定値:0
  • enable-tf[boolean]
    ALT-REF(一時的にフィルター処理された)フレームを有効にする。細部保持するなら無効にする
    既定値:1
  • enable-overlays[boolean]
    追加の参照フレームとして使用されるオーバーレイ画像の挿入を有効にする。細部保持するなら有効にする
    既定値:0
  • tune[int]
    チューニングメトリクスの指定
    • 0:VQ。目視評価で最適化する
    • 1:PSNR。既定値
    • 2:SSIM
  • film-grain[int]
    フィルムグレインを有効にする。1以上でグレインが増えて処理速度が落ちる。グレインを増やしてもファイルサイズにほとんど影響を与えないのでノイズの多い動画に効果的な反面、同じノイズを再現するわけではないので見た目が変わりやすい
    既定値:0
    範囲:0から50
  • film-grain-denoise[boolean]
    film-grainが有効のときにデノイズする。細部保持するなら無効にする
    既定値:1

設定の参考記事
AV1 detail loss vs x265 // SVT-AV1 v1.7.0 worse than v1.5.0? (huge details loss in moving scenes) : AV1

preset

数値を小さくするほど処理が遅く高品質になり、デコード負荷が上がる。
Docs/CommonQuestions.md · master · Alliance for Open Media / SVT-AV1 · GitLab

v2.3.0から12、13が11に併合して、7から11までが1下がる処理が追加されている。
v2.3.0 · Alliance for Open Media / SVT-AV1 · GitLab

  • 0は実験用
  • 1から3は処理時間より品質とサイズを優先
  • 4から6は処理時間と品質のバランスがよい
  • 7から11は処理時間を優先しリアルタイム処理向け
任意のキーフレーム指定

-svtav1-params enable-force-key-frames=1で任意指定のフラグを立て、-force_key_framesでフレームを指定し、keyint、または-gで最大キーフレーム間隔を指定する。開始フレームの0はキーフレームになるので-force_key_framesで指定しなくてもよい。

250フレームの動画に0と25に、25から125足した150にキーフレームを指定する。
ffmpeg -f lavfi -i color=d=10 -c:v libsvtav1 -crf 35 -g 125 -svtav1-params enable-force-key-frames=1 -force_key_frames "expr:eq(n,25)" forcekeyframes.mp4

-force_key_frames[string]
カンマ,区切りで任意の時間指定か、exprでの指定ができる。フレーム指定(0開始)ではexpreq()をフレーム毎に+でつなげて指定する。10秒よりキーフレーム指定が離れるときは指定したフレーム区間の中央にIフレームが自動で挿入される。それを回避するには最大のキーフレーム幅の-gを指定すると、そのフレーム数毎にIフレームが挿入される
例:-force_key_frames expr:eq(n,0)+eq(n,35)+eq(n,154)

デコード負荷を軽くする

Docs/CommonQuestions.md · master · Alliance for Open Media / SVT-AV1 · GitLab

  • fast-decodeを有効にする
  • ビットレートを下げる
  • tileの値を大きくする
  • フィルムグレインを使わない
  • presetの値を大きくする
  • 解像度を小さくする
  • 10ビット深度を使わない
フィルムグレイン合成

グレイン量とデノイズを行うかを指定する。film-grain-denoiseを有効にすると映像がぼやけるので細部を重視するならフィルムグレインを使うときでも無効にしたほうがよい。

  • 一般的な実写映像には8程度で十分
  • ノイズの多い映像には10から15
  • 標準的な手書きのアニメ映像は4程度が効果的
  • アニメ映像でノイズがあるなら10程度に上げる

ffmpeg -i input -c:v libsvtav1 -crf 35 -preset 6 -svtav1-params film-grain=4:film-grain-denoise=0 -c:a aac output.mp4

grav1synthはフィルムグレインをつけたり、外したり、テキストで内容を出力したり、差分内容を出力したりできる。

rust-av/grav1synth: Grain Synth analyzer and editor for AV1 files

film-grainをつけたファイルのvmafスコアを計算するには、エンコード結果それ自体を比較するためにdav1dデコーダに-export_side_data film_grainをつけてfilm-grainを無効化する。libaom-av1libdav1dの両方が含まれるときはlibdav1dが優先される。

VMAF and AV1’s film grain synthesis · Issue #1192 · Netflix/vmaf · GitHub

You are right that synthesized grain interferes with VMAF scores, and we recommend to disable it when computing VMAF.

Discard synthesized film grain for VMAF calculation · Issue #139 · alexheretic/ab-av1 · GitHub

色情報などのメタデータ

エンコーダオプションで指定する。
ffmpeg -i input -c:v libsvtav1 -crf 35 -preset 6 -svtav1-params color-primaries=1:transfer-characteristics=1:matrix-coefficients=1:color-range=0 -c:a aac output.mp4

SDR:color-primaries=1:transfer-characteristics=1:matrix-coefficients=1:color-range=0
HDR10:color-primaries=9:transfer-characteristics=16:matrix-coefficients=9:color-range=0
HLG:color-primaries=9:transfer-characteristics=18:matrix-coefficients=9:color-range=0

出力オプションで指定する。
ffmpeg -i input -c:v libsvtav1 -crf 35 -preset 6 -color_primaries bt709 -color_trc bt709 -colorspace bt709 -color_range tv -c:a aac output.mp4

ビットストリームフィルタで指定する。
ffmpeg -i input -c:v libsvtav1 -crf 35 -preset 6 -bsf:v av1_metadata=color_primaries=1:transfer_characteristics=1:matrix_coefficients=1:color_range=tv -c:a aac output.mp4

HDR

必要なメタデータをつけてエンコードする。適宜映像に合わせてcontent-lightを調整する。以下はHDR10の例。一般的にビットレートはSDRよりも高くする。

ffmpeg -i input -c:v libsvtav1 -crf 26 -preset 6 -svtav1-params "keyint=10s:enable-hdr=1:mastering-display=G(0.2649,0.6900)B(0.1500,0.0600)R(0.6800,0.3200)WP(0.3127,0.3290)L(1000.0,001):content-light=1000,400:color-primaries=9:transfer-characteristics=16:matrix-coefficients=9:color-range=0:chroma-sample-position=topleft" -pix_fmt yuv420p10le -c:a aac output.mp4

ヘッダを調べる

ビットストリームフィルタからヘッダを調べと、コーデックパラメータを調べられる。

ffmpeg -i video.mp4 -c:v copy -an -bsf:v trace_headers -frames:v 1 -f null - 2>dump.txt

Getting the correct HTML codecs parameter for an AV1 video – JakeArchibald.com

CPUの制御

無指定ではすべてのCPUを使用するが、逆にCPUを制御するにはaffinityを使う。最初の2スレッドを使うには2進数でスレッド管理を行い16進数の3を指定する。

ffmpeg | CPU制御方法

cmd /c start "" /affinity 3 ffmpeg 以下略

SvtAv1EncApp

Docs/svt-av1_encoder_user_guide.md · master · Alliance for Open Media / SVT-AV1 · GitLab

SvtAv1EncAppのオプション

ffmpegでy4mの無圧縮ファイルに展開する。
ffmpeg -i input output.y4m

y4mファイルを読み込み、ivfファイルに出力する。mp4コンテナには出力できない。
SvtAv1EncApp -i input.y4m -w 1920 -h 1080 --fps-num 24000 --fps-denom 1001 --crf 35 --preset 6 --keyint 240 -b output.ivf

ffmpegから標準出力する。入力ファイルから分かる内容のオプションは省略できる。
ffmpeg -i input -an -pix_fmt yuv420p -f yuv4mpegpipe - | SvtAv1EncApp -i - --crf 35 --preset 6 --keyint 240 -b output.ivf

10ビット深度で渡すには-strict unofficial(-1)をつける。
ffmpeg -i input -an -pix_fmt yuv420p10le -strict unofficial -f yuv4mpegpipe - | SvtAv1EncApp -i - --crf 35 --preset 6 --keyint 240 -b output.ivf

Docs/CommonQuestions.md · master · Alliance for Open Media / SVT-AV1 · GitLab

2passエンコード。ffmpegのlibsvtav1からは今のところできない。
SvtAv1EncApp -i input.y4m --crf 35 --preset 6 --keyint 240 --pass 1 --stats stat_file.stat
SvtAv1EncApp -i input.y4m --crf 35 --preset 6 --keyint 240 --pass 2 --stats stat_file.stat -b output.ivf

Docs/CommonQuestions.md · master · Alliance for Open Media / SVT-AV1 · GitLab

ivfからmp4にコンテナを入れ替える。
ffmpeg -i output.ivf -c copy output.mp4

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)