32blogby StudioMitsu
Archive13 min read

FFmpeg v8とSVT-AV1を極める:高画質・高効率エンコードの最適設定術

FFmpeg v8環境でのSVT-AV1エンコード設定を技術的に解説。Preset・CRF・Film Grain Synthesis・Lookaheadの内部ロジックと商用配信向けの最適設定を提示。

動画配信基盤における帯域コスト削減とユーザー体験向上の切り札として、AV1 コーデックの採用は不可避な選択だ。特にFFmpeg 7.x系以降(2025年時点の最新安定版)では、Vulkan ベースのフィルターパイプラインと libsvtav1(Scalable Video Technology for AV1)の統合が深化し、実用的なエンコード速度と圧倒的な圧縮効率の両立が可能となった。

本稿では、FFmpeg 7.x以降の環境における SVT-AV1 の挙動を技術的に解剖し、商用レベルの配信に耐えうる「高密度かつ堅牢なエンコード設定」を提示する。

FFmpeg 7.x以降 における SVT-AV1 の実装特性

FFmpeg 7.x系の大きな進歩のひとつは、Vulkan API によるハードウェアコンテキストの取り扱いが整備された点にある。SVT-AV1 自体は CPU ベースのソフトウェアエンコーダーだが、デコードやフィルタリング処理(スケーリング、トーンマッピング)を Vulkan 経由で GPU にオフロードすることで、CPU リソースを SVT-AV1 の演算に集中させることが可能になった。

注意: -init_hw_device vulkan=vk:0 を使用する Vulkan 処理は、Vulkan 対応の GPU とドライバーが必要だ。互換性のない環境では Failed to initialise Vulkan device などのエラーが発生する。Vulkan が利用できない場合は、このオプションを省略して CPU のみのパイプラインで実行すること。

この環境では、SVT-AV1 のボトルネックは「前処理」ではなく純粋な「エンコード演算」に集約されるため、Preset と CRF の選定がリソース効率に直結する。

実戦的エンコードコマンド:Production Ready

品質と効率を最大化するためのベースラインとなるコマンドだ。単純なコピー&ペーストではなく、各フラグの意図を理解して運用してほしい。

Windows (PowerShell) 用スクリプト:

powershell
# Windows PowerShell Script for FFmpeg v8 SVT-AV1
# 実行ポリシーでスクリプトがブロックされる場合は以下を実行:
# Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process

$InputFile = "input_master.mov"
$OutputFile = "output_av1.mkv"

ffmpeg -y -init_hw_device vulkan=vk:0 `
    -i "$InputFile" `
    -c:v libsvtav1 `
    -preset 6 `
    -crf 24 `
    -pix_fmt yuv420p10le `
    -svtav1-params "tune=0:enable-overlays=1:scd=1:scm=0:lookahead=120:keyint=240:film-grain=0" `
    -c:a copy `
    "$OutputFile"

macOS / Linux (Bash) 用スクリプト:

bash
#!/bin/bash

INPUT="input_master.mov"
OUTPUT="output_av1.mkv"

ffmpeg -y -init_hw_device vulkan=vk:0 \
    -i "$INPUT" \
    -c:v libsvtav1 \
    -preset 6 \
    -crf 24 \
    -pix_fmt yuv420p10le \
    -svtav1-params "tune=0:enable-overlays=1:scd=1:scm=0:lookahead=120:keyint=240:film-grain=0" \
    -c:a copy \
    "$OUTPUT"

パラメーターの内部ロジックと最適化

単なる推奨値の羅列ではなく、SVT-AV1 の内部アルゴリズムに基づいたパラメーター選定の論理を解説する。

1. Preset:パーティショニング決定の深さ

