ffmpegから使えるAV1ソフトウェアエンコーダにはAOM-AV1、SVT-AV1、rav1eがあり、このSVT-AV1は処理速度に特化していて保存用からライブ配信用までプリセットによる調整が可能。BlueSwordM氏の細部がぼやけるのを修正した派生版や、開発が現在盛んなgianni-rosato氏の派生版もある。こちらはハードコードされたパラメータを少し変えたり、実験的なオプションを追加したりしていて、公式の最新版にも追従している。
gitlabでは該当コミットのパイプラインのリンクに飛ぶとバイナリがダウンロードできる。
- AOMediaCodec/av1-spec: AV1 Bitstream & Decoding Process Specification
- AV1 Image File Format (AVIF)
- AV1とは?開発に役立つ使い方、トレンド記事やtips – Qiita
- Alliance for Open Media / SVT-AV1 · GitLab
- Docs/Build-Guide.md · master · Alliance for Open Media / SVT-AV1 · GitLab
- Docs/CommonQuestions.md · master · Alliance for Open Media / SVT-AV1 · GitLab
- BlueSwordM/SVT-AV1: Welcome to the GitHub repo for the SVT-AV1! This repo is set to read-only for archiving purposes. Please join us at https://gitlab.com/AOMediaCodec/SVT-AV1. We look forward to seeing you there
- GitHub – gianni-rosato/svt-av1-psy: The Scalable Video Technology for AV1 (SVT-AV1 Encoder and Decoder) with perceptual enhancements for psychovisually optimal AV1 encoding
- GitHub – Nj0be/HandBrake-SVT-AV1-PSY
- FFmpeg Codecs Documentation : libsvtav1
- Encode/AV1 – FFmpeg
- SVT-AV1-PSY
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には動画から切り取ってフレームレートを減らした運用が考えられる。適宜tileやfast-decode、presetを設定する。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
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開始)ではexprでeq()をフレーム毎に+でつなげて指定する。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を有効にすると映像がぼやけるので細部を重視するならフィルムグレインを使うときでも無効にしたほうがよい。
- Docs/CommonQuestions.md · master · Alliance for Open Media / SVT-AV1 · GitLab
- How to Reduce the Destruction of Film Grain Via HandBrake? : AV1
- How much film grain synthesis is too much? : AV1
- 一般的な実写映像には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-av1とlibdav1dの両方が含まれるときは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
色情報などのメタデータ
- 色の情報の扱いについて
- ビットストリームフィルタのまとめ
- Docs/Parameters.md · master · Alliance for Open Media / SVT-AV1 · GitLab
エンコーダオプションで指定する。
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を指定する。
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