動画の色差サブサンプリングとビットレート:色滲み/ブロックノイズを抑える
テキストやUIを含む映像は、色差サブサンプリング(4:2:0)で色滲みが出やすく、過度な圧縮でブロックノイズも併発します。互換性を維持しつつ破綻させない鍵は、px解像度 × CRF/ビットレート × fpsのバランス設計です。
要点(TL;DR)
- 配信互換優先は yuv420p を基本。UIが主なら高ビットレート寄りに。
- 静的UIは fpsを控えめ にし、帯域を画質へ回す。
- サンプル視認で文字縁の滲み/ブロックを確認し微調整。
1. 色差サブサンプリングの基礎
- 4:4:4: 色差を間引かない。UI文字の滲みは最小だが互換/ビットレート面で重め。
- 4:2:2: 水平方向のみ半減。中間案だが配信互換性は限定的。
- 4:2:0: 縦横で1/4。配信のデファクト。UI文字で滲みやすいが設定で緩和可能。
UI/文字で滲む理由
クロマの解像度が低いほど、色の縁取りが“丸まる”現象が発生します。コントラストの高い小文字ほど目立ちます。
1.2 色空間・マトリクス・レンジの整合
- BT.709/sRGB 前提の UI では matrix=bt709 が基本。
- フルレンジ/リミテッドの齟齬に注意(黒浮き/白つぶれ)。
- AV1/VP9 でも 4:2:0 が配信のデフォルト。必要時のみ 4:4:4 を検討。
# H.264 で BT.709 リミテッドを明示
ffmpeg -i in.mp4 -vf "scale=in_range=tv:out_range=tv" -colorspace bt709 -color_primaries bt709 -color_trc bt709 \
-c:v libx264 -pix_fmt yuv420p -crf 22 out.mp4
2. エンコード設定の起点(H.264の例)
# UI/文字を含む短尺の例(互換重視)
ffmpeg -i in.mp4 -vf "scale=1280:-2:flags=lanczos,fps=30" -c:v libx264 -pix_fmt yuv420p -profile:v high -preset medium -crf 22 -tune ssim -movflags +faststart -c:a aac -b:a 128k out.mp4
# 目安: CRF 20–24(低いほど高画質/大容量)。文字が滲む時は CRFを下げる or 解像度↑
長尺や動きが多い場合は -crf
と合わせて -maxrate
/-bufsize
でビットレート上限を設定します。 UI主体なら fpsを15〜24 に抑え、その分の帯域を画質に回すのが有効です。
2.5 レート制御(CRF/CBR/2pass)の使い分け
- CRF: 品質一定・サイズ可変。UI/短尺の基準に最適。
- CBR: 帯域一定・品質可変。ライブ配信や制約帯域に。
- 2pass: サイズ固定で品質最適化。長尺の配信用に。
# 2pass の例(長尺/サイズ制約)
ffmpeg -y -i in.mp4 -c:v libx264 -b:v 1800k -pass 1 -an -f mp4 NUL
ffmpeg -i in.mp4 -c:v libx264 -b:v 1800k -pass 2 -c:a aac -b:a 128k out.mp4
3. アーティファクト診断(3点)
- 文字縁がにじむ → 解像度↑ or CRF↓(高画質)/fps↓(帯域を文字へ)
- エッジに階段/モスキート → スケーラを Lanczos/mitchell などへ変更
- 面の揺らぎ(ブロッキング) → CRF↓ or maxrate↑、動き予測系プリセットを1段重く
# 文字のにじみ対策: 解像度↑ or CRF↓ の比較サンプル生成
ffmpeg -i in.mp4 -vf "scale=1440:-2:flags=lanczos,fps=24" -c:v libx264 -crf 20 -pix_fmt yuv420p A.mp4
ffmpeg -i in.mp4 -vf "scale=1280:-2:flags=lanczos,fps=24" -c:v libx264 -crf 18 -pix_fmt yuv420p B.mp4
# 等倍比較で文字縁が読みやすい方を採用
3.6 UI/テキスト側の緩和テクニック
- 細い明度差の文字に薄いアウトラインを付与して滲みを抑制
- 強コントラスト境界は 1px ぼかしで段差を緩和
- 小サイズはウェイト調整や letter-spacing 微修正を検討
まずは映像側での対処
解像度↑/CRF↓/fps↓ の再配分が先。UI側は最終手段。
3.8 比較サンプル自動生成
# CRF と解像度の比較を一括出力
for crf in 18 20 22; do
ffmpeg -i in.mp4 -vf "scale=1280:-2:flags=lanczos,fps=24" -c:v libx264 -crf $crf -pix_fmt yuv420p A_$crf.mp4;
ffmpeg -i in.mp4 -vf "scale=1440:-2:flags=lanczos,fps=24" -c:v libx264 -crf $crf -pix_fmt yuv420p B_$crf.mp4;
done
4. 公開前チェック
- 主要ブラウザ/端末で再生互換(yuv420p)
- UI文字の縁が読める(にじみ許容内)
- fpsが内容に適切(静的UIで過剰に高くない)
- 最初のフレーム/LCPに影響しないポスター設計
- 色空間/マトリクス/レンジが想定と一致(bt709/TV など)
- 代表場面で文字の縁が可読(にじみ許容内)
4.2 計測プロトコル(簡易)
- VMAF/SSIM は写真向け指標。UIは差分拡大スクリーンショットで併用評価。
- 代表 3 シーン(テキスト/細線/写真混在)で比較。
- 合意が割れた箇所はラダー方式で再投票。
ffmpeg -i in.mp4 -i out.mp4 -lavfi ssim=ssim.log -f null -
# 小さな UI 差分は SSIM 数値だけで判断しない
FAQ
5. よくある誤解とFAQ
14:4:4にすれば全て解決?
文字の滲みは改善しますが、配信互換やビットレートが大幅に重くなります。要件次第。
2CRF を下げれば画質は単調に良くなる?
下げすぎるとビットレートが跳ね上がり、回線/バッファで再生が破綻。均衡点の探索が重要。
3文字をシャープにするフィルタは?
過度なシャープは逆効果(リンギング)。まず解像度・fps・CRFの配分で改善を。