Preset 値は、エンコーダーが「どれだけ深く探索を行うか」を決定する。具体的には、ブロックパーティショニング(画像を分割して動きを予測する処理)の細かさと、動きベクトル探索の精度が変化する。

  • Preset 0–3(Research/Archival): 全探索に近い挙動。計算コストは指数関数的に増大するが、ビットレート削減効果は Preset 4 と比較して 5〜10% 程度にとどまる。商用配信では採算が合わないケースが大半。
  • Preset 4–6(VOD Production): 推奨レンジ。RDO(Rate-Distortion Optimization)が十分に機能し、複雑なテクスチャの保持とエンコード速度のバランスが最適化されている。
  • Preset 7–13(Real-time/Live): 高速化のために早期終了(Early Exit)の閾値が緩くなり、画質よりもスループットが優先される。

技術的トレードオフ: Preset を 6 から 4 に下げると、CPU 使用率は約 2 倍になる一方、同一 CRF 値でのファイルサイズは 5〜8% 削減される。帯域コストとコンピュートコストの損益分岐点を見極める必要がある。

2. CRF と Psycho-visual Tuning(tune=0)

AV1 の強みは、人間の視覚特性(HVS)を利用した圧縮にある。

  • -crf(Constant Rate Factor): x264/x265 の CRF とはスケールが異なる。SVT-AV1 の CRF 30 は、x265 の CRF 24 程度に相当する。高画質配信では 2026 の範囲がゴールデンゾーンだ。
  • tune パラメーター: tune=0 は視覚的なシャープネスとディテール保持を優先し、SSIM/VMAF スコアとの相関性が高い。tune=1 は PSNR(信号対雑音比)スコアを最大化しようとするが、数値上の正しさを優先するため視覚的な「ぼやけ」を許容する傾向がある。tune パラメーターでPSNR最適化(tune=1)またはVisual最適化(tune=0)を選択できる。

設定の結論: ユーザー体験(QoE)を指標とする場合、必ず tune=0 を指定し、数値スペックよりも「見た目の解像感」を優先すべきだ。

3. 10-bit Color Pipeline(-pix_fmt yuv420p10le)

入力ソースが 8-bit であっても、必ず 10-bit でエンコードすべきだ。

  • 内部ロジック: 8-bit ソースを 8-bit で圧縮すると、量子化プロセスでの丸め誤差により、空や壁などの平坦なグラデーション部分にバンディング(縞模様)が発生する。10-bit 空間で計算することで、この量子化ノイズをディザリングなしで大幅に抑制できる。
  • オーバーヘッド: SVT-AV1 のアーキテクチャは最新の SIMD 命令(AVX2/AVX-512)に最適化されており、10-bit 処理による速度低下は無視できるレベル(数% 以内)だ。

svtav1-params 詳細設定とマイクロチューニング

FFmpeg のオプション体系から溢れた、SVT-AV1 固有の制御パラメーターは -svtav1-params で直接渡す。

Lookahead とシーンチェンジ検出(scd)

  • lookahead=120: エンコーダーが処理中のフレームより先を「見る」フレーム数だ。これにより、ビットレート配分(Rate Control)が最適化され、複雑なシーンの直前に I フレームを配置するなどの先回りが可能になる。FPS の数倍(例: 5 秒分)確保するのが理想だ。
  • scd=1(Scene Change Detection): シーンの切り替わりを検出し、強制的にキーフレーム(I フレーム)を挿入する。これにより、シーン転換時のブロックノイズを防ぎ、シーク性能を向上させる。
  • scm=0(Screen Content Mode 無効): スクリーンコンテンツモードを無効にする設定だ。このモードはスクリーンキャプチャやゲーム映像向けの最適化を行うが、自然動画(実写映像)に対しては不要な処理となる。実写・映画コンテンツでは scm=0 を指定することで、余計なオーバーヘッドを排除できる。

Film Grain Synthesis(FGS)

AV1 の「魔法」とも言える機能だ。

  • film-grain=<value>: ノイズ(フィルムグレイン)を忠実にエンコードしようとすると、高周波成分として扱われ、大量のビットレートを消費する。FGS は、エンコード時にノイズを除去(デノイズ)し、そのノイズの「特徴パラメーター」だけをメタデータとして記録する。再生時にデコーダーがノイズを再合成する。
  • 運用: 実写映画やドラマでは film-grain=815 程度を設定することで、低ビットレートでも質感のある映像が得られる。アニメーションの場合は 0(無効)が基本だ。

Temporal Filtering(enable-tf)

  • enable-tf=0: デフォルトでは有効だが、極端な高画質を狙う場合は無効化(0)を検討する。有効にすると、時間軸方向のノイズを除去するためにフレーム間の平均化が行われるが、動きの速い細かいディテール(雨、紙吹雪など)が消失するリスクがある。ビットレートに余裕がある場合は 0 に設定し、ディテールを保存する。

トラブルシューティングと FAQ

エンコード速度が出ない

CPU のリソース配分と NUMA ノードを確認してほしい。SVT-AV1 はスレッド並列化に優れているが、コア数が多すぎる場合(64 コア以上など)、スレッド間の同期オーバーヘッドが発生する。FFmpeg の -threads オプション制限に加え、SVT 固有の logical_processors パラメーターでの制限、またはFFmpegインスタンスを複数立ち上げてチャンク分割エンコード(Chunked Encoding)を行う設計が有効だ。

特定のプレーヤーで再生できない

プロファイルと Tier を確認してほしい。profile=main は最も互換性が高いが、4:2:2 や 4:4:4 のクロマサブサンプリングを使用する場合は profile=professional が必要となり、ハードウェアデコーダーのサポート外になる可能性がある。コンシューマー向け配信では yuv420p10leprofile=main の組み合わせを厳守してほしい。

アニメ映像で線が滲む

tune=0 に加え、bias-pct の調整が必要だ。アニメーションなどのフラットな領域が多いコンテンツでは、心理視覚調整が強すぎると、エッジ周辺にリンギングが発生する。アニメ専用の設定として、tune=0 を維持しつつ、film-grain=0 を明示し、CRF を通常より 2〜3 下げて(品質を上げて)対応してほしい。


FFmpeg v8 と SVT-AV1 の組み合わせは、設定値一つで出力結果が劇的に変化する。上記の設定を「正解」として盲信するのではなく、これをベースライン(基準点)とし、配信するコンテンツ特性に合わせて Lookahead や Film Grain の微調整を行うことが、最も大切だ。

まとめ

SVT-AV1 エンコードの要点:

パラメーター推奨値理由
-preset6(VOD)/ 8–10(ライブ)RDO と速度のバランス
-crf20–26高画質配信のゴールデンゾーン
-pix_fmtyuv420p10leバンディング防止
tune0視覚的シャープネス優先
lookahead120ビットレート配分の最適化
scd1シーン転換時の品質保護
film-grain実写: 8–15 / アニメ: 0コンテンツに応じて選択

SVT-AV1 エンコードを加速させる推奨ハードウェア構成

本記事で紹介した FFmpeg v8 の Vulkan パイプラインと SVT-AV1 のパフォーマンスを最大化するには、ボトルネックを解消する適切なハードウェア選定が不可欠だ。

1. Intel Arc A380 / A750(コスパ重視)

  • 市場で最も安価に AV1 ハードウェアデコード・エンコード(QSV)環境を入手可能
  • Vulkan フィルター処理のオフロード用としても十分な性能
  • 対象: 自宅サーバーを安く構築したいエンジニア、省電力重視のユーザー

2. NVIDIA GeForce RTX 4060 Ti 以上(安定性重視)

  • Vulkan API のドライバ品質が最も高く、FFmpeg でのトラブルが最小限
  • デコードとフィルタリングを GPU 側で高速に処理し、CPU を SVT-AV1 の演算に集中させることができる
  • 対象: ゲームや編集作業とエンコードを 1 台で兼任させたいハイエンドユーザー

3. AMD Ryzen 9 7950X / 9950X(エンコード特化)

  • SVT-AV1 は CPU リソースをリニアに消費するため、物理コア数が重要
  • 16 コア 32 スレッドの並列処理能力により、Preset 4〜5 設定でも実用的な FPS を実現
  • 対象: 妥協のない最高画質を求める映像エンジニア、専用エンコードサーバー構築